From d0e69aaf7fd064b3263127279944feecb3d6e9fa Mon Sep 17 00:00:00 2001 From: Tim Kendrick Date: Fri, 22 Dec 2023 16:04:36 +0000 Subject: [PATCH] Serialize worker errors --- packages/worker-utils/lib.test.ts | 1 + packages/worker-utils/src/worker.ts | 24 +++++++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/packages/worker-utils/lib.test.ts b/packages/worker-utils/lib.test.ts index 705a6271..967f264e 100644 --- a/packages/worker-utils/lib.test.ts +++ b/packages/worker-utils/lib.test.ts @@ -7,5 +7,6 @@ test('module exports', () => { configureWorkerTask: lib.configureWorkerTask, createFsHelpers: lib.createFsHelpers, initTaskWorker: lib.initTaskWorker, + serializeWorkerError: lib.serializeWorkerError, }); }); diff --git a/packages/worker-utils/src/worker.ts b/packages/worker-utils/src/worker.ts index 60f882be..ba4a3378 100644 --- a/packages/worker-utils/src/worker.ts +++ b/packages/worker-utils/src/worker.ts @@ -42,7 +42,7 @@ export function initTaskWorker( runWorkerTask(task, data, runner) .then( (result) => ({ success: true as const, value: result }), - (error) => ({ success: false as const, error: error.message }), + (error) => ({ success: false as const, error: serializeWorkerError(error) }), ) .then((output) => channel.postMessage(output)); }); @@ -75,3 +75,25 @@ function runWorkerTask( return Promise.reject(error); } } + +export function serializeWorkerError(error: unknown): Error { + if (error instanceof Error) { + if (isSerializable(error)) return error; + const { name, message, stack, ...properties } = error; + return Object.assign(new Error(message), { + name, + stack, + ...properties, + }); + } + return new Error(String(error)); +} + +function isSerializable(value: unknown): boolean { + try { + structuredClone(value); + return true; + } catch { + return false; + } +}