summaryrefslogtreecommitdiffstats
path: root/site/robo.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'site/robo.mjs')
-rw-r--r--site/robo.mjs73
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);