Skip to content

Commit b67fde0

Browse files
committed
feat(demo): Run js in worker in wat2wasm demo
1 parent a27b480 commit b67fde0

File tree

3 files changed

+64
-17
lines changed

3 files changed

+64
-17
lines changed

docs/demo/wat2wasm/demo.js

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ var outputEl = document.getElementById('output');
3333
var jsLogEl = document.getElementById('js_log');
3434
var selectEl = document.getElementById('select');
3535
var downloadEl = document.getElementById('download');
36+
var runEl = document.getElementById('run');
3637
var downloadLink = document.getElementById('downloadLink');
3738
var buildLogEl = document.getElementById('buildLog');
3839
var base64El = document.getElementById('base64');
@@ -49,16 +50,6 @@ for (const [f, v] of Object.entries(wabt.FEATURES)) {
4950
});
5051
}
5152

52-
var wasmInstance = null;
53-
54-
var wrappedConsole = Object.create(console);
55-
56-
wrappedConsole.log = (...args) => {
57-
let line = args.map(String).join('') + '\n';
58-
jsLogEl.textContent += line;
59-
console.log(...args);
60-
}
61-
6253
var watEditor = CodeMirror((elt) => {
6354
document.getElementById('top-left').appendChild(elt);
6455
}, {
@@ -124,17 +115,33 @@ function compile() {
124115
}
125116
}
126117

118+
let activeWorker = null;
127119
function run() {
120+
if (activeWorker != null) stop();
121+
runEl.textContent = 'Stop';
128122
jsLogEl.textContent = '';
129123
if (binaryBuffer === null) return;
130-
try {
131-
let wasm = new WebAssembly.Module(binaryBuffer);
132-
let js = jsEditor.getValue();
133-
let fn = new Function('wasmModule', 'console', js + '//# sourceURL=demo.js');
134-
fn(wasm, wrappedConsole);
135-
} catch (e) {
136-
jsLogEl.textContent += String(e);
124+
const js = jsEditor.getValue();
125+
activeWorker = new Worker('./worker.js');
126+
activeWorker.addEventListener('message', function(event) {
127+
switch (event.data.type) {
128+
case 'log':
129+
jsLogEl.textContent += event.data.data;
130+
break;
131+
case 'done':
132+
stop();
133+
break;
134+
}
135+
});
136+
activeWorker.postMessage({ binaryBuffer: binaryBuffer.buffer, js }, []);
137+
}
138+
139+
function stop() {
140+
if (activeWorker != null) {
141+
activeWorker.terminate();
142+
activeWorker = null;
137143
}
144+
runEl.textContent = 'Run';
138145
}
139146

140147
var onWatChange = debounce(compile, kCompileMinMS);
@@ -152,6 +159,14 @@ function onSelectChanged(e) {
152159
setExample(this.selectedIndex);
153160
}
154161

162+
function onRunClicked(e) {
163+
if (activeWorker != null) {
164+
stop();
165+
} else {
166+
onJsChange();
167+
}
168+
}
169+
155170
function onDownloadClicked(e) {
156171
// See https://developer.mozilla.com/en-US/docs/Web/API/MouseEvent
157172
var event = new MouseEvent('click', {
@@ -179,6 +194,7 @@ function onBase64Clicked(e) {
179194
watEditor.on('change', onWatChange);
180195
jsEditor.on('change', onJsChange);
181196
selectEl.addEventListener('change', onSelectChanged);
197+
runEl.addEventListener('click', onRunClicked);
182198
downloadEl.addEventListener('click', onDownloadClicked);
183199
buildLogEl.addEventListener('click', onBuildLogClicked );
184200
base64El.addEventListener('click', onBase64Clicked );
@@ -191,5 +207,6 @@ for (var i = 0; i < examples.length; ++i) {
191207
}
192208
selectEl.selectedIndex = 1;
193209
setExample(selectEl.selectedIndex);
210+
runEl.classList.remove('disabled');
194211

195212
});

docs/demo/wat2wasm/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ <h1>wat2wasm demo</h1>
6969
<div class="right">
7070
<label>example:</label>
7171
<select id="select" class="form-select"></select>
72+
<button class="btn disabled" type="button" id="run">Run</button>
7273
<button class="btn disabled" type="button" id="download">Download</button>
7374
<a id="downloadLink" download="test.wasm" class="hidden"></a>
7475
</div>

docs/demo/wat2wasm/worker.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
let wrappedConsole = Object.create(console);
2+
3+
wrappedConsole.log = (...args) => {
4+
const line = args.map(String).join('') + '\n';
5+
postMessage({
6+
type: "log",
7+
data: line
8+
});
9+
console.log(...args);
10+
}
11+
12+
self.onmessage = async function (event) {
13+
console.log("Running WebAssembly");
14+
const { binaryBuffer, js } = event.data;
15+
let wasm;
16+
try {
17+
wasm = new WebAssembly.Module(binaryBuffer);
18+
} catch (e) {
19+
postMessage({
20+
type: "log",
21+
data: String(e)
22+
});
23+
}
24+
const fn = new Function('wasmModule', 'console', js + '//# sourceURL=demo.js');
25+
fn(wasm, wrappedConsole);
26+
postMessage({
27+
type: "done"
28+
});
29+
}

0 commit comments

Comments
 (0)