@n8n/task-runner 1.0.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/authenticator.js +1 -1
  2. package/dist/authenticator.js.map +1 -1
  3. package/dist/build.tsbuildinfo +1 -1
  4. package/dist/js-task-runner/errors/error-like.d.ts +5 -0
  5. package/dist/js-task-runner/errors/error-like.js +10 -0
  6. package/dist/js-task-runner/errors/error-like.js.map +1 -0
  7. package/dist/js-task-runner/errors/execution-error.d.ts +15 -0
  8. package/dist/js-task-runner/errors/execution-error.js +69 -0
  9. package/dist/js-task-runner/errors/execution-error.js.map +1 -0
  10. package/dist/js-task-runner/errors/serializable-error.d.ts +4 -0
  11. package/dist/js-task-runner/errors/serializable-error.js +19 -0
  12. package/dist/js-task-runner/errors/serializable-error.js.map +1 -0
  13. package/dist/js-task-runner/errors/validation-error.d.ts +15 -0
  14. package/dist/js-task-runner/errors/validation-error.js +33 -0
  15. package/dist/js-task-runner/errors/validation-error.js.map +1 -0
  16. package/dist/{code.d.ts → js-task-runner/js-task-runner.d.ts} +22 -6
  17. package/dist/js-task-runner/js-task-runner.js +172 -0
  18. package/dist/js-task-runner/js-task-runner.js.map +1 -0
  19. package/dist/js-task-runner/obj-utils.d.ts +3 -0
  20. package/dist/js-task-runner/obj-utils.js +7 -0
  21. package/dist/js-task-runner/obj-utils.js.map +1 -0
  22. package/dist/js-task-runner/require-resolver.d.ts +6 -0
  23. package/dist/js-task-runner/require-resolver.js +22 -0
  24. package/dist/js-task-runner/require-resolver.js.map +1 -0
  25. package/dist/js-task-runner/result-validation.d.ts +4 -0
  26. package/dist/js-task-runner/result-validation.js +82 -0
  27. package/dist/js-task-runner/result-validation.js.map +1 -0
  28. package/dist/start.js +35 -3
  29. package/dist/start.js.map +1 -1
  30. package/dist/task-runner.d.ts +3 -0
  31. package/dist/task-runner.js +22 -7
  32. package/dist/task-runner.js.map +1 -1
  33. package/package.json +10 -6
  34. package/dist/code.js +0 -80
  35. package/dist/code.js.map +0 -1
