LInKAlphabetDemo / static /csgworker.js
ahnobari
init
460c05d
raw
history blame
No virus
2.16 kB
import {CSG} from "./csglib.js"
let gWorkersStarted = false;
let gWorker;
let gWorkerUrl;
let taskId = 0;
let tasks={}
let spawnWorker=()=>{
const worker = new Worker(gWorkerUrl)
worker.onmessage = function(e) {
let rslt = JSON.parse(e.data)
let task = tasks[rslt.taskId]
delete tasks[rslt.taskId]
task.resolve(CSG.fromJSON(rslt.result))
//console.log('Message received from worker');
gWorker.busy = false;
}
return gWorker = {worker,busy:false};
}
let getWorker=()=>{
if(!gWorkersStarted){
gWorkersStarted = true;
return fetch('../csg-lib.js').then(function(response) {
return response.text().then(function(text) {
text = text.slice(0, text.lastIndexOf('export'));
const code = text + `
self.onmessage=(message)=>{
let task = JSON.parse(message.data)
//console.log("Got task:"+task.op+' '+task.taskId)
postMessage(JSON.stringify({
taskId:task.taskId,
result : CSG.fromJSON(task.a)[task.op](CSG.fromJSON(task.b))
}))
}
console.log('CSG worker started!')`
const blob = new Blob([code],{
type: 'application/javascript'
})
gWorkerUrl = URL.createObjectURL(blob);
}).then(()=>{
return spawnWorker()
})
});
}
if(gWorker && (!gWorker.busy)){
gWorker.busy = true;
return {then:(fn)=>{return fn(gWorker);}}
}
return{
then:function(){return this}
}
}
CSG.doAsync=(a,op,b)=>{
return getWorker().then((worker)=>{
let task={a,op,b,taskId}
tasks[taskId]=task;
taskId++;
task.result = new Promise((resolve,reject)=>{
task.resolve = resolve;
//console.log("posting to worker:")
worker.busy = true;
worker.worker.postMessage(JSON.stringify(task))
})
return task.result
})
}
export default {}