import {OcctKernel} from 'occt-wasm'; import wasmUrl from 'occt-wasm/dist/occt-wasm.wasm?url'; import {prepareSlotReview} from '../../slot-review/index.mjs'; import {planClearanceSlots} from '../../slot-review/clearance-plan.mjs'; import type {SlotWorkMessage,SlotWorkResponse} from './slot-wire'; let consumed=false; self.onmessage=async(event:MessageEvent)=>{ if(consumed)return;consumed=true; let kernel:OcctKernel|undefined,response:SlotWorkResponse|undefined; const message=event.data; if(typeof message?.id!=='string'||!/^[-0-9a-f]{36}$/.test(message.id))return; try{ if(message.version!=='browser-slot-work-0.1'||!(message.bytes instanceof ArrayBuffer)||message.bytes.byteLength<1||message.bytes.byteLength>20*1024*1024||!['prepare','plan'].includes(message.kind)||Object.keys(message).sort().join(',')!=='bytes,id,kind,request,version')throw new Error('Invalid work envelope'); const owned=structuredClone(message); kernel=await OcctKernel.init({wasm:wasmUrl}); response=owned.kind==='prepare' ?{version:'browser-slot-result-0.1',id:owned.id,kind:'prepare',result:await prepareSlotReview(kernel,owned.bytes,owned.request)} :{version:'browser-slot-result-0.1',id:owned.id,kind:'plan',result:await planClearanceSlots(kernel,owned.bytes,owned.request)}; if(response.result.diagnostic==='cleanup_failed')throw new Error('Cleanup incomplete'); }catch{response={version:'browser-slot-error-0.1',id:message.id};} finally{try{kernel?.[Symbol.dispose]();}catch{response={version:'browser-slot-error-0.1',id:message.id};}} // The owned kernel is gone before the consumer receives any candidate. self.postMessage(response); };