diff options
| author | Brian Cully <bjc@spork.org> | 2025-12-17 11:03:17 -0500 |
|---|---|---|
| committer | Brian Cully <bjc@spork.org> | 2025-12-17 11:03:17 -0500 |
| commit | 3d0d63ede8e267b320c672c248c9e731b0ed95c2 (patch) | |
| tree | c52d9881a852bb0adf5dc743202f7eb30d8f87b1 /site/robo.mjs | |
| parent | 279c30f656cbf31ce1386d093a061a8c8ae0fe68 (diff) | |
| download | automathon-3d0d63ede8e267b320c672c248c9e731b0ed95c2.tar.gz automathon-3d0d63ede8e267b320c672c248c9e731b0ed95c2.zip | |
js: move robo state to worker
Diffstat (limited to 'site/robo.mjs')
| -rw-r--r-- | site/robo.mjs | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/site/robo.mjs b/site/robo.mjs new file mode 100644 index 0000000..e6db244 --- /dev/null +++ b/site/robo.mjs @@ -0,0 +1,73 @@ +import init, { make_vm } from './wasm/automathon.js'; + +let vm; + +function vmData(vm) { + const wordlist = vm.wordlist().map(bc => { + let res = []; + for (let i = 0; i < bc.len(); i++) { + res.push(bc.at(i)) + } + return res; + }); + const callstack = vm.callstack().map(e => { return { word: e.word, offset: e.offset }; }); + const vars = Object.fromEntries(['out', 'heading', 'speed', 'doppler'].map(name => [name, vm[name]()])); + const ip = {word: vm.ip().word, offset: vm.ip().offset}; + const annos = vm.annotations().map(word_annos => { + let res = []; + for (let i = 0; i < word_annos.len(); i++) { + const anno = word_annos.at(i); + res.push({ start: anno.start, end: anno.end }) + } + return res; + }); + return { + wordlist, + stack: vm.stack(), + callstack, + vars, + ip, + annos, + } +} + +function compile(text) { + const start = performance.now(); + const res = vm.compile(text); + const end = performance.now(); + console.info(`compile took ${end-start} ms`); + postMessage({ kind: 'compile', res, vm: vmData(vm) }); +} + +function tick() { + if (!vm.tick()) { + vm.reset_ip(); + } + postMessage({ kind: 'tick', vm: vmData(vm) }); +} + +let mod; +async function messageHandler(e) { + if (mod === undefined) { + console.debug('worker running init'); + mod = await init(); + console.debug('worker init done'); + vm = make_vm(); + console.debug('worker vm made'); + } + const { kind } = e.data; + switch (kind) { + case 'compile': + compile(e.data.text); + break; + case 'tick': + tick(); + break; + default: + console.error('invalid message to robo worker', e.data); + postMessage({ kind: 'error', error: 'badmsg' }); + } +} + +console.debug('loading robo worker'); +addEventListener('message', messageHandler); |