@@ -0,0 +1,5 @@
1
+ export interface ErrorLike {
2
+ message: string;
3
+ stack?: string;
4
+ }
5
+ export declare function isErrorLike(value: unknown): value is ErrorLike;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isErrorLike = isErrorLike;
4
+ function isErrorLike(value) {
5
+ if (typeof value !== 'object' || value === null)
6
+ return false;
7
+ const errorLike = value;
8
+ return typeof errorLike.message === 'string';
9
+ }
10
+ //# sourceMappingURL=error-like.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-like.js","sourceRoot":"","sources":["../../../src/js-task-runner/errors/error-like.ts"],"names":[],"mappings":";;AAKA,kCAMC;AAND,SAAgB,WAAW,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAE9D,MAAM,SAAS,GAAG,KAAkB,CAAC;IAErC,OAAO,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ErrorLike } from './error-like';
2
+ import { SerializableError } from './serializable-error';
3
+ export declare class ExecutionError extends SerializableError {
4
+ description: string | null;
5
+ itemIndex: number | undefined;
6
+ context: {
7
+ itemIndex: number;
8
+ } | undefined;
9
+ stack: string;
10
+ lineNumber: number | undefined;
11
+ constructor(error: ErrorLike, itemIndex?: number);
12
+ private populateFromStack;
13
+ private toLineNumberDisplay;
14
+ private toErrorDetailsAndType;
15
+ }
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExecutionError = void 0;
4
+ const serializable_error_1 = require("./serializable-error");
5
+ const VM_WRAPPER_FN_NAME = 'VmCodeWrapper';
6
+ class ExecutionError extends serializable_error_1.SerializableError {
7
+ constructor(error, itemIndex) {
8
+ super(error.message);
9
+ this.description = null;
10
+ this.itemIndex = undefined;
11
+ this.context = undefined;
12
+ this.stack = '';
13
+ this.lineNumber = undefined;
14
+ this.itemIndex = itemIndex;
15
+ if (this.itemIndex !== undefined) {
16
+ this.context = { itemIndex: this.itemIndex };
17
+ }
18
+ this.stack = error.stack ?? '';
19
+ this.populateFromStack();
20
+ }
21
+ populateFromStack() {
22
+ const stackRows = this.stack.split('\n');
23
+ if (stackRows.length === 0) {
24
+ this.message = 'Unknown error';
25
+ return;
26
+ }
27
+ const messageRow = stackRows.find((line) => line.includes('Error:'));
28
+ const lineNumberRow = stackRows.find((line) => line.includes(`at ${VM_WRAPPER_FN_NAME} `));
29
+ const lineNumberDisplay = this.toLineNumberDisplay(lineNumberRow);
30
+ if (!messageRow) {
31
+ this.message = `Unknown error ${lineNumberDisplay}`;
32
+ return;
33
+ }
34
+ const [errorDetails, errorType] = this.toErrorDetailsAndType(messageRow);
35
+ if (errorType)
36
+ this.description = errorType;
37
+ if (!errorDetails) {
38
+ this.message = `Unknown error ${lineNumberDisplay}`;
39
+ return;
40
+ }
41
+ this.message = `${errorDetails} ${lineNumberDisplay}`;
42
+ }
43
+ toLineNumberDisplay(lineNumberRow) {
44
+ if (!lineNumberRow)
45
+ return '';
46
+ const regex = new RegExp(`at ${VM_WRAPPER_FN_NAME} \\(evalmachine\\.<anonymous>:(?<lineNumber>\\d+):`);
47
+ const errorLineNumberMatch = lineNumberRow.match(regex);
48
+ if (!errorLineNumberMatch?.groups?.lineNumber)
49
+ return null;
50
+ const lineNumber = errorLineNumberMatch.groups.lineNumber;
51
+ if (!lineNumber)
52
+ return '';
53
+ this.lineNumber = Number(lineNumber);
54
+ return this.itemIndex === undefined
55
+ ? `[line ${lineNumber}]`
56
+ : `[line ${lineNumber}, for item ${this.itemIndex}]`;
57
+ }
58
+ toErrorDetailsAndType(messageRow) {
59
+ if (!messageRow)
60
+ return [null, null];
61
+ const [errorDetails, errorType] = messageRow
62
+ .split(':')
63
+ .reverse()
64
+ .map((i) => i.trim());
65
+ return [errorDetails, errorType === 'Error' ? null : errorType];
66
+ }
67
+ }
68
+ exports.ExecutionError = ExecutionError;
69
+ //# sourceMappingURL=execution-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-error.js","sourceRoot":"","sources":["../../../src/js-task-runner/errors/execution-error.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare abstract class SerializableError extends Error {
2
+ constructor(message: string);
3
+ private makeMessageEnumerable;
4
+ }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SerializableError = void 0;
4
+ class SerializableError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.makeMessageEnumerable();
8
+ }
9
+ makeMessageEnumerable() {
10
+ Object.defineProperty(this, 'message', {
11
+ value: this.message,
12
+ enumerable: true,
13
+ writable: true,
14
+ configurable: true,
15
+ });
16
+ }
17
+ }
18
+ exports.SerializableError = SerializableError;
19
+ //# sourceMappingURL=serializable-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializable-error.js","sourceRoot":"","sources":["../../../src/js-task-runner/errors/serializable-error.ts"],"names":[],"mappings":";;;AAIA,MAAsB,iBAAkB,SAAQ,KAAK;IACpD,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QAGf,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC9B,CAAC;IAEO,qBAAqB;QAC5B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE;YACtC,KAAK,EAAE,IAAI,CAAC,OAAO;YACnB,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI;SAClB,CAAC,CAAC;IACJ,CAAC;CACD;AAhBD,8CAgBC"}
@@ -0,0 +1,15 @@
1
+ import { SerializableError } from './serializable-error';
2
+ export declare class ValidationError extends SerializableError {
3
+ description: string;
4
+ itemIndex: number | undefined;
5
+ context: {
6
+ itemIndex: number;
7
+ } | undefined;
8
+ lineNumber: number | undefined;
9
+ constructor({ message, description, itemIndex, lineNumber, }: {
10
+ message: string;
11
+ description: string;
12
+ itemIndex?: number;
13
+ lineNumber?: number;
14
+ });
15
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ValidationError = void 0;
4
+ const serializable_error_1 = require("./serializable-error");
5
+ class ValidationError extends serializable_error_1.SerializableError {
6
+ constructor({ message, description, itemIndex, lineNumber, }) {
7
+ super(message);
8
+ this.description = '';
9
+ this.itemIndex = undefined;
10
+ this.context = undefined;
11
+ this.lineNumber = undefined;
12
+ this.lineNumber = lineNumber;
13
+ this.itemIndex = itemIndex;
14
+ if (this.lineNumber !== undefined && this.itemIndex !== undefined) {
15
+ this.message = `${message} [line ${lineNumber}, for item ${itemIndex}]`;
16
+ }
17
+ else if (this.lineNumber !== undefined) {
18
+ this.message = `${message} [line ${lineNumber}]`;
19
+ }
20
+ else if (this.itemIndex !== undefined) {
21
+ this.message = `${message} [item ${itemIndex}]`;
22
+ }
23
+ else {
24
+ this.message = message;
25
+ }
26
+ this.description = description;
27
+ if (this.itemIndex !== undefined) {
28
+ this.context = { itemIndex: this.itemIndex };
29
+ }
30
+ }
31
+ }
32
+ exports.ValidationError = ValidationError;
33
+ //# sourceMappingURL=validation-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-error.js","sourceRoot":"","sources":["../../../src/js-task-runner/errors/validation-error.ts"],"names":[],"mappings":";;;AAAA,6DAAyD;AAEzD,MAAa,eAAgB,SAAQ,sCAAiB;IASrD,YAAY,EACX,OAAO,EACP,WAAW,EACX,SAAS,EACT,UAAU,GAMV;QACA,KAAK,CAAC,OAAO,CAAC,CAAC;QAnBhB,gBAAW,GAAG,EAAE,CAAC;QAEjB,cAAS,GAAuB,SAAS,CAAC;QAE1C,YAAO,GAAsC,SAAS,CAAC;QAEvD,eAAU,GAAuB,SAAS,CAAC;QAe1C,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACnE,IAAI,CAAC,OAAO,GAAG,GAAG,OAAO,UAAU,UAAU,cAAc,SAAS,GAAG,CAAC;QACzE,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,OAAO,GAAG,GAAG,OAAO,UAAU,UAAU,GAAG,CAAC;QAClD,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC,OAAO,GAAG,GAAG,OAAO,UAAU,SAAS,GAAG,CAAC;QACjD,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACxB,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAE/B,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9C,CAAC;IACF,CAAC;CACD;AAzCD,0CAyCC"}
@@ -1,8 +1,11 @@
1
- import { type INode, type ITaskDataConnections, type WorkflowParameters, type IDataObject, type IExecuteData, type INodeExecutionData, type INodeParameters, type IRunExecutionData, type WorkflowExecuteMode } from 'n8n-workflow';
2
- import type { TaskResultData } from './runner-types';
3
- import { type Task, TaskRunner } from './task-runner';
4
- interface JSExecSettings {
1
+ import type { CodeExecutionMode, INode, ITaskDataConnections, WorkflowParameters, IDataObject, IExecuteData, INodeExecutionData, INodeParameters, IRunExecutionData, WorkflowExecuteMode, EnvProviderState } from 'n8n-workflow';
2
+ import type { TaskResultData } from '../runner-types';
3
+ import { type Task, TaskRunner } from '../task-runner';
4
+ export interface JSExecSettings {
5
5
  code: string;
6
+ nodeMode: CodeExecutionMode;
7
+ workflowMode: WorkflowExecuteMode;
8
+ continueOnFail: boolean;
6
9
  mode: WorkflowExecuteMode;
7
10
  }
8
11
  export interface PartialAdditionalData {
@@ -30,14 +33,27 @@ export interface AllCodeTaskData {
30
33
  connectionInputData: INodeExecutionData[];
31
34
  siblingParameters: INodeParameters;
32
35
  mode: WorkflowExecuteMode;
36
+ envProviderState?: EnvProviderState;
33
37
  executeData?: IExecuteData;
34
38
  defaultReturnRunIndex: number;
35
39
  selfData: IDataObject;
36
40
  contextNodeName: string;
37
41
  additionalData: PartialAdditionalData;
38
42
  }
43
+ export interface JsTaskRunnerOpts {
44
+ wsUrl: string;
45
+ grantToken: string;
46
+ maxConcurrency: number;
47
+ name?: string;
48
+ allowedBuiltInModules?: string;
49
+ allowedExternalModules?: string;
50
+ }
39
51
  export declare class JsTaskRunner extends TaskRunner {
40
- constructor(taskType: string, wsUrl: string, grantToken: string, maxConcurrency: number, name?: string);
52
+ private readonly requireResolver;
53
+ constructor({ grantToken, maxConcurrency, wsUrl, name, allowedBuiltInModules, allowedExternalModules, }: JsTaskRunnerOpts);
41
54
  executeTask(task: Task<JSExecSettings>): Promise<TaskResultData>;
55
+ private runForAllItems;
56
+ private runForEachItem;
57
+ private createDataProxy;
58
+ private toExecutionErrorIfNeeded;
42
59
  }
43
- export {};
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.JsTaskRunner = void 0;
27
+ const n8n_core_1 = require("n8n-core");
28
+ const n8n_workflow_1 = require("n8n-workflow");
29
+ const a = __importStar(require("node:assert"));
30
+ const node_vm_1 = require("node:vm");
31
+ const task_runner_1 = require("../task-runner");
32
+ const error_like_1 = require("./errors/error-like");
33
+ const execution_error_1 = require("./errors/execution-error");
34
+ const require_resolver_1 = require("./require-resolver");
35
+ const result_validation_1 = require("./result-validation");
36
+ class JsTaskRunner extends task_runner_1.TaskRunner {
37
+ constructor({ grantToken, maxConcurrency, wsUrl, name = 'JS Task Runner', allowedBuiltInModules, allowedExternalModules, }) {
38
+ super('javascript', wsUrl, grantToken, maxConcurrency, name);
39
+ const parseModuleAllowList = (moduleList) => moduleList === '*' ? null : new Set(moduleList.split(',').map((x) => x.trim()));
40
+ this.requireResolver = (0, require_resolver_1.createRequireResolver)({
41
+ allowedBuiltInModules: parseModuleAllowList(allowedBuiltInModules ?? ''),
42
+ allowedExternalModules: parseModuleAllowList(allowedExternalModules ?? ''),
43
+ });
44
+ }
45
+ async executeTask(task) {
46
+ const allData = await this.requestData(task.taskId, 'all');
47
+ const settings = task.settings;
48
+ a.ok(settings, 'JS Code not sent to runner');
49
+ const workflowParams = allData.workflow;
50
+ const workflow = new n8n_workflow_1.Workflow({
51
+ ...workflowParams,
52
+ nodeTypes: {
53
+ getByNameAndVersion() {
54
+ return undefined;
55
+ },
56
+ getByName() {
57
+ return undefined;
58
+ },
59
+ getKnownTypes() {
60
+ return {};
61
+ },
62
+ },
63
+ });
64
+ const customConsole = {
65
+ log: (...args) => {
66
+ const logOutput = args
67
+ .map((arg) => (typeof arg === 'object' && arg !== null ? JSON.stringify(arg) : arg))
68
+ .join(' ');
69
+ void this.makeRpcCall(task.taskId, 'logNodeOutput', [logOutput]);
70
+ },
71
+ };
72
+ const result = settings.nodeMode === 'runOnceForAllItems'
73
+ ? await this.runForAllItems(task.taskId, settings, allData, workflow, customConsole)
74
+ : await this.runForEachItem(task.taskId, settings, allData, workflow, customConsole);
75
+ return {
76
+ result,
77
+ customData: allData.runExecutionData.resultData.metadata,
78
+ };
79
+ }
80
+ async runForAllItems(taskId, settings, allData, workflow, customConsole) {
81
+ const dataProxy = this.createDataProxy(allData, workflow, allData.itemIndex);
82
+ const inputItems = allData.connectionInputData;
83
+ const context = {
84
+ require: this.requireResolver,
85
+ module: {},
86
+ console: customConsole,
87
+ items: inputItems,
88
+ ...dataProxy,
89
+ ...this.buildRpcCallObject(taskId),
90
+ };
91
+ try {
92
+ const result = (await (0, node_vm_1.runInNewContext)(`module.exports = async function VmCodeWrapper() {${settings.code}\n}()`, context));
93
+ if (result === null) {
94
+ return [];
95
+ }
96
+ return (0, result_validation_1.validateRunForAllItemsOutput)(result);
97
+ }
98
+ catch (e) {
99
+ const error = this.toExecutionErrorIfNeeded(e);
100
+ if (settings.continueOnFail) {
101
+ return [{ json: { error: error.message } }];
102
+ }
103
+ throw error;
104
+ }
105
+ }
106
+ async runForEachItem(taskId, settings, allData, workflow, customConsole) {
107
+ const inputItems = allData.connectionInputData;
108
+ const returnData = [];
109
+ for (let index = 0; index < inputItems.length; index++) {
110
+ const item = inputItems[index];
111
+ const dataProxy = this.createDataProxy(allData, workflow, index);
112
+ const context = {
113
+ require: this.requireResolver,
114
+ module: {},
115
+ console: customConsole,
116
+ item,
117
+ ...dataProxy,
118
+ ...this.buildRpcCallObject(taskId),
119
+ };
120
+ try {
121
+ let result = (await (0, node_vm_1.runInNewContext)(`module.exports = async function VmCodeWrapper() {${settings.code}\n}()`, context));
122
+ if (result === null) {
123
+ continue;
124
+ }
125
+ result = (0, result_validation_1.validateRunForEachItemOutput)(result, index);
126
+ if (result) {
127
+ returnData.push(result.binary
128
+ ? {
129
+ json: result.json,
130
+ pairedItem: { item: index },
131
+ binary: result.binary,
132
+ }
133
+ : {
134
+ json: result.json,
135
+ pairedItem: { item: index },
136
+ });
137
+ }
138
+ }
139
+ catch (e) {
140
+ const error = this.toExecutionErrorIfNeeded(e);
141
+ if (!settings.continueOnFail) {
142
+ throw error;
143
+ }
144
+ returnData.push({
145
+ json: { error: error.message },
146
+ pairedItem: {
147
+ item: index,
148
+ },
149
+ });
150
+ }
151
+ }
152
+ return returnData;
153
+ }
154
+ createDataProxy(allData, workflow, itemIndex) {
155
+ return new n8n_workflow_1.WorkflowDataProxy(workflow, allData.runExecutionData, allData.runIndex, itemIndex, allData.activeNodeName, allData.connectionInputData, allData.siblingParameters, allData.mode, (0, n8n_core_1.getAdditionalKeys)(allData.additionalData, allData.mode, allData.runExecutionData), allData.executeData, allData.defaultReturnRunIndex, allData.selfData, allData.contextNodeName, allData.envProviderState ?? {
156
+ env: {},
157
+ isEnvAccessBlocked: false,
158
+ isProcessAvailable: true,
159
+ }).getDataProxy();
160
+ }
161
+ toExecutionErrorIfNeeded(error) {
162
+ if (error instanceof Error) {
163
+ return error;
164
+ }
165
+ if ((0, error_like_1.isErrorLike)(error)) {
166
+ return new execution_error_1.ExecutionError(error);
167
+ }
168
+ return new execution_error_1.ExecutionError({ message: JSON.stringify(error) });
169
+ }
170
+ }
171
+ exports.JsTaskRunner = JsTaskRunner;
172
+ //# sourceMappingURL=js-task-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js-task-runner.js","sourceRoot":"","sources":["../../src/js-task-runner/js-task-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function isObject(maybe: unknown): maybe is {
2
+ [key: string]: unknown;
3
+ };
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isObject = isObject;
4
+ function isObject(maybe) {
5
+ return (typeof maybe === 'object' && maybe !== null && !Array.isArray(maybe) && !(maybe instanceof Date));
6
+ }
7
+ //# sourceMappingURL=obj-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obj-utils.js","sourceRoot":"","sources":["../../src/js-task-runner/obj-utils.ts"],"names":[],"mappings":";;AAAA,4BAIC;AAJD,SAAgB,QAAQ,CAAC,KAAc;IACtC,OAAO,CACN,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,CAChG,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type RequireResolverOpts = {
2
+ allowedBuiltInModules: Set<string> | null;
3
+ allowedExternalModules: Set<string> | null;
4
+ };
5
+ export type RequireResolver = (request: string) => unknown;
6
+ export declare function createRequireResolver({ allowedBuiltInModules, allowedExternalModules, }: RequireResolverOpts): (request: string) => unknown;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createRequireResolver = createRequireResolver;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ const node_module_1 = require("node:module");
6
+ const execution_error_1 = require("./errors/execution-error");
7
+ function createRequireResolver({ allowedBuiltInModules, allowedExternalModules, }) {
8
+ return (request) => {
9
+ const checkIsAllowed = (allowList, moduleName) => {
10
+ return allowList ? allowList.has(moduleName) : true;
11
+ };
12
+ const isAllowed = (0, node_module_1.isBuiltin)(request)
13
+ ? checkIsAllowed(allowedBuiltInModules, request)
14
+ : checkIsAllowed(allowedExternalModules, request);
15
+ if (!isAllowed) {
16
+ const error = new n8n_workflow_1.ApplicationError(`Cannot find module '${request}'`);
17
+ throw new execution_error_1.ExecutionError(error);
18
+ }
19
+ return require(request);
20
+ };
21
+ }
22
+ //# sourceMappingURL=require-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-resolver.js","sourceRoot":"","sources":["../../src/js-task-runner/require-resolver.ts"],"names":[],"mappings":";;AAqBA,sDAqBC;AA1CD,+CAAgD;AAChD,6CAAwC;AAExC,8DAA0D;AAkB1D,SAAgB,qBAAqB,CAAC,EACrC,qBAAqB,EACrB,sBAAsB,GACD;IACrB,OAAO,CAAC,OAAe,EAAE,EAAE;QAC1B,MAAM,cAAc,GAAG,CAAC,SAA6B,EAAE,UAAkB,EAAE,EAAE;YAC5E,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrD,CAAC,CAAC;QAEF,MAAM,SAAS,GAAG,IAAA,uBAAS,EAAC,OAAO,CAAC;YACnC,CAAC,CAAC,cAAc,CAAC,qBAAqB,EAAE,OAAO,CAAC;YAChD,CAAC,CAAC,cAAc,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;QAEnD,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,IAAI,+BAAgB,CAAC,uBAAuB,OAAO,GAAG,CAAC,CAAC;YACtE,MAAM,IAAI,gCAAc,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QAGD,OAAO,OAAO,CAAC,OAAO,CAAY,CAAC;IACpC,CAAC,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { INodeExecutionData } from 'n8n-workflow';
2
+ export declare const REQUIRED_N8N_ITEM_KEYS: Set<string>;
3
+ export declare function validateRunForAllItemsOutput(executionResult: INodeExecutionData | INodeExecutionData[] | undefined): INodeExecutionData[];
4
+ export declare function validateRunForEachItemOutput(executionResult: INodeExecutionData | undefined, itemIndex: number): INodeExecutionData;
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.REQUIRED_N8N_ITEM_KEYS = void 0;
4
+ exports.validateRunForAllItemsOutput = validateRunForAllItemsOutput;
5
+ exports.validateRunForEachItemOutput = validateRunForEachItemOutput;
6
+ const n8n_core_1 = require("n8n-core");
7
+ const validation_error_1 = require("./errors/validation-error");
8
+ const obj_utils_1 = require("./obj-utils");
9
+ exports.REQUIRED_N8N_ITEM_KEYS = new Set(['json', 'binary', 'pairedItem', 'error']);
10
+ function validateTopLevelKeys(item, itemIndex) {
11
+ for (const key in item) {
12
+ if (Object.prototype.hasOwnProperty.call(item, key)) {
13
+ if (exports.REQUIRED_N8N_ITEM_KEYS.has(key))
14
+ return;
15
+ throw new validation_error_1.ValidationError({
16
+ message: `Unknown top-level item key: ${key}`,
17
+ description: 'Access the properties of an item under `.json`, e.g. `item.json`',
18
+ itemIndex,
19
+ });
20
+ }
21
+ }
22
+ }
23
+ function validateItem({ json, binary }, itemIndex) {
24
+ if (json === undefined || !(0, obj_utils_1.isObject)(json)) {
25
+ throw new validation_error_1.ValidationError({
26
+ message: "A 'json' property isn't an object",
27
+ description: "In the returned data, every key named 'json' must point to an object.",
28
+ itemIndex,
29
+ });
30
+ }
31
+ if (binary !== undefined && !(0, obj_utils_1.isObject)(binary)) {
32
+ throw new validation_error_1.ValidationError({
33
+ message: "A 'binary' property isn't an object",
34
+ description: "In the returned data, every key named 'binary' must point to an object.",
35
+ itemIndex,
36
+ });
37
+ }
38
+ }
39
+ function validateRunForAllItemsOutput(executionResult) {
40
+ if (typeof executionResult !== 'object') {
41
+ throw new validation_error_1.ValidationError({
42
+ message: "Code doesn't return items properly",
43
+ description: 'Please return an array of objects, one for each item you would like to output.',
44
+ });
45
+ }
46
+ if (Array.isArray(executionResult)) {
47
+ const mustHaveTopLevelN8nKey = executionResult.some((item) => Object.keys(item).find((key) => exports.REQUIRED_N8N_ITEM_KEYS.has(key)));
48
+ if (mustHaveTopLevelN8nKey) {
49
+ for (let index = 0; index < executionResult.length; index++) {
50
+ const item = executionResult[index];
51
+ validateTopLevelKeys(item, index);
52
+ }
53
+ }
54
+ }
55
+ const returnData = (0, n8n_core_1.normalizeItems)(executionResult);
56
+ returnData.forEach(validateItem);
57
+ return returnData;
58
+ }
59
+ function validateRunForEachItemOutput(executionResult, itemIndex) {
60
+ if (typeof executionResult !== 'object') {
61
+ throw new validation_error_1.ValidationError({
62
+ message: "Code doesn't return an object",
63
+ description: `Please return an object representing the output item. ('${executionResult}' was returned instead.)`,
64
+ itemIndex,
65
+ });
66
+ }
67
+ if (Array.isArray(executionResult)) {
68
+ const firstSentence = executionResult.length > 0
69
+ ? `An array of ${typeof executionResult[0]}s was returned.`
70
+ : 'An empty array was returned.';
71
+ throw new validation_error_1.ValidationError({
72
+ message: "Code doesn't return a single object",
73
+ description: `${firstSentence} If you need to output multiple items, please use the 'Run Once for All Items' mode instead.`,
74
+ itemIndex,
75
+ });
76
+ }
77
+ const [returnData] = (0, n8n_core_1.normalizeItems)([executionResult]);
78
+ validateItem(returnData, itemIndex);
79
+ validateTopLevelKeys(returnData, itemIndex);
80
+ return returnData;
81
+ }
82
+ //# sourceMappingURL=result-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-validation.js","sourceRoot":"","sources":["../../src/js-task-runner/result-validation.ts"],"names":[],"mappings":";;;AA2CA,oEAiCC;AAKD,oEAkCC;AAnHD,uCAA0C;AAG1C,gEAA4D;AAC5D,2CAAuC;AAE1B,QAAA,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;AAEzF,SAAS,oBAAoB,CAAC,IAAwB,EAAE,SAAiB;IACxE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YACrD,IAAI,8BAAsB,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO;YAE5C,MAAM,IAAI,kCAAe,CAAC;gBACzB,OAAO,EAAE,+BAA+B,GAAG,EAAE;gBAC7C,WAAW,EAAE,kEAAkE;gBAC/E,SAAS;aACT,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAsB,EAAE,SAAiB;IAC5E,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAA,oBAAQ,EAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,kCAAe,CAAC;YACzB,OAAO,EAAE,mCAAmC;YAC5C,WAAW,EAAE,uEAAuE;YACpF,SAAS;SACT,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,IAAA,oBAAQ,EAAC,MAAM,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,kCAAe,CAAC;YACzB,OAAO,EAAE,qCAAqC;YAC9C,WAAW,EAAE,yEAAyE;YACtF,SAAS;SACT,CAAC,CAAC;IACJ,CAAC;AACF,CAAC;AAKD,SAAgB,4BAA4B,CAC3C,eAAsE;IAEtE,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE,CAAC;QACzC,MAAM,IAAI,kCAAe,CAAC;YACzB,OAAO,EAAE,oCAAoC;YAC7C,WAAW,EAAE,gFAAgF;SAC7F,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QAQpC,MAAM,sBAAsB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAC5D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,8BAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAChE,CAAC;QAEF,IAAI,sBAAsB,EAAE,CAAC;YAC5B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC7D,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;gBACpC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACnC,CAAC;QACF,CAAC;IACF,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,yBAAc,EAAC,eAAe,CAAC,CAAC;IACnD,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACjC,OAAO,UAAU,CAAC;AACnB,CAAC;AAKD,SAAgB,4BAA4B,CAC3C,eAA+C,EAC/C,SAAiB;IAEjB,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE,CAAC;QACzC,MAAM,IAAI,kCAAe,CAAC;YACzB,OAAO,EAAE,+BAA+B;YACxC,WAAW,EAAE,2DAA2D,eAAe,0BAA0B;YACjH,SAAS;SACT,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,MAAM,aAAa,GAClB,eAAe,CAAC,MAAM,GAAG,CAAC;YACzB,CAAC,CAAC,eAAe,OAAO,eAAe,CAAC,CAAC,CAAC,iBAAiB;YAC3D,CAAC,CAAC,8BAA8B,CAAC;QACnC,MAAM,IAAI,kCAAe,CAAC;YACzB,OAAO,EAAE,qCAAqC;YAC9C,WAAW,EAAE,GAAG,aAAa,8FAA8F;YAC3H,SAAS;SACT,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,GAAG,IAAA,yBAAc,EAAC,CAAC,eAAe,CAAC,CAAC,CAAC;IAEvD,YAAY,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAKpC,oBAAoB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAE5C,OAAO,UAAU,CAAC;AACnB,CAAC"}
package/dist/start.js CHANGED
@@ -26,7 +26,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
26
26
  const n8n_workflow_1 = require("n8n-workflow");
27
27
  const a = __importStar(require("node:assert/strict"));
28
28
  const authenticator_1 = require("./authenticator");
29
- const code_1 = require("./code");
29
+ const js_task_runner_1 = require("./js-task-runner/js-task-runner");
30
+ let runner;
31
+ let isShuttingDown = false;
30
32
  function readAndParseConfig() {
31
33
  const authToken = process.env.N8N_RUNNERS_AUTH_TOKEN;
32
34
  const grantToken = process.env.N8N_RUNNERS_GRANT_TOKEN;
@@ -34,11 +36,33 @@ function readAndParseConfig() {
34
36
  throw new n8n_workflow_1.ApplicationError('Missing task runner authentication. Use either N8N_RUNNERS_AUTH_TOKEN or N8N_RUNNERS_GRANT_TOKEN to configure it');
35
37
  }
36
38
  return {
37
- n8nUri: process.env.N8N_RUNNERS_N8N_URI ?? 'localhost:5678',
39
+ n8nUri: process.env.N8N_RUNNERS_N8N_URI ?? '127.0.0.1:5679',
38
40
  authToken,
39
41
  grantToken,
40
42
  };
41
43
  }
44
+ function createSignalHandler(signal) {
45
+ return async function onSignal() {
46
+ if (isShuttingDown) {
47
+ return;
48
+ }
49
+ console.log(`Received ${signal} signal, shutting down...`);
50
+ isShuttingDown = true;
51
+ try {
52
+ if (runner) {
53
+ await runner.stop();
54
+ runner = undefined;
55
+ }
56
+ }
57
+ catch (e) {
58
+ const error = (0, n8n_workflow_1.ensureError)(e);
59
+ console.error('Error stopping task runner', { error });
60
+ }
61
+ finally {
62
+ process.exit(0);
63
+ }
64
+ };
65
+ }
42
66
  void (async function start() {
43
67
  const config = readAndParseConfig();
44
68
  let grantToken = config.grantToken;
@@ -50,7 +74,15 @@ void (async function start() {
50
74
  });
51
75
  }
52
76
  const wsUrl = `ws://${config.n8nUri}/runners/_ws`;
53
- new code_1.JsTaskRunner('javascript', wsUrl, grantToken, 5);
77
+ runner = new js_task_runner_1.JsTaskRunner({
78
+ wsUrl,
79
+ grantToken,
80
+ maxConcurrency: 5,
81
+ allowedBuiltInModules: process.env.NODE_FUNCTION_ALLOW_BUILTIN,
82
+ allowedExternalModules: process.env.NODE_FUNCTION_ALLOW_EXTERNAL,
83
+ });
84
+ process.on('SIGINT', createSignalHandler('SIGINT'));
85
+ process.on('SIGTERM', createSignalHandler('SIGTERM'));
54
86
  })().catch((e) => {
55
87
  const error = (0, n8n_workflow_1.ensureError)(e);
56
88
  console.error('Task runner failed to start', { error });