diff --git a/pkgs/pow-captcha/src/solver-shared.ts b/pkgs/pow-captcha/src/solver-shared.ts new file mode 100644 index 0000000..95e0577 --- /dev/null +++ b/pkgs/pow-captcha/src/solver-shared.ts @@ -0,0 +1,12 @@ +export const WORKER_READY = "fa7c33c3-85cb-4bcd-bffb-59a55d8dda31"; + +export type Challenge = readonly [Uint8Array, Uint8Array]; + +export type WorkerRequest = { + engine?: undefined | "js" | "wasm"; + challenges: ReadonlyArray; +}; + +export type WorkerResponse = { + solutions: ReadonlyArray; +}; diff --git a/pkgs/pow-captcha/src/solver-worker.ts b/pkgs/pow-captcha/src/solver-worker.ts index 0173635..c414c12 100644 --- a/pkgs/pow-captcha/src/solver-worker.ts +++ b/pkgs/pow-captcha/src/solver-worker.ts @@ -1,24 +1,10 @@ import * as solver from "./solver"; -// import * as wasm from "@pow-captcha/solver-wasm"; - -export type Challenge = readonly [Uint8Array, Uint8Array]; - -export type WorkerRequest = { - engine?: undefined | "js" | "wasm"; - challenges: ReadonlyArray; -}; - -export type WorkerResponse = { - solutions: ReadonlyArray; -}; - -async function solveWasm( - nonce: Uint8Array, - target: Uint8Array, -): Promise { - const wasm = await import("@pow-captcha/solver-wasm"); - return wasm.solve(nonce, target); -} +import * as wasm from "@pow-captcha/solver-wasm"; +import { + WORKER_READY, + type WorkerRequest, + type WorkerResponse, +} from "./solver-shared"; async function solve( nonce: Uint8Array, @@ -30,11 +16,11 @@ async function solve( return await solver.solveJs(nonce, target); case "wasm": - return await solveWasm(nonce, target); + return wasm.solve(nonce, target); case undefined: try { - return await solveWasm(nonce, target); + return wasm.solve(nonce, target); } catch (err) { console.warn( "pow-captcha: Falling back to js solver. Error: ", @@ -70,3 +56,6 @@ onmessage = (m: MessageEvent) => { console.error("pow-captcha: Failure in worker: ", err); }); }; + +// send worker ready +postMessage(WORKER_READY); diff --git a/pkgs/pow-captcha/src/solver.ts b/pkgs/pow-captcha/src/solver.ts index f93deec..5f17507 100644 --- a/pkgs/pow-captcha/src/solver.ts +++ b/pkgs/pow-captcha/src/solver.ts @@ -1,4 +1,8 @@ -import type { WorkerRequest, WorkerResponse } from "./solver-worker"; +import { + WORKER_READY, + type WorkerRequest, + type WorkerResponse, +} from "./solver-shared"; import { arrayStartsWith, chunkArray } from "./utils"; export async function solveJs( @@ -51,6 +55,22 @@ export async function solveChallenges( ); try { + // await worker ready + await new Promise((onOk, onErr) => { + worker.onerror = onErr; + worker.onmessage = (m) => { + if (m.data !== WORKER_READY) { + onErr( + new Error( + `pow-captcha: Worker-ready ("${WORKER_READY}") expected, got: "${m.data}"`, + ), + ); + } else { + onOk(); + } + }; + }); + const resultPromise = new Promise>( (onOk, onErr) => { worker.onerror = onErr;