Skip to content

Commit 91a8e44

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

File tree

3 files changed

+45
-18
lines changed

3 files changed

+45
-18
lines changed

docs/demo/wat2wasm/demo.js

Lines changed: 18 additions & 18 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,20 @@ function compile() {
124115
}
125116
}
126117

118+
let activeWorker = null;
127119
function run() {
120+
runEl.classList.add('disabled');
128121
jsLogEl.textContent = '';
129122
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);
137-
}
123+
const js = jsEditor.getValue();
124+
if (activeWorker != null) activeWorker.terminate();
125+
activeWorker = new Worker('./worker.js');
126+
activeWorker.addEventListener('message', function(event) {
127+
if (event.data.type !== 'log') return;
128+
jsLogEl.textContent += event.data.data;
129+
});
130+
activeWorker.postMessage({ binaryBuffer: binaryBuffer.buffer, js }, []);
131+
runEl.classList.remove('disabled');
138132
}
139133

140134
var onWatChange = debounce(compile, kCompileMinMS);
@@ -152,6 +146,10 @@ function onSelectChanged(e) {
152146
setExample(this.selectedIndex);
153147
}
154148

149+
function onRunClicked(e) {
150+
onJsChange();
151+
}
152+
155153
function onDownloadClicked(e) {
156154
// See https://developer.mozilla.com/en-US/docs/Web/API/MouseEvent
157155
var event = new MouseEvent('click', {
@@ -179,6 +177,7 @@ function onBase64Clicked(e) {
179177
watEditor.on('change', onWatChange);
180178
jsEditor.on('change', onJsChange);
181179
selectEl.addEventListener('change', onSelectChanged);
180+
runEl.addEventListener('click', onRunClicked);
182181
downloadEl.addEventListener('click', onDownloadClicked);
183182
buildLogEl.addEventListener('click', onBuildLogClicked );
184183
base64El.addEventListener('click', onBase64Clicked );
@@ -191,5 +190,6 @@ for (var i = 0; i < examples.length; ++i) {
191190
}
192191
selectEl.selectedIndex = 1;
193192
setExample(selectEl.selectedIndex);
193+
runEl.classList.remove('disabled');
194194

195195
});

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: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
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 = 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+
}

0 commit comments

Comments
 (0)