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 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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user