fix: await worker ready status & remove workaround

This commit is contained in:
2025-07-13 12:37:33 +02:00
parent 54e225ea6a
commit ab57216b6b
3 changed files with 44 additions and 23 deletions

View File

@@ -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<Challenge>;
};
export type WorkerResponse = {
solutions: ReadonlyArray<Uint8Array>;
};

View File

@@ -1,24 +1,10 @@
import * as solver from "./solver"; import * as solver from "./solver";
// import * as wasm from "@pow-captcha/solver-wasm"; import * as wasm from "@pow-captcha/solver-wasm";
import {
export type Challenge = readonly [Uint8Array, Uint8Array]; WORKER_READY,
type WorkerRequest,
export type WorkerRequest = { type WorkerResponse,
engine?: undefined | "js" | "wasm"; } from "./solver-shared";
challenges: ReadonlyArray<Challenge>;
};
export type WorkerResponse = {
solutions: ReadonlyArray<Uint8Array>;
};
async function solveWasm(
nonce: Uint8Array,
target: Uint8Array,
): Promise<Uint8Array> {
const wasm = await import("@pow-captcha/solver-wasm");
return wasm.solve(nonce, target);
}
async function solve( async function solve(
nonce: Uint8Array, nonce: Uint8Array,
@@ -30,11 +16,11 @@ async function solve(
return await solver.solveJs(nonce, target); return await solver.solveJs(nonce, target);
case "wasm": case "wasm":
return await solveWasm(nonce, target); return wasm.solve(nonce, target);
case undefined: case undefined:
try { try {
return await solveWasm(nonce, target); return wasm.solve(nonce, target);
} catch (err) { } catch (err) {
console.warn( console.warn(
"pow-captcha: Falling back to js solver. Error: ", "pow-captcha: Falling back to js solver. Error: ",
@@ -70,3 +56,6 @@ onmessage = (m: MessageEvent<WorkerRequest>) => {
console.error("pow-captcha: Failure in worker: ", err); console.error("pow-captcha: Failure in worker: ", err);
}); });
}; };
// send worker ready
postMessage(WORKER_READY);

View File

@@ -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"; import { arrayStartsWith, chunkArray } from "./utils";
export async function solveJs( export async function solveJs(
@@ -51,6 +55,22 @@ export async function solveChallenges(
); );
try { try {
// await worker ready
await new Promise<void>((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<ReadonlyArray<Uint8Array>>( const resultPromise = new Promise<ReadonlyArray<Uint8Array>>(
(onOk, onErr) => { (onOk, onErr) => {
worker.onerror = onErr; worker.onerror = onErr;