Skip to content

Commit c8cdc7c

Browse files
committed
fix: fallback if wasm module failed to load
1 parent 83e596a commit c8cdc7c

2 files changed

Lines changed: 34 additions & 24 deletions

File tree

web/js/main.mjs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// This file contains code adapted from https://github.com/TecharoHQ/anubis under the MIT License.
22

3-
import pow, { supportsWasm } from "./pow.mjs";
3+
import pow from "./pow.mjs";
44
import Messages from "@messageformat/runtime/messages"
55
import msgData from "./icu/compiled.mjs"
66
import mascotPass from "../img/mascot-pass.png"
@@ -111,8 +111,6 @@ const main = async () => {
111111
ui.progressMessage('');
112112
ui.progress(0);
113113

114-
if (!supportsWasm()) ui.message(t('challenge.wasm_unavailable'));
115-
116114
const t0 = Date.now();
117115
let lastUpdate = 0;
118116

@@ -139,9 +137,13 @@ const main = async () => {
139137
const speed = totalIters / delta;
140138
ui.progress(distance);
141139
ui.metrics(t('challenge.difficulty_speed', { difficulty, speed: speed.toFixed(3) }));
142-
ui.progressMessage(probability < 0.01 ? t('challenge.taking_longer') : noWasm ? t('challenge.wasm_unavailable') : undefined);
140+
if (probability < 0.01) {
141+
ui.progressMessage(t('challenge.taking_longer'));
142+
}
143143
lastUpdate = delta;
144144
};
145+
}, () => {
146+
ui.progressMessage(t('challenge.wasm_unavailable'));
145147
});
146148
const t1 = Date.now();
147149

@@ -160,4 +162,4 @@ const main = async () => {
160162

161163
};
162164

163-
main().catch(handleError);
165+
main().catch(handleError);

web/js/pow.mjs

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ const simdProbeModule = new Uint8Array([
99
0, 0, 0, 0, 0, 0, 0, 0, 11,
1010
]);
1111

12-
export const supportsWasm = () => {
13-
return WebAssembly && [WebAssembly.validate, WebAssembly.instantiate].every(i => typeof i == "function");
12+
const supportsWasm = () => {
13+
return typeof WebAssembly !== "undefined" &&
14+
[WebAssembly.validate, WebAssembly.instantiate].every(i => typeof i == "function");
1415
};
1516

1617
const supportsSimd = () => {
@@ -27,37 +28,44 @@ export default async function process(
2728
difficulty = 5,
2829
signal = null,
2930
progressCallback = null,
31+
fallbackCallback = null,
3032
threads = (navigator.hardwareConcurrency || 1),
3133
) {
3234
const workers = [];
33-
try {
34-
const useWasm = supportsWasm();
35-
let wasmModule = null;
36-
let WorkerClass;
37-
38-
if (useWasm) {
39-
const hasSimd = supportsSimd();
40-
const wasmUrl = hasSimd ? wasmUrlSimd : wasmUrlMvp;
41-
wasmModule = await (await fetch(wasmUrl)).arrayBuffer();
42-
WorkerClass = PowWorker;
43-
} else {
44-
WorkerClass = PowJsWorker;
45-
}
46-
47-
return await Promise.race(Array(threads).fill(0).map((i, idx) => new Promise((resolve, reject) => {
35+
const runWorkers = (WorkerClass, message) => Promise.race(
36+
Array(threads).fill(0).map((i, idx) => new Promise((resolve, reject) => {
4837
const worker = new WorkerClass();
4938
worker.onmessage = ({ data }) => (typeof data === "number" ? progressCallback : resolve)?.(data);
5039
worker.onerror = reject;
5140
worker.postMessage({
52-
...(useWasm ? { wasmModule } : {}),
41+
...message,
5342
data,
5443
difficulty,
5544
nonce: idx,
5645
threads,
5746
});
5847
signal?.addEventListener("abort", () => reject(new Error("PoW aborted")), { once: true });
5948
workers.push(worker);
60-
})));
49+
}))
50+
);
51+
52+
try {
53+
const useWasm = supportsWasm();
54+
55+
if (useWasm) {
56+
try {
57+
const hasSimd = supportsSimd();
58+
const wasmUrl = hasSimd ? wasmUrlSimd : wasmUrlMvp;
59+
const wasmModule = await (await fetch(wasmUrl)).arrayBuffer();
60+
return await runWorkers(PowWorker, { wasmModule });
61+
} catch (error) {
62+
workers.forEach((w) => w.terminate());
63+
workers.length = 0;
64+
fallbackCallback?.(error);
65+
}
66+
}
67+
68+
return await runWorkers(PowJsWorker, {});
6169
} finally {
6270
workers.forEach((w) => w.terminate());
6371
}

0 commit comments

Comments
 (0)