-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsession.worker.js
More file actions
29 lines (29 loc) · 1.37 KB
/
Copy pathsession.worker.js
File metadata and controls
29 lines (29 loc) · 1.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import {loadModel,ModelSimulation} from './model.js'
let simulation,adapter,queue=Promise.resolve()
const emit=data=>self.postMessage({event:data})
self.onmessage=({data})=>{
// Control notifications must stay responsive during an adapter's paced rollout.
if(data.command){try{adapter?.command(data.command)}catch(error){emit({type:'error',error:String(error)})}return}
queue=queue.then(async()=>{
try{
let value
if(data.method==='load'){
if(simulation||adapter)throw Error('Session already loaded')
if(data.args.adapterUrl){
const module=await import(data.args.adapterUrl)
adapter=await module.createAdapter({config:data.args,emit,loadModel})
value=await adapter.describe()
}else{
const {mj,model}=await loadModel(data.args,message=>emit({type:'loading',message}))
simulation=new ModelSimulation(mj,model);value=simulation.describe()
}
}else{
const target=adapter||simulation
if(!target)throw Error('Load a model first')
if(!['reset','step','snapshot','describe'].includes(data.method)||typeof target[data.method]!=='function')throw Error(`Unsupported operation: ${data.method}`)
value=await target[data.method](data.args)
}
self.postMessage({id:data.id,value})
}catch(error){self.postMessage({id:data.id,error:error.stack||String(error)})}
})
}