diff --git a/src/error.ts b/src/error.ts index 4257e90..aab4c4b 100644 --- a/src/error.ts +++ b/src/error.ts @@ -67,6 +67,7 @@ export const formatWorkflowError = (error: unknown): FailureFunctionPayload => { ? { error: error.name, message: error.message, + stack: error.stack, } : { error: "Error", diff --git a/src/serve/serve.test.ts b/src/serve/serve.test.ts index 0e49dc8..7ee0d4b 100644 --- a/src/serve/serve.test.ts +++ b/src/serve/serve.test.ts @@ -322,6 +322,7 @@ describe("serve", () => { expect(result).toEqual({ error: "Error", message: "some-error", + stack: expect.any(String), }); called = true; }, @@ -903,6 +904,7 @@ describe("serve", () => { expect(body).toEqual({ error: "WorkflowNonRetryableError", message: "This is a non-retryable error", + stack: expect.any(String), }); }, responseFields: { body: undefined, status: 489 }, @@ -1227,6 +1229,7 @@ describe("serve", () => { expect(content).toEqual({ error: "WorkflowError", message: `Workflow URL should start with 'http://' or 'https://'. Recevied is '${url}'`, + stack: expect.any(String), }); expect(logSpy).toBeCalledWith("WARN", "ENDPOINT_START", { diff --git a/src/types.ts b/src/types.ts index 8e93951..2ae5aef 100644 --- a/src/types.ts +++ b/src/types.ts @@ -230,6 +230,7 @@ export type WorkflowServeOptions< failStatus: number; failResponse: string; failHeaders: Record; + failStack: string; }) => Promise | void | string; /** * Base Url of the workflow endpoint @@ -360,6 +361,10 @@ export type FailureFunctionPayload = { * error message */ message: string; + /** + * error stack trace if available + */ + stack?: string; }; /** diff --git a/src/workflow-parser.ts b/src/workflow-parser.ts index 66f29f0..646ea07 100644 --- a/src/workflow-parser.ts +++ b/src/workflow-parser.ts @@ -343,11 +343,15 @@ export const handleFailure = async ( const decodedBody = body ? decodeBase64(body) : "{}"; let errorMessage: string = ""; + let failStack: string = ""; try { const errorPayload = JSON.parse(decodedBody) as FailureFunctionPayload; if (errorPayload.message) { errorMessage = errorPayload.message; } + if (errorPayload.stack) { + failStack = errorPayload.stack; + } } catch { // skip } @@ -398,6 +402,7 @@ export const handleFailure = async ( failStatus: status, failResponse: errorMessage, failHeaders: header, + failStack, }); return ok({ result: "is-failure-callback", response: failureResponse }); } catch (error) {