worker-relay error timeout
This commit is contained in:
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@snort/worker-relay",
|
||||
"version": "1.0.1",
|
||||
"version": "1.0.2",
|
||||
"description": "A nostr relay in a service worker",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
@ -16,7 +16,7 @@
|
||||
"dist"
|
||||
],
|
||||
"dependencies": {
|
||||
"@sqlite.org/sqlite-wasm": "^3.44.2-build3",
|
||||
"@sqlite.org/sqlite-wasm": "^3.45.1-build1",
|
||||
"debug": "^4.3.4",
|
||||
"eventemitter3": "^5.0.1",
|
||||
"uuid": "^9.0.1"
|
||||
|
@ -3,7 +3,6 @@ import {
|
||||
NostrEvent,
|
||||
OkResponse,
|
||||
ReqCommand,
|
||||
ReqFilter,
|
||||
WorkerMessage,
|
||||
WorkerMessageCommand,
|
||||
} from "./types";
|
||||
@ -13,6 +12,9 @@ export class WorkerRelayInterface {
|
||||
#worker: Worker;
|
||||
#commandQueue: Map<string, (v: unknown, ports: ReadonlyArray<MessagePort>) => void> = new Map();
|
||||
|
||||
// Command timeout
|
||||
timeout: number = 30_000;
|
||||
|
||||
constructor(path: string) {
|
||||
this.#worker = new Worker(path, { type: "module" });
|
||||
this.#worker.onmessage = e => {
|
||||
@ -61,7 +63,7 @@ export class WorkerRelayInterface {
|
||||
return this.#workerRpc<[string, EventMetadata], void>("setEventMetadata", [id, meta]);
|
||||
}
|
||||
|
||||
#workerRpc<T, R>(cmd: WorkerMessageCommand, args?: T) {
|
||||
async #workerRpc<T, R>(cmd: WorkerMessageCommand, args?: T) {
|
||||
const id = uuid();
|
||||
const msg = {
|
||||
id,
|
||||
@ -69,9 +71,17 @@ export class WorkerRelayInterface {
|
||||
args,
|
||||
} as WorkerMessage<T>;
|
||||
this.#worker.postMessage(msg);
|
||||
return new Promise<R>(resolve => {
|
||||
return await new Promise<R>((resolve, reject) => {
|
||||
const t = setTimeout(() => {
|
||||
reject(new Error("Timeout"));
|
||||
}, this.timeout);
|
||||
this.#commandQueue.set(id, (v, port) => {
|
||||
const cmdReply = v as WorkerMessage<R>;
|
||||
clearTimeout(t);
|
||||
const cmdReply = v as WorkerMessage<R & { error?: any }>;
|
||||
if (cmdReply.args.error) {
|
||||
reject(cmdReply.args.error);
|
||||
return;
|
||||
}
|
||||
resolve(cmdReply.args);
|
||||
});
|
||||
});
|
||||
|
@ -151,7 +151,6 @@ globalThis.onmessage = async ev => {
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
reply(msg.id, { error: JSON.stringify(e) });
|
||||
}
|
||||
};
|
||||
|
@ -8,6 +8,7 @@
|
||||
"module": "ESNext",
|
||||
"strict": true,
|
||||
"declaration": true,
|
||||
"declarationMap": true,
|
||||
"inlineSourceMap": true,
|
||||
"outDir": "dist",
|
||||
"skipLibCheck": true
|
||||
|
Reference in New Issue
Block a user