Skip to content

Commit

Permalink
fix(cli-utils): When threading, transfer extra error properties to ho…
Browse files Browse the repository at this point in the history
…st (#359)
  • Loading branch information
kitten committed Jul 31, 2024
1 parent 4b5a90e commit 8ee74e4
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 7 deletions.
5 changes: 5 additions & 0 deletions .changeset/late-cougars-act.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@gql.tada/cli-utils": patch
---

When threading, transfer error properties to thread host.
30 changes: 23 additions & 7 deletions packages/cli-utils/src/threads/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ interface ThreadMessage {
id?: number;
kind: ThreadMessageCodes;
data?: any;
extra?: Record<string, unknown>;
}

const workerOpts: WorkerOptions = {
Expand All @@ -37,6 +38,17 @@ const workerOpts: WorkerOptions = {
stdin: false,
};

const getMessageData = (message: ThreadMessage) => {
const data = message.data;
if (message.kind === ThreadMessageCodes.Throw) {
return typeof data === 'object' && data && message.extra != null
? Object.assign(data, message.extra)
: data;
} else {
return data;
}
};

const asyncIteratorSymbol = (): typeof Symbol.asyncIterator =>
(typeof Symbol === 'function' && Symbol.asyncIterator) || ('@@asyncIterator' as any);

Expand Down Expand Up @@ -106,14 +118,14 @@ function main<Args extends readonly any[], Next>(url: string | URL): Generator<A
if (!message) {
return;
} else if (reject && message.kind === ThreadMessageCodes.Throw) {
reject(message.data);
reject(getMessageData(message));
cleanup();
} else if (resolve && message.kind === ThreadMessageCodes.Return) {
resolve({ done: true, value: message.data });
resolve({ done: true, value: getMessageData(message) });
cleanup();
} else if (resolve && message.kind === ThreadMessageCodes.Next) {
pulled = false;
resolve({ done: false, value: message.data });
resolve({ done: false, value: getMessageData(message) });
} else if (
message.kind === ThreadMessageCodes.Throw ||
message.kind === ThreadMessageCodes.Return
Expand Down Expand Up @@ -147,12 +159,12 @@ function main<Args extends readonly any[], Next>(url: string | URL): Generator<A
const message = buffer.shift();
if (message && message.kind === ThreadMessageCodes.Throw) {
cleanup();
throw message.data;
throw getMessageData(message);
} else if (message && message.kind === ThreadMessageCodes.Return) {
cleanup();
return { value: message.data, done: true };
return { value: getMessageData(message), done: true };
} else if (message && message.kind === ThreadMessageCodes.Next) {
return { value: message.data, done: false };
return { value: getMessageData(message), done: false };
} else {
return new Promise((_resolve, _reject) => {
resolve = (value) => {
Expand Down Expand Up @@ -201,7 +213,11 @@ function thread<Args extends readonly any[], Next>(

async function sendMessage(kind: ThreadMessageCodes, data?: any) {
try {
port.postMessage({ id, kind, data });
const message: ThreadMessage = { id, kind, data };
// NOTE: Copy error annotations to separate property
if (kind === ThreadMessageCodes.Throw && typeof data === 'object' && data != null)
message.extra = { ...data };
port.postMessage(message);
} catch (error) {
cleanup();
if (iterator.throw) {
Expand Down

0 comments on commit 8ee74e4

Please sign in to comment.