diff --git a/packages/common/src/__tests__/test-failure.ts b/packages/common/src/__tests__/test-failure.ts new file mode 100644 index 000000000..247c828f0 --- /dev/null +++ b/packages/common/src/__tests__/test-failure.ts @@ -0,0 +1,15 @@ +import test from 'ava'; +import { defaultFailureConverter } from '../converter/data-converter'; +import { defaultPayloadConverter } from '../converter/payload-converter'; +import { ensureApplicationFailure } from '../failure'; + +test('preserves Error.cause when converting an application failure', (t) => { + const cause = new Error('connection terminated'); + const error = new Error('query failed', { cause }); + + const applicationFailure = ensureApplicationFailure(error); + const failure = defaultFailureConverter.errorToFailure(applicationFailure, defaultPayloadConverter); + + t.is(applicationFailure.cause, cause); + t.is(failure.cause?.message, cause.message); +}); diff --git a/packages/common/src/failure.ts b/packages/common/src/failure.ts index 0653a80e4..c4d745d9f 100644 --- a/packages/common/src/failure.ts +++ b/packages/common/src/failure.ts @@ -427,6 +427,7 @@ export class WorkflowExecutionAlreadyStartedError extends TemporalFailure { * - `message`: `error.message` or `String(error)` * - `type`: `error.constructor.name` or `error.name` * - `stack`: `error.stack` or `''` + * - `cause`: `error.cause` when it is an `Error` */ export function ensureApplicationFailure(error: unknown): ApplicationFailure { if (error instanceof ApplicationFailure) { @@ -435,7 +436,8 @@ export function ensureApplicationFailure(error: unknown): ApplicationFailure { const message = (isRecord(error) && String(error.message)) || String(error); const type = (isRecord(error) && (error.constructor?.name ?? error.name)) || undefined; - const failure = ApplicationFailure.create({ message, type, nonRetryable: false }); + const cause = isRecord(error) && error.cause instanceof Error ? error.cause : undefined; + const failure = ApplicationFailure.create({ message, type, nonRetryable: false, cause }); failure.stack = (isRecord(error) && String(error.stack)) || ''; return failure; }