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 wasm from "@pow-captcha/solver-wasm";
export type Challenge = readonly [Uint8Array, Uint8Array];
export type WorkerRequest = {
engine?: undefined | "js" | "wasm";
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);
}
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<WorkerRequest>) => {
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";
export async function solveJs(
@@ -51,6 +55,22 @@ export async function solveChallenges(
);
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>>(
(onOk, onErr) => {
worker.onerror = onErr;