Skip to content

Commit 6f84c82

Browse files
committed
feat: show error if fetching the tar fails
1 parent b2a2550 commit 6f84c82

File tree

4 files changed

+43
-20
lines changed

4 files changed

+43
-20
lines changed

packages/repl/src/lib/Bundler.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export default class Bundler {
2020
}: {
2121
packages_url: string;
2222
svelte_url: string;
23-
onstatus: (val: string | null) => void;
23+
onstatus: (val: string | null, kind?: 'status' | 'error') => void;
2424
}) {
2525
this.hash = `${packages_url}:${svelte_url}`;
2626

@@ -39,8 +39,8 @@ export default class Bundler {
3939

4040
if (handler) {
4141
// if no handler, was meant for a different REPL
42-
if (event.data.type === 'status') {
43-
onstatus(event.data.message);
42+
if (event.data.type === 'status' || event.data.type === 'error') {
43+
onstatus(event.data.message, event.data.type);
4444
return;
4545
}
4646

packages/repl/src/lib/Repl.svelte

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,14 +116,15 @@
116116
let width = $state(0);
117117
let show_output = $state(false);
118118
let status: string | null = $state(null);
119+
let runtime_error: Error | null = $state(null);
119120
let status_visible = $state(false);
120121
let status_timeout: NodeJS.Timeout | undefined = undefined;
121122
122123
const bundler = BROWSER
123124
? new Bundler({
124125
packages_url: packagesUrl,
125126
svelte_url: svelteUrl,
126-
onstatus: (message) => {
127+
onstatus: (message, kind) => {
127128
if (message) {
128129
// show bundler status, but only after time has elapsed, to
129130
// prevent the banner flickering
@@ -137,8 +138,11 @@
137138
status_visible = false;
138139
status_timeout = undefined;
139140
}
140-
141-
status = message;
141+
if (kind === 'status') {
142+
status = message;
143+
} else {
144+
runtime_error = new Error(message);
145+
}
142146
}
143147
})
144148
: null;
@@ -192,6 +196,7 @@
192196
{injectedCSS}
193197
{previewTheme}
194198
{workspace}
199+
runtimeError={status_visible ? runtime_error : null}
195200
/>
196201
</section>
197202
</SplitPane>

packages/repl/src/lib/workers/bundler/index.ts

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,10 @@ let version: string;
2828
let current_id: number;
2929

3030
let fulfil_ready: (arg?: never) => void;
31-
const ready = new Promise((f) => {
31+
let reject_ready: (arg?: Error) => void;
32+
const ready = new Promise((f, r) => {
3233
fulfil_ready = f;
34+
reject_ready = r;
3335
});
3436

3537
let files: Map<string, () => string>;
@@ -49,18 +51,26 @@ self.addEventListener('message', async (event: MessageEvent<BundleMessageData>)
4951
const ref = starts_with_pr
5052
? svelte_url.substring('pr-'.length)
5153
: svelte_url.substring('commit-'.length);
52-
53-
const maybe_tar = await fetch(`https://pkg.pr.new/svelte@${ref}`);
54-
if (maybe_tar.headers.get('content-type') === 'application/tar+gzip') {
55-
const buffer = await maybe_tar.arrayBuffer();
56-
local_files = await parseTar(buffer);
57-
files = new Map(
58-
local_files.map((file) => [file.name.substring('package'.length), () => file.text])
59-
);
60-
const package_json_content = files.get('/package.json')?.();
61-
if (package_json_content) {
62-
package_json = JSON.parse(package_json_content);
54+
try {
55+
const maybe_tar = await fetch(`https://pkg.pr.new/svelte@${ref}`);
56+
if (!maybe_tar.ok)
57+
throw new Error(
58+
`impossible to fetch the compiler from this ${starts_with_pr ? 'PR' : 'commit'}`
59+
);
60+
if (maybe_tar.headers.get('content-type') === 'application/tar+gzip') {
61+
const buffer = await maybe_tar.arrayBuffer();
62+
local_files = await parseTar(buffer);
63+
files = new Map(
64+
local_files.map((file) => [file.name.substring('package'.length), () => file.text])
65+
);
66+
const package_json_content = files.get('/package.json')?.();
67+
if (package_json_content) {
68+
package_json = JSON.parse(package_json_content);
69+
}
6370
}
71+
} catch (e) {
72+
reject_ready(e);
73+
return;
6474
}
6575
}
6676
({ version } =
@@ -91,7 +101,15 @@ self.addEventListener('message', async (event: MessageEvent<BundleMessageData>)
91101
}
92102

93103
case 'bundle': {
94-
await ready;
104+
try {
105+
await ready;
106+
} catch (e) {
107+
self.postMessage({
108+
type: 'error',
109+
uid: event.data.uid,
110+
message: `Error loading the compiler: ${e.message}`
111+
});
112+
}
95113
const { uid, files, options } = event.data;
96114

97115
if (files.length === 0) return;

packages/repl/src/lib/workers/workers.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export interface MigrateOutput {
5050

5151
export type BundleMessageData = {
5252
uid: number;
53-
type: 'init' | 'bundle' | 'status';
53+
type: 'init' | 'bundle' | 'status' | 'error';
5454
message: string;
5555
packages_url: string;
5656
svelte_url: string;

0 commit comments

Comments
 (0)