From c3a27d0b5b91504d95026254ed7886d01686c8b9 Mon Sep 17 00:00:00 2001 From: Sam Wilson Date: Fri, 9 Jun 2023 19:05:07 -0400 Subject: [PATCH] Pass errors through postMessage --- client/src/index.ts | 15 ++++++++++++++- client/src/worker_chain.ts | 8 +++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/client/src/index.ts b/client/src/index.ts index b0e65ec..8461415 100644 --- a/client/src/index.ts +++ b/client/src/index.ts @@ -39,7 +39,20 @@ class GanacheWorkerProvider implements Eip1193Provider { public request(request: Request): Promise { return new Promise((res, rej) => { const channel = new MessageChannel(); - channel.port1.onmessage = (evt) => res(evt.data); + channel.port1.onmessage = (evt) => { + const data: unknown = evt.data; + if (!data || typeof data !== "object") { + return rej(); + } + + if ("result" in data) { + return res(data.result); + } else if ("error" in data) { + return rej(data.error); + } else { + return rej(); + } + }; channel.port1.onmessageerror = (evt) => rej(evt.data); this.worker.postMessage(request, [channel.port2]); }); diff --git a/client/src/worker_chain.ts b/client/src/worker_chain.ts index a24b70c..fb63af1 100644 --- a/client/src/worker_chain.ts +++ b/client/src/worker_chain.ts @@ -17,9 +17,15 @@ function onMessage(ganache: EthereumProvider, evt: MessageEvent): void { // message data conforms to the JSON RPC spec. // eslint-disable-next-line @typescript-eslint/no-unsafe-argument .request(evt.data) - .then((response) => reply.postMessage(response)) + .then((result) => reply.postMessage({ result })) .catch((error) => { console.error("Uncaught (in ganache worker thread)", error); + reply.postMessage({ + error: { + message: String(error), + code: -32000, + }, + }); }); }