Skip to content

Commit e42fb44

Browse files
committed
add webworkers self-test to diagnose issue on gn-math
1 parent e14e955 commit e42fb44

2 files changed

Lines changed: 52 additions & 0 deletions

File tree

renderer/viewer/lib/mesher/mesher.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,10 @@ const handleMessage = data => {
144144

145145
break
146146
}
147+
case 'ping': {
148+
global.postMessage({ type: 'pong' })
149+
break
150+
}
147151
case 'getCustomBlockModel': {
148152
const pos = new Vec3(data.pos.x, data.pos.y, data.pos.z)
149153
const chunkKey = `${Math.floor(pos.x / 16) * 16},${Math.floor(pos.z / 16) * 16}`

src/index.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ import { saveToBrowserMemory } from './react/PauseScreen'
7777
import './devReload'
7878
import './water'
7979
import { ConnectOptions, getVersionAutoSelect, downloadOtherGameData, downloadAllMinecraftData, loadMinecraftData } from './connect'
80+
import { initMesherWorker } from 'renderer/viewer/lib/worldrendererCommon'
8081
import { ref, subscribe } from 'valtio'
8182
import { signInMessageState } from './react/SignInMessageProvider'
8283
import { findServerPassword, updateAuthenticatedAccountData, updateLoadedServerData, updateServerConnectionHistory } from './react/serversStorage'
@@ -161,6 +162,43 @@ function listenGlobalEvents () {
161162
})
162163
}
163164

165+
const testWebWorkerSetup = async () => {
166+
const TIMEOUT_MS = 5000
167+
const workerUrl = process.env.SINGLE_FILE_BUILD
168+
? '(embedded inline script)'
169+
: new URL('mesher.js', location.href).href
170+
const msgBase = `Minecraft Web Client can't work without WebWorkers, contact this site's administrator to fix it. `
171+
172+
await new Promise<void>((resolve, reject) => {
173+
let worker: ReturnType<typeof initMesherWorker> | undefined
174+
const timeout = setTimeout(() => {
175+
worker?.terminate()
176+
reject(new Error(msgBase + `Messaging to worker timed out after ${TIMEOUT_MS}ms. Worker URL: ${workerUrl}`))
177+
}, TIMEOUT_MS)
178+
179+
try {
180+
worker = initMesherWorker((data) => {
181+
const pong = Array.isArray(data) ? data.find((m: any) => m.type === 'pong') : data
182+
if (pong?.type === 'pong') {
183+
clearTimeout(timeout)
184+
worker!.terminate()
185+
resolve()
186+
}
187+
})
188+
worker.onerror = (e: ErrorEvent) => {
189+
clearTimeout(timeout)
190+
worker?.terminate()
191+
reject(new Error(msgBase + `Worker error: ${e.message}. Worker URL: ${workerUrl}`))
192+
}
193+
worker.postMessage({ type: 'ping' })
194+
} catch (err) {
195+
clearTimeout(timeout)
196+
worker?.terminate()
197+
reject(new Error(msgBase + `Worker creation failed: ${err}. Worker URL: ${workerUrl}`))
198+
}
199+
})
200+
}
201+
164202
export async function connect (connectOptions: ConnectOptions) {
165203
if (miscUiState.gameLoaded) return
166204

@@ -224,6 +262,16 @@ export async function connect (connectOptions: ConnectOptions) {
224262
const loggingInMsg = connectOptions.server ? 'Connecting to server' : 'Logging in'
225263
progress.beginStage('connect', loggingInMsg)
226264

265+
try {
266+
await testWebWorkerSetup()
267+
} catch (err) {
268+
miscUiState.hasErrors = true
269+
loadingTimerState.loading = false
270+
setLoadingScreenStatus((err as Error).message, true)
271+
progress.end()
272+
return
273+
}
274+
227275
let ended = false
228276
let bot!: typeof __type_bot
229277
const handleSessionEnd = (wasKicked = false) => {

0 commit comments

Comments
 (0)