Spaces:
Sleeping
Sleeping
| 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 {} |