Show the crash overlay when the Go loader fails to load
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
127f53d5f5
commit
b34562333b
2 files changed
+16
-5
No files matched your search
+6
-5
@@ -1,10 +1,5 @@
|
|||||||
// Streams the wasm, runs Go, shows crashes.
|
// Streams the wasm, runs Go, shows crashes.
|
||||||
const stderr = []
|
const stderr = []
|
||||||
const write = globalThis.fs.writeSync.bind(globalThis.fs)
|
|
||||||
globalThis.fs.writeSync = (fd, buf) => {
|
|
||||||
if (fd === 2) stderr.push(new TextDecoder().decode(buf))
|
|
||||||
return write(fd, buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
function crash (msg) {
|
function crash (msg) {
|
||||||
const why = [msg, stderr.join('').slice(-4000)].filter(Boolean).join('\n\n')
|
const why = [msg, stderr.join('').slice(-4000)].filter(Boolean).join('\n\n')
|
||||||
@@ -15,6 +10,12 @@ function crash (msg) {
|
|||||||
document.getElementById('reload').onclick = () => location.reload()
|
document.getElementById('reload').onclick = () => location.reload()
|
||||||
|
|
||||||
async function load () {
|
async function load () {
|
||||||
|
if (!globalThis.Go || !globalThis.fs) throw new Error('wasm_exec.js did not load.')
|
||||||
|
const write = globalThis.fs.writeSync.bind(globalThis.fs)
|
||||||
|
globalThis.fs.writeSync = (fd, buf) => {
|
||||||
|
if (fd === 2) stderr.push(new TextDecoder().decode(buf))
|
||||||
|
return write(fd, buf)
|
||||||
|
}
|
||||||
const t0 = performance.now()
|
const t0 = performance.now()
|
||||||
const res = await fetch('__WASM__')
|
const res = await fetch('__WASM__')
|
||||||
if (!res.ok) throw new Error(`${res.url}: HTTP ${res.status}`)
|
if (!res.ok) throw new Error(`${res.url}: HTTP ${res.status}`)
|
||||||
|
|||||||
@@ -11,10 +11,20 @@ test.beforeEach(async ({ page }) => {
|
|||||||
page.on('pageerror', e => seen.push(e.message))
|
page.on('pageerror', e => seen.push(e.message))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Every page ends free of errors, unless it expects them.
|
||||||
test.afterEach(async ({ page }) => {
|
test.afterEach(async ({ page }) => {
|
||||||
|
if (test.info().annotations.some(a => a.type === 'expects errors')) return
|
||||||
expect(pageErrors.get(page)).toEqual([])
|
expect(pageErrors.get(page)).toEqual([])
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('a missing loader shows the crash overlay', async ({ page }) => {
|
||||||
|
test.info().annotations.push({ type: 'expects errors' })
|
||||||
|
await page.route('**/a/wasm_exec.*.js', route => route.abort())
|
||||||
|
await page.goto('/')
|
||||||
|
await expect(page.locator('#over')).toBeVisible()
|
||||||
|
await expect(page.locator('#why')).toContainText('wasm_exec.js did not load.')
|
||||||
|
})
|
||||||
|
|
||||||
async function open (page, hash = '') {
|
async function open (page, hash = '') {
|
||||||
await page.goto('/' + hash)
|
await page.goto('/' + hash)
|
||||||
await page.waitForFunction(() => window.__crychicBoot)
|
await page.waitForFunction(() => window.__crychicBoot)
|
||||||
|
|||||||
Reference in new issue
Block a user