fix: await worker ready status & remove workaround
This commit is contained in:
12
pkgs/pow-captcha/src/solver-shared.ts
Normal file
12
pkgs/pow-captcha/src/solver-shared.ts
Normal 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>;
|
||||
};
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user