@@ -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
1617const 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