From 1faf61848b2b88c2e0559b94d0a00c4e72579ba7 Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Wed, 12 Feb 2025 18:20:11 +0000 Subject: [PATCH 1/7] runtime: detect adaptor errors from anywhere in node_modules --- packages/runtime/src/execute/expression.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/runtime/src/execute/expression.ts b/packages/runtime/src/execute/expression.ts index 011a6f268..4fd5f86be 100644 --- a/packages/runtime/src/execute/expression.ts +++ b/packages/runtime/src/execute/expression.ts @@ -137,7 +137,6 @@ export const wrapOperation = ( try { result = await fn(newState); } catch (e: any) { - console.log(e); if (e.stack) { const containsVMFrame = e.stack.match(/at vm:module\(0\)/); @@ -151,9 +150,15 @@ export const wrapOperation = ( // (this cuts out low level language errors like TypeError) do { const next = frames.shift(); + // If we hit a frame in runtime code, this is not an adaptor error + if (/(@openfn\/runtime)|(packages\/runtime)/.test(next)) { + break; + } if ( // detect an adaptor prod, adaptor monorepo, or vm frame - /(@openfn\/language-)|(packages\/.+\/dist)|(vm:module)/.test(next) + /(@openfn\/language-)|(packages\/.+\/dist)|(vm:module)|(node_modules)/.test( + next + ) ) { firstFrame = next; break; From fde7a7fef4f24a73765c9099f9ba539c12f70516 Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Thu, 13 Feb 2025 16:00:04 +0000 Subject: [PATCH 2/7] make error handling a bit more lenient --- packages/runtime/src/execute/expression.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/runtime/src/execute/expression.ts b/packages/runtime/src/execute/expression.ts index 4fd5f86be..ddc7ec44f 100644 --- a/packages/runtime/src/execute/expression.ts +++ b/packages/runtime/src/execute/expression.ts @@ -137,6 +137,7 @@ export const wrapOperation = ( try { result = await fn(newState); } catch (e: any) { + debugger; if (e.stack) { const containsVMFrame = e.stack.match(/at vm:module\(0\)/); @@ -151,7 +152,7 @@ export const wrapOperation = ( do { const next = frames.shift(); // If we hit a frame in runtime code, this is not an adaptor error - if (/(@openfn\/runtime)|(packages\/runtime)/.test(next)) { + if (/@openfn\/runtime/.test(next)) { break; } if ( From e428580f684846bb10f585ba1016e28c32d9b4d0 Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Thu, 13 Feb 2025 16:21:41 +0000 Subject: [PATCH 3/7] runtime: ensure that adaptor error details are stringified --- packages/runtime/src/errors.ts | 6 ++++-- packages/runtime/test/errors.test.ts | 16 ++++++++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/runtime/src/errors.ts b/packages/runtime/src/errors.ts index 4c993ea5b..c31ec5a57 100644 --- a/packages/runtime/src/errors.ts +++ b/packages/runtime/src/errors.ts @@ -1,3 +1,4 @@ +import stringify from 'fast-safe-stringify'; import { ErrorPosition } from './types'; export function assertImportError(e: any) { @@ -202,10 +203,11 @@ export class AdaptorError extends RTError { this.details = Object.assign( { - type: error.type || error.name, message: error.message, }, - error + // The incoming error is untrusted but MUST be serialisable + // Or else we'll have problems in threaded environments + JSON.parse(stringify(error)) ); if (typeof error === 'string') { diff --git a/packages/runtime/test/errors.test.ts b/packages/runtime/test/errors.test.ts index 5fe352757..2153e2607 100644 --- a/packages/runtime/test/errors.test.ts +++ b/packages/runtime/test/errors.test.ts @@ -404,7 +404,6 @@ test('fail on adaptor error and map to the top operation', async (t) => { details: { code: 1234, message: 'adaptor err', - type: 'Error', }, message: 'adaptor err', name: 'AdaptorError', @@ -460,7 +459,6 @@ test('fail on nested adaptor error and map to a position in the vm', async (t) = details: { code: 1234, message: 'adaptor err', - type: 'Error', }, message: 'adaptor err', name: 'AdaptorError', @@ -548,3 +546,17 @@ test('AdaptorError: if no operation, extract position from stack', (t) => { t.deepEqual(adaptorError.pos, { column: 27, line: 2 }); t.falsy(adaptorError.operationName); }); + +test('AdaptorError: ensure that error objects are safely serialised', (t) => { + const originalError = { + message: 'e', + name: 'AxiosError', + fn: () => {}, + }; + + const adaptorError = new AdaptorError(originalError); + t.deepEqual(adaptorError.details, { + message: 'e', + name: 'AxiosError', + }); +}); From 1a7be74a5df619245fdb3525ecc559f92ec1b70a Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Thu, 13 Feb 2025 16:35:21 +0000 Subject: [PATCH 4/7] tidying up --- packages/engine-multi/src/worker/thread/run.ts | 13 +------------ packages/runtime/src/execute/expression.ts | 1 - 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/packages/engine-multi/src/worker/thread/run.ts b/packages/engine-multi/src/worker/thread/run.ts index 8e708b87c..80039d8aa 100644 --- a/packages/engine-multi/src/worker/thread/run.ts +++ b/packages/engine-multi/src/worker/thread/run.ts @@ -7,8 +7,6 @@ import type { SanitizePolicies } from '@openfn/logger'; import { register, publish } from './runtime'; import { execute, createLoggers } from './helpers'; -import serializeError from '../../util/serialize-error'; -import { JobErrorPayload } from '../../events'; export type RunOptions = { repoDir: string; @@ -17,13 +15,6 @@ export type RunOptions = { statePropsToRemove?: string[]; }; -const eventMap = { - 'job-error': (evt: JobErrorPayload) => ({ - ...evt, - error: serializeError(evt.error), - }), -}; - register({ run: (plan: ExecutionPlan, input: State, runOptions: RunOptions) => { const { repoDir, whitelist, sanitize, statePropsToRemove } = runOptions; @@ -61,11 +52,9 @@ register({ // For now I am preloading credentials // resolveCredential: async (id: string) => {}, notify: (name: NotifyEvents, payload: any) => { - // @ts-ignore - const mappedPayload = eventMap[name]?.(payload) ?? payload; publish(`worker:${name}`, { workflowId: plan.id, - ...mappedPayload, + ...payload, }); }, }, diff --git a/packages/runtime/src/execute/expression.ts b/packages/runtime/src/execute/expression.ts index ddc7ec44f..a161fb696 100644 --- a/packages/runtime/src/execute/expression.ts +++ b/packages/runtime/src/execute/expression.ts @@ -137,7 +137,6 @@ export const wrapOperation = ( try { result = await fn(newState); } catch (e: any) { - debugger; if (e.stack) { const containsVMFrame = e.stack.match(/at vm:module\(0\)/); From beb46173f704c4596f2477d95ba246aef6429369 Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Thu, 13 Feb 2025 16:37:20 +0000 Subject: [PATCH 5/7] changesets --- .changeset/little-ears-work.md | 5 +++++ .changeset/sharp-hairs-care.md | 5 +++++ .changeset/ten-waves-train.md | 5 +++++ 3 files changed, 15 insertions(+) create mode 100644 .changeset/little-ears-work.md create mode 100644 .changeset/sharp-hairs-care.md create mode 100644 .changeset/ten-waves-train.md diff --git a/.changeset/little-ears-work.md b/.changeset/little-ears-work.md new file mode 100644 index 000000000..3da579bcc --- /dev/null +++ b/.changeset/little-ears-work.md @@ -0,0 +1,5 @@ +--- +'@openfn/engine-multi': patch +--- + +Remove unneccessary event processing diff --git a/.changeset/sharp-hairs-care.md b/.changeset/sharp-hairs-care.md new file mode 100644 index 000000000..b528282f8 --- /dev/null +++ b/.changeset/sharp-hairs-care.md @@ -0,0 +1,5 @@ +--- +'@openfn/ws-worker': patch +--- + +Fix an issue where a DataCloneError can occur after an exception is thrown diff --git a/.changeset/ten-waves-train.md b/.changeset/ten-waves-train.md new file mode 100644 index 000000000..11c48a57f --- /dev/null +++ b/.changeset/ten-waves-train.md @@ -0,0 +1,5 @@ +--- +'@openfn/runtime': patch +--- + +Ensure that AdaptorError details are safely serialised From 7adaa1aa3c9be3c46793c2b700155b4cd42edac3 Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Thu, 13 Feb 2025 16:59:26 +0000 Subject: [PATCH 6/7] revert engine fix --- .changeset/little-ears-work.md | 5 ----- packages/engine-multi/src/worker/thread/run.ts | 13 ++++++++++++- 2 files changed, 12 insertions(+), 6 deletions(-) delete mode 100644 .changeset/little-ears-work.md diff --git a/.changeset/little-ears-work.md b/.changeset/little-ears-work.md deleted file mode 100644 index 3da579bcc..000000000 --- a/.changeset/little-ears-work.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@openfn/engine-multi': patch ---- - -Remove unneccessary event processing diff --git a/packages/engine-multi/src/worker/thread/run.ts b/packages/engine-multi/src/worker/thread/run.ts index 80039d8aa..8e708b87c 100644 --- a/packages/engine-multi/src/worker/thread/run.ts +++ b/packages/engine-multi/src/worker/thread/run.ts @@ -7,6 +7,8 @@ import type { SanitizePolicies } from '@openfn/logger'; import { register, publish } from './runtime'; import { execute, createLoggers } from './helpers'; +import serializeError from '../../util/serialize-error'; +import { JobErrorPayload } from '../../events'; export type RunOptions = { repoDir: string; @@ -15,6 +17,13 @@ export type RunOptions = { statePropsToRemove?: string[]; }; +const eventMap = { + 'job-error': (evt: JobErrorPayload) => ({ + ...evt, + error: serializeError(evt.error), + }), +}; + register({ run: (plan: ExecutionPlan, input: State, runOptions: RunOptions) => { const { repoDir, whitelist, sanitize, statePropsToRemove } = runOptions; @@ -52,9 +61,11 @@ register({ // For now I am preloading credentials // resolveCredential: async (id: string) => {}, notify: (name: NotifyEvents, payload: any) => { + // @ts-ignore + const mappedPayload = eventMap[name]?.(payload) ?? payload; publish(`worker:${name}`, { workflowId: plan.id, - ...payload, + ...mappedPayload, }); }, }, From 6f436df0acc28e4332e43ee51e428d305dcf294a Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Thu, 13 Feb 2025 17:09:35 +0000 Subject: [PATCH 7/7] versions: worker@1.9.2 cli@1.11.1 --- .changeset/sharp-hairs-care.md | 5 ----- .changeset/ten-waves-train.md | 5 ----- integration-tests/execute/CHANGELOG.md | 7 +++++++ integration-tests/execute/package.json | 2 +- integration-tests/worker/CHANGELOG.md | 9 +++++++++ integration-tests/worker/package.json | 2 +- packages/cli/CHANGELOG.md | 7 +++++++ packages/cli/package.json | 2 +- packages/engine-multi/CHANGELOG.md | 7 +++++++ packages/engine-multi/package.json | 2 +- packages/lightning-mock/CHANGELOG.md | 8 ++++++++ packages/lightning-mock/package.json | 2 +- packages/runtime/CHANGELOG.md | 6 ++++++ packages/runtime/package.json | 2 +- packages/ws-worker/CHANGELOG.md | 9 +++++++++ packages/ws-worker/package.json | 2 +- 16 files changed, 60 insertions(+), 17 deletions(-) delete mode 100644 .changeset/sharp-hairs-care.md delete mode 100644 .changeset/ten-waves-train.md diff --git a/.changeset/sharp-hairs-care.md b/.changeset/sharp-hairs-care.md deleted file mode 100644 index b528282f8..000000000 --- a/.changeset/sharp-hairs-care.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@openfn/ws-worker': patch ---- - -Fix an issue where a DataCloneError can occur after an exception is thrown diff --git a/.changeset/ten-waves-train.md b/.changeset/ten-waves-train.md deleted file mode 100644 index 11c48a57f..000000000 --- a/.changeset/ten-waves-train.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@openfn/runtime': patch ---- - -Ensure that AdaptorError details are safely serialised diff --git a/integration-tests/execute/CHANGELOG.md b/integration-tests/execute/CHANGELOG.md index 83cf5810f..c5bba4e7d 100644 --- a/integration-tests/execute/CHANGELOG.md +++ b/integration-tests/execute/CHANGELOG.md @@ -1,5 +1,12 @@ # @openfn/integration-tests-execute +## 1.0.15 + +### Patch Changes + +- Updated dependencies [beb4617] + - @openfn/runtime@1.6.2 + ## 1.0.14 ### Patch Changes diff --git a/integration-tests/execute/package.json b/integration-tests/execute/package.json index ac30b97d4..9b65bb012 100644 --- a/integration-tests/execute/package.json +++ b/integration-tests/execute/package.json @@ -1,7 +1,7 @@ { "name": "@openfn/integration-tests-execute", "private": true, - "version": "1.0.14", + "version": "1.0.15", "description": "Job execution tests", "author": "Open Function Group ", "license": "ISC", diff --git a/integration-tests/worker/CHANGELOG.md b/integration-tests/worker/CHANGELOG.md index 093f4422b..93487188b 100644 --- a/integration-tests/worker/CHANGELOG.md +++ b/integration-tests/worker/CHANGELOG.md @@ -1,5 +1,14 @@ # @openfn/integration-tests-worker +## 1.0.75 + +### Patch Changes + +- Updated dependencies [beb4617] + - @openfn/ws-worker@1.9.2 + - @openfn/engine-multi@1.4.9 + - @openfn/lightning-mock@2.0.30 + ## 1.0.74 ### Patch Changes diff --git a/integration-tests/worker/package.json b/integration-tests/worker/package.json index dc596cf59..45a213b7e 100644 --- a/integration-tests/worker/package.json +++ b/integration-tests/worker/package.json @@ -1,7 +1,7 @@ { "name": "@openfn/integration-tests-worker", "private": true, - "version": "1.0.74", + "version": "1.0.75", "description": "Lightning WOrker integration tests", "author": "Open Function Group ", "license": "ISC", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 4ba568fb9..76e8aaa58 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,12 @@ # @openfn/cli +## 1.11.1 + +### Patch Changes + +- Updated dependencies [beb4617] + - @openfn/runtime@1.6.2 + ## 1.11.0 ### Minor Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index cea59eda9..60af52184 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@openfn/cli", - "version": "1.11.0", + "version": "1.11.1", "description": "CLI devtools for the openfn toolchain.", "engines": { "node": ">=18", diff --git a/packages/engine-multi/CHANGELOG.md b/packages/engine-multi/CHANGELOG.md index e1824e935..b237fcdb4 100644 --- a/packages/engine-multi/CHANGELOG.md +++ b/packages/engine-multi/CHANGELOG.md @@ -1,5 +1,12 @@ # engine-multi +## 1.4.9 + +### Patch Changes + +- Updated dependencies [beb4617] + - @openfn/runtime@1.6.2 + ## 1.4.8 ### Patch Changes diff --git a/packages/engine-multi/package.json b/packages/engine-multi/package.json index 24911749f..94fbe8497 100644 --- a/packages/engine-multi/package.json +++ b/packages/engine-multi/package.json @@ -1,6 +1,6 @@ { "name": "@openfn/engine-multi", - "version": "1.4.8", + "version": "1.4.9", "description": "Multi-process runtime engine", "main": "dist/index.js", "type": "module", diff --git a/packages/lightning-mock/CHANGELOG.md b/packages/lightning-mock/CHANGELOG.md index 3b34d064c..2676d9b0d 100644 --- a/packages/lightning-mock/CHANGELOG.md +++ b/packages/lightning-mock/CHANGELOG.md @@ -1,5 +1,13 @@ # @openfn/lightning-mock +## 2.0.30 + +### Patch Changes + +- Updated dependencies [beb4617] + - @openfn/runtime@1.6.2 + - @openfn/engine-multi@1.4.9 + ## 2.0.29 ### Patch Changes diff --git a/packages/lightning-mock/package.json b/packages/lightning-mock/package.json index 6f864eec8..4b6676d11 100644 --- a/packages/lightning-mock/package.json +++ b/packages/lightning-mock/package.json @@ -1,6 +1,6 @@ { "name": "@openfn/lightning-mock", - "version": "2.0.29", + "version": "2.0.30", "private": true, "description": "A mock Lightning server", "main": "dist/index.js", diff --git a/packages/runtime/CHANGELOG.md b/packages/runtime/CHANGELOG.md index cd5fbaf30..20f2b8bd4 100644 --- a/packages/runtime/CHANGELOG.md +++ b/packages/runtime/CHANGELOG.md @@ -1,5 +1,11 @@ # @openfn/runtime +## 1.6.2 + +### Patch Changes + +- beb4617: Ensure that AdaptorError details are safely serialised + ## 1.6.1 ### Patch Changes diff --git a/packages/runtime/package.json b/packages/runtime/package.json index e9d8f61f4..fc517e82f 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -1,6 +1,6 @@ { "name": "@openfn/runtime", - "version": "1.6.1", + "version": "1.6.2", "description": "Job processing runtime.", "type": "module", "exports": { diff --git a/packages/ws-worker/CHANGELOG.md b/packages/ws-worker/CHANGELOG.md index b49f89c11..d1740278b 100644 --- a/packages/ws-worker/CHANGELOG.md +++ b/packages/ws-worker/CHANGELOG.md @@ -1,5 +1,14 @@ # ws-worker +## 1.9.2 + +### Patch Changes + +- beb4617: Fix an issue where a DataCloneError can occur after an exception is thrown +- Updated dependencies [beb4617] + - @openfn/runtime@1.6.2 + - @openfn/engine-multi@1.4.9 + ## 1.9.1 ### Patch Changes diff --git a/packages/ws-worker/package.json b/packages/ws-worker/package.json index 8015381c6..a707c3e57 100644 --- a/packages/ws-worker/package.json +++ b/packages/ws-worker/package.json @@ -1,6 +1,6 @@ { "name": "@openfn/ws-worker", - "version": "1.9.1", + "version": "1.9.2", "description": "A Websocket Worker to connect Lightning to a Runtime Engine", "main": "dist/index.js", "type": "module",