@@ -77,6 +77,7 @@ import { saveToBrowserMemory } from './react/PauseScreen'
7777import './devReload'
7878import './water'
7979import { ConnectOptions , getVersionAutoSelect , downloadOtherGameData , downloadAllMinecraftData , loadMinecraftData } from './connect'
80+ import { initMesherWorker } from 'renderer/viewer/lib/worldrendererCommon'
8081import { ref , subscribe } from 'valtio'
8182import { signInMessageState } from './react/SignInMessageProvider'
8283import { 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+
164202export 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