@n8n/task-runner 1.9.1 → 1.10.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.
- package/dist/build.tsbuildinfo +1 -1
- package/dist/config/base-runner-config.d.ts +2 -1
- package/dist/config/base-runner-config.js +11 -6
- package/dist/config/base-runner-config.js.map +1 -1
- package/dist/error-reporter.d.ts +1 -1
- package/dist/error-reporter.js +1 -2
- package/dist/error-reporter.js.map +1 -1
- package/dist/{healthcheck-server.d.ts → health-check-server.d.ts} +1 -1
- package/dist/{healthcheck-server.js → health-check-server.js} +5 -5
- package/dist/health-check-server.js.map +1 -0
- package/dist/js-task-runner/errors/task-cancelled-error.d.ts +4 -0
- package/dist/js-task-runner/errors/task-cancelled-error.js +11 -0
- package/dist/js-task-runner/errors/task-cancelled-error.js.map +1 -0
- package/dist/js-task-runner/errors/timeout-error.d.ts +5 -0
- package/dist/js-task-runner/errors/timeout-error.js +22 -0
- package/dist/js-task-runner/errors/timeout-error.js.map +1 -0
- package/dist/js-task-runner/js-task-runner.d.ts +1 -1
- package/dist/js-task-runner/js-task-runner.js +32 -7
- package/dist/js-task-runner/js-task-runner.js.map +1 -1
- package/dist/start.js +11 -7
- package/dist/start.js.map +1 -1
- package/dist/task-runner.d.ts +6 -2
- package/dist/task-runner.js +42 -11
- package/dist/task-runner.js.map +1 -1
- package/package.json +5 -6
- package/dist/healthcheck-server.js.map +0 -1
|
@@ -4,12 +4,13 @@ declare class HealthcheckServerConfig {
|
|
|
4
4
|
port: number;
|
|
5
5
|
}
|
|
6
6
|
export declare class BaseRunnerConfig {
|
|
7
|
-
|
|
7
|
+
taskBrokerUri: string;
|
|
8
8
|
grantToken: string;
|
|
9
9
|
maxPayloadSize: number;
|
|
10
10
|
maxConcurrency: number;
|
|
11
11
|
idleTimeout: number;
|
|
12
12
|
timezone: string;
|
|
13
|
+
taskTimeout: number;
|
|
13
14
|
healthcheckServer: HealthcheckServerConfig;
|
|
14
15
|
}
|
|
15
16
|
export {};
|
|
@@ -19,15 +19,15 @@ let HealthcheckServerConfig = class HealthcheckServerConfig {
|
|
|
19
19
|
}
|
|
20
20
|
};
|
|
21
21
|
__decorate([
|
|
22
|
-
(0, config_1.Env)('
|
|
22
|
+
(0, config_1.Env)('N8N_RUNNERS_HEALTH_CHECK_SERVER_ENABLED'),
|
|
23
23
|
__metadata("design:type", Boolean)
|
|
24
24
|
], HealthcheckServerConfig.prototype, "enabled", void 0);
|
|
25
25
|
__decorate([
|
|
26
|
-
(0, config_1.Env)('
|
|
26
|
+
(0, config_1.Env)('N8N_RUNNERS_HEALTH_CHECK_SERVER_HOST'),
|
|
27
27
|
__metadata("design:type", String)
|
|
28
28
|
], HealthcheckServerConfig.prototype, "host", void 0);
|
|
29
29
|
__decorate([
|
|
30
|
-
(0, config_1.Env)('
|
|
30
|
+
(0, config_1.Env)('N8N_RUNNERS_HEALTH_CHECK_SERVER_PORT'),
|
|
31
31
|
__metadata("design:type", Number)
|
|
32
32
|
], HealthcheckServerConfig.prototype, "port", void 0);
|
|
33
33
|
HealthcheckServerConfig = __decorate([
|
|
@@ -35,19 +35,20 @@ HealthcheckServerConfig = __decorate([
|
|
|
35
35
|
], HealthcheckServerConfig);
|
|
36
36
|
let BaseRunnerConfig = class BaseRunnerConfig {
|
|
37
37
|
constructor() {
|
|
38
|
-
this.
|
|
38
|
+
this.taskBrokerUri = 'http://127.0.0.1:5679';
|
|
39
39
|
this.grantToken = '';
|
|
40
40
|
this.maxPayloadSize = 1024 * 1024 * 1024;
|
|
41
41
|
this.maxConcurrency = 5;
|
|
42
42
|
this.idleTimeout = 0;
|
|
43
43
|
this.timezone = 'America/New_York';
|
|
44
|
+
this.taskTimeout = 60;
|
|
44
45
|
}
|
|
45
46
|
};
|
|
46
47
|
exports.BaseRunnerConfig = BaseRunnerConfig;
|
|
47
48
|
__decorate([
|
|
48
|
-
(0, config_1.Env)('
|
|
49
|
+
(0, config_1.Env)('N8N_RUNNERS_TASK_BROKER_URI'),
|
|
49
50
|
__metadata("design:type", String)
|
|
50
|
-
], BaseRunnerConfig.prototype, "
|
|
51
|
+
], BaseRunnerConfig.prototype, "taskBrokerUri", void 0);
|
|
51
52
|
__decorate([
|
|
52
53
|
(0, config_1.Env)('N8N_RUNNERS_GRANT_TOKEN'),
|
|
53
54
|
__metadata("design:type", String)
|
|
@@ -68,6 +69,10 @@ __decorate([
|
|
|
68
69
|
(0, config_1.Env)('GENERIC_TIMEZONE'),
|
|
69
70
|
__metadata("design:type", String)
|
|
70
71
|
], BaseRunnerConfig.prototype, "timezone", void 0);
|
|
72
|
+
__decorate([
|
|
73
|
+
(0, config_1.Env)('N8N_RUNNERS_TASK_TIMEOUT'),
|
|
74
|
+
__metadata("design:type", Number)
|
|
75
|
+
], BaseRunnerConfig.prototype, "taskTimeout", void 0);
|
|
71
76
|
__decorate([
|
|
72
77
|
config_1.Nested,
|
|
73
78
|
__metadata("design:type", HealthcheckServerConfig)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-runner-config.js","sourceRoot":"","sources":["../../src/config/base-runner-config.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wCAAkD;AAGlD,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAA7B;QAEC,YAAO,GAAY,KAAK,CAAC;QAGzB,SAAI,GAAW,WAAW,CAAC;QAG3B,SAAI,GAAW,IAAI,CAAC;IACrB,CAAC;CAAA,CAAA;AAPA;IADC,IAAA,YAAG,EAAC,
|
|
1
|
+
{"version":3,"file":"base-runner-config.js","sourceRoot":"","sources":["../../src/config/base-runner-config.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wCAAkD;AAGlD,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAA7B;QAEC,YAAO,GAAY,KAAK,CAAC;QAGzB,SAAI,GAAW,WAAW,CAAC;QAG3B,SAAI,GAAW,IAAI,CAAC;IACrB,CAAC;CAAA,CAAA;AAPA;IADC,IAAA,YAAG,EAAC,yCAAyC,CAAC;;wDACtB;AAGzB;IADC,IAAA,YAAG,EAAC,sCAAsC,CAAC;;qDACjB;AAG3B;IADC,IAAA,YAAG,EAAC,sCAAsC,CAAC;;qDACxB;AARf,uBAAuB;IAD5B,eAAM;GACD,uBAAuB,CAS5B;AAGM,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAAtB;QAEN,kBAAa,GAAW,uBAAuB,CAAC;QAGhD,eAAU,GAAW,EAAE,CAAC;QAGxB,mBAAc,GAAW,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;QAG5C,mBAAc,GAAW,CAAC,CAAC;QAQ3B,gBAAW,GAAW,CAAC,CAAC;QAGxB,aAAQ,GAAW,kBAAkB,CAAC;QAGtC,gBAAW,GAAW,EAAE,CAAC;IAI1B,CAAC;CAAA,CAAA;AA7BY,4CAAgB;AAE5B;IADC,IAAA,YAAG,EAAC,6BAA6B,CAAC;;uDACa;AAGhD;IADC,IAAA,YAAG,EAAC,yBAAyB,CAAC;;oDACP;AAGxB;IADC,IAAA,YAAG,EAAC,yBAAyB,CAAC;;wDACa;AAG5C;IADC,IAAA,YAAG,EAAC,6BAA6B,CAAC;;wDACR;AAQ3B;IADC,IAAA,YAAG,EAAC,mCAAmC,CAAC;;qDACjB;AAGxB;IADC,IAAA,YAAG,EAAC,kBAAkB,CAAC;;kDACc;AAGtC;IADC,IAAA,YAAG,EAAC,0BAA0B,CAAC;;qDACP;AAGzB;IADC,eAAM;8BACa,uBAAuB;2DAAC;2BA5BhC,gBAAgB;IAD5B,eAAM;GACM,gBAAgB,CA6B5B"}
|
package/dist/error-reporter.d.ts
CHANGED
package/dist/error-reporter.js
CHANGED
|
@@ -34,7 +34,6 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.ErrorReporter = void 0;
|
|
37
|
-
const integrations_1 = require("@sentry/integrations");
|
|
38
37
|
const node_1 = require("@sentry/node");
|
|
39
38
|
const a = __importStar(require("assert/strict"));
|
|
40
39
|
const crypto_1 = require("crypto");
|
|
@@ -72,7 +71,7 @@ class ErrorReporter {
|
|
|
72
71
|
beforeSend: async (event, hint) => await this.beforeSend(event, hint),
|
|
73
72
|
integrations: (integrations) => [
|
|
74
73
|
...integrations.filter(({ name }) => ENABLED_INTEGRATIONS.includes(name)),
|
|
75
|
-
|
|
74
|
+
(0, node_1.rewriteFramesIntegration)({ root: process.cwd() }),
|
|
76
75
|
],
|
|
77
76
|
});
|
|
78
77
|
this.isInitialized = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-reporter.js","sourceRoot":"","sources":["../src/error-reporter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"error-reporter.js","sourceRoot":"","sources":["../src/error-reporter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAQsB;AACtB,iDAAmC;AACnC,mCAAoC;AACpC,+CAAgD;AAOhD,MAAa,aAAa;IAMzB,IAAY,GAAG;QACd,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;IACpC,CAAC;IAED,YAA6B,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;QAT/C,kBAAa,GAAG,KAAK,CAAC;QAGb,eAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QAO/C,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,6CAA6C,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,KAAK;QACV,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO;QAG/B,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC;QAE3B,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,uBAAgB,CAAC,CAAC;QAElD,MAAM,oBAAoB,GAAG;YAC5B,gBAAgB;YAChB,kBAAkB;YAClB,cAAc;YACd,sBAAsB;YACtB,cAAc;SACd,CAAC;QAEF,IAAA,aAAM,EAAC,aAAa,EAAE,aAAa,CAAC,CAAC;QAErC,IAAA,WAAI,EAAC;YACJ,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU;YACrC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,WAAW;YAC1C,aAAa,EAAE,KAAK;YACpB,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,cAAc;YAC5C,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI;YAC5B,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC;YACrE,YAAY,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC;gBAC/B,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACzE,IAAA,+BAAwB,EAAC,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;aACjD;SACD,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,IAAI;QACT,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QAED,MAAM,IAAA,YAAK,EAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAiB,EAAE,EAAE,iBAAiB,EAAa;QACnE,IAAI,CAAC,iBAAiB;YAAE,OAAO,IAAI,CAAC;QAEpC,IAAI,iBAAiB,YAAY,OAAO,EAAE,CAAC;YAC1C,iBAAiB,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAc,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,iBAAiB,YAAY,+BAAgB,EAAE,CAAC;YACnD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,iBAAiB,CAAC;YACjD,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC;YACrC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;YACpB,IAAI,KAAK;gBAAE,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC;YACtD,IAAI,IAAI;gBAAE,KAAK,CAAC,IAAI,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;QACnD,CAAC;QAED,IAAI,iBAAiB,YAAY,KAAK,IAAI,iBAAiB,CAAC,KAAK,EAAE,CAAC;YACnE,MAAM,SAAS,GAAG,IAAA,mBAAU,EAAC,MAAM,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACtF,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAC;YAChD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,KAAK,CAAC;IACd,CAAC;CACD;AAhFD,sCAgFC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.HealthCheckServer = void 0;
|
|
4
4
|
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
5
|
const node_http_1 = require("node:http");
|
|
6
|
-
class
|
|
6
|
+
class HealthCheckServer {
|
|
7
7
|
constructor() {
|
|
8
8
|
this.server = (0, node_http_1.createServer)((_, res) => {
|
|
9
9
|
res.writeHead(200);
|
|
@@ -23,7 +23,7 @@ class HealthcheckServer {
|
|
|
23
23
|
this.server.on('error', portInUseErrorHandler);
|
|
24
24
|
this.server.listen(port, host, () => {
|
|
25
25
|
this.server.removeListener('error', portInUseErrorHandler);
|
|
26
|
-
console.log(`
|
|
26
|
+
console.log(`Health check server listening on ${host}, port ${port}`);
|
|
27
27
|
resolve();
|
|
28
28
|
});
|
|
29
29
|
});
|
|
@@ -39,5 +39,5 @@ class HealthcheckServer {
|
|
|
39
39
|
});
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
|
-
exports.
|
|
43
|
-
//# sourceMappingURL=
|
|
42
|
+
exports.HealthCheckServer = HealthCheckServer;
|
|
43
|
+
//# sourceMappingURL=health-check-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-check-server.js","sourceRoot":"","sources":["../src/health-check-server.ts"],"names":[],"mappings":";;;AAAA,+CAAgD;AAChD,yCAAyC;AAEzC,MAAa,iBAAiB;IAA9B;QACS,WAAM,GAAG,IAAA,wBAAY,EAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;YACxC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;IA8BJ,CAAC;IA5BA,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,IAAY;QACrC,OAAO,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClD,MAAM,qBAAqB,GAAG,CAAC,KAA4B,EAAE,EAAE;gBAC9D,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBACjC,MAAM,CAAC,IAAI,+BAAgB,CAAC,QAAQ,IAAI,oBAAoB,CAAC,CAAC,CAAC;gBAChE,CAAC;qBAAM,CAAC;oBACP,MAAM,CAAC,KAAK,CAAC,CAAC;gBACf,CAAC;YACF,CAAC,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;YAE/C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;gBACnC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;gBAC3D,OAAO,CAAC,GAAG,CAAC,oCAAoC,IAAI,UAAU,IAAI,EAAE,CAAC,CAAC;gBACtE,OAAO,EAAE,CAAC;YACX,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI;QACT,OAAO,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC3B,IAAI,KAAK;oBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;;oBACpB,OAAO,EAAE,CAAC;YAChB,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC;CACD;AAlCD,8CAkCC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TaskCancelledError = void 0;
|
|
4
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
|
+
class TaskCancelledError extends n8n_workflow_1.ApplicationError {
|
|
6
|
+
constructor(reason) {
|
|
7
|
+
super(`Task cancelled: ${reason}`, { level: 'warning' });
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.TaskCancelledError = TaskCancelledError;
|
|
11
|
+
//# sourceMappingURL=task-cancelled-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-cancelled-error.js","sourceRoot":"","sources":["../../../src/js-task-runner/errors/task-cancelled-error.ts"],"names":[],"mappings":";;;AAAA,+CAAgD;AAEhD,MAAa,kBAAmB,SAAQ,+BAAgB;IACvD,YAAY,MAAc;QACzB,KAAK,CAAC,mBAAmB,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1D,CAAC;CACD;AAJD,gDAIC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TimeoutError = void 0;
|
|
4
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
|
+
class TimeoutError extends n8n_workflow_1.ApplicationError {
|
|
6
|
+
constructor(taskTimeout) {
|
|
7
|
+
super(`Task execution timed out after ${taskTimeout} ${taskTimeout === 1 ? 'second' : 'seconds'}`);
|
|
8
|
+
const subtitle = 'The task runner was taking too long on this task, so the task was aborted.';
|
|
9
|
+
const fixes = {
|
|
10
|
+
optimizeScript: 'Optimize your script to prevent long-running tasks, e.g. by processing data in smaller batches.',
|
|
11
|
+
ensureTermination: 'Ensure that all paths in your script are able to terminate, i.e. no infinite loops.',
|
|
12
|
+
};
|
|
13
|
+
const suggestions = [fixes.optimizeScript, fixes.ensureTermination];
|
|
14
|
+
const suggestionsText = suggestions
|
|
15
|
+
.map((suggestion, index) => `${index + 1}. ${suggestion}`)
|
|
16
|
+
.join('<br/>');
|
|
17
|
+
const description = `${subtitle} You can try the following:<br/><br/>${suggestionsText}`;
|
|
18
|
+
this.description = description;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.TimeoutError = TimeoutError;
|
|
22
|
+
//# sourceMappingURL=timeout-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout-error.js","sourceRoot":"","sources":["../../../src/js-task-runner/errors/timeout-error.ts"],"names":[],"mappings":";;;AAAA,+CAAgD;AAEhD,MAAa,YAAa,SAAQ,+BAAgB;IAGjD,YAAY,WAAmB;QAC9B,KAAK,CACJ,kCAAkC,WAAW,IAAI,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAC3F,CAAC;QAEF,MAAM,QAAQ,GAAG,4EAA4E,CAAC;QAE9F,MAAM,KAAK,GAAG;YACb,cAAc,EACb,iGAAiG;YAClG,iBAAiB,EAChB,qFAAqF;SACtF,CAAC;QAEF,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAEpE,MAAM,eAAe,GAAG,WAAW;aACjC,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,UAAU,EAAE,CAAC;aACzD,IAAI,CAAC,OAAO,CAAC,CAAC;QAEhB,MAAM,WAAW,GAAG,GAAG,QAAQ,wCAAwC,eAAe,EAAE,CAAC;QAEzF,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,CAAC;CACD;AA3BD,oCA2BC"}
|
|
@@ -32,7 +32,7 @@ export declare class JsTaskRunner extends TaskRunner {
|
|
|
32
32
|
private readonly builtInsParser;
|
|
33
33
|
private readonly taskDataReconstruct;
|
|
34
34
|
constructor(config: MainConfig, name?: string);
|
|
35
|
-
executeTask(task: Task<JSExecSettings
|
|
35
|
+
executeTask(task: Task<JSExecSettings>, signal: AbortSignal): Promise<TaskResultData>;
|
|
36
36
|
private validateTaskSettings;
|
|
37
37
|
private getNativeVariables;
|
|
38
38
|
private runForAllItems;
|
|
@@ -44,6 +44,7 @@ const built_ins_parser_state_1 = require("./built-ins-parser/built-ins-parser-st
|
|
|
44
44
|
const error_like_1 = require("./errors/error-like");
|
|
45
45
|
const execution_error_1 = require("./errors/execution-error");
|
|
46
46
|
const serializable_error_1 = require("./errors/serializable-error");
|
|
47
|
+
const timeout_error_1 = require("./errors/timeout-error");
|
|
47
48
|
const require_resolver_1 = require("./require-resolver");
|
|
48
49
|
const result_validation_1 = require("./result-validation");
|
|
49
50
|
const data_request_response_reconstruct_1 = require("../data-request/data-request-response-reconstruct");
|
|
@@ -63,7 +64,7 @@ class JsTaskRunner extends task_runner_1.TaskRunner {
|
|
|
63
64
|
allowedExternalModules: parseModuleAllowList(jsRunnerConfig.allowedExternalModules ?? ''),
|
|
64
65
|
});
|
|
65
66
|
}
|
|
66
|
-
async executeTask(task) {
|
|
67
|
+
async executeTask(task, signal) {
|
|
67
68
|
const settings = task.settings;
|
|
68
69
|
a.ok(settings, 'JS Code not sent to runner');
|
|
69
70
|
this.validateTaskSettings(settings);
|
|
@@ -88,8 +89,8 @@ class JsTaskRunner extends task_runner_1.TaskRunner {
|
|
|
88
89
|
},
|
|
89
90
|
};
|
|
90
91
|
const result = settings.nodeMode === 'runOnceForAllItems'
|
|
91
|
-
? await this.runForAllItems(task.taskId, settings, data, workflow, customConsole)
|
|
92
|
-
: await this.runForEachItem(task.taskId, settings, data, workflow, customConsole);
|
|
92
|
+
? await this.runForAllItems(task.taskId, settings, data, workflow, customConsole, signal)
|
|
93
|
+
: await this.runForEachItem(task.taskId, settings, data, workflow, customConsole, signal);
|
|
93
94
|
return {
|
|
94
95
|
result,
|
|
95
96
|
customData: data.runExecutionData.resultData.metadata,
|
|
@@ -121,7 +122,7 @@ class JsTaskRunner extends task_runner_1.TaskRunner {
|
|
|
121
122
|
FormData,
|
|
122
123
|
};
|
|
123
124
|
}
|
|
124
|
-
async runForAllItems(taskId, settings, data, workflow, customConsole) {
|
|
125
|
+
async runForAllItems(taskId, settings, data, workflow, customConsole, signal) {
|
|
125
126
|
const dataProxy = this.createDataProxy(data, workflow, data.itemIndex);
|
|
126
127
|
const inputItems = data.connectionInputData;
|
|
127
128
|
const context = {
|
|
@@ -134,7 +135,19 @@ class JsTaskRunner extends task_runner_1.TaskRunner {
|
|
|
134
135
|
...this.buildRpcCallObject(taskId),
|
|
135
136
|
};
|
|
136
137
|
try {
|
|
137
|
-
const result =
|
|
138
|
+
const result = await new Promise((resolve, reject) => {
|
|
139
|
+
const abortHandler = () => {
|
|
140
|
+
reject(new timeout_error_1.TimeoutError(this.taskTimeout));
|
|
141
|
+
};
|
|
142
|
+
signal.addEventListener('abort', abortHandler, { once: true });
|
|
143
|
+
const taskResult = (0, node_vm_1.runInNewContext)(`globalThis.global = globalThis; module.exports = async function VmCodeWrapper() {${settings.code}\n}()`, context, { timeout: this.taskTimeout * 1000 });
|
|
144
|
+
void taskResult
|
|
145
|
+
.then(resolve)
|
|
146
|
+
.catch(reject)
|
|
147
|
+
.finally(() => {
|
|
148
|
+
signal.removeEventListener('abort', abortHandler);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
138
151
|
if (result === null) {
|
|
139
152
|
return [];
|
|
140
153
|
}
|
|
@@ -148,7 +161,7 @@ class JsTaskRunner extends task_runner_1.TaskRunner {
|
|
|
148
161
|
throw error;
|
|
149
162
|
}
|
|
150
163
|
}
|
|
151
|
-
async runForEachItem(taskId, settings, data, workflow, customConsole) {
|
|
164
|
+
async runForEachItem(taskId, settings, data, workflow, customConsole, signal) {
|
|
152
165
|
const inputItems = data.connectionInputData;
|
|
153
166
|
const returnData = [];
|
|
154
167
|
const chunkStartIdx = settings.chunk ? settings.chunk.startIndex : 0;
|
|
@@ -168,7 +181,19 @@ class JsTaskRunner extends task_runner_1.TaskRunner {
|
|
|
168
181
|
...this.buildRpcCallObject(taskId),
|
|
169
182
|
};
|
|
170
183
|
try {
|
|
171
|
-
let result =
|
|
184
|
+
let result = await new Promise((resolve, reject) => {
|
|
185
|
+
const abortHandler = () => {
|
|
186
|
+
reject(new timeout_error_1.TimeoutError(this.taskTimeout));
|
|
187
|
+
};
|
|
188
|
+
signal.addEventListener('abort', abortHandler);
|
|
189
|
+
const taskResult = (0, node_vm_1.runInNewContext)(`module.exports = async function VmCodeWrapper() {${settings.code}\n}()`, context, { timeout: this.taskTimeout * 1000 });
|
|
190
|
+
void taskResult
|
|
191
|
+
.then(resolve)
|
|
192
|
+
.catch(reject)
|
|
193
|
+
.finally(() => {
|
|
194
|
+
signal.removeEventListener('abort', abortHandler);
|
|
195
|
+
});
|
|
196
|
+
});
|
|
172
197
|
if (result === null) {
|
|
173
198
|
continue;
|
|
174
199
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"js-task-runner.js","sourceRoot":"","sources":["../../src/js-task-runner/js-task-runner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAA6C;AAC7C,+CAA2D;AAgB3D,+CAAiC;AACjC,qCAAwD;AASxD,+CAAsD;AAEtD,0EAAqE;AACrE,sFAAgF;AAChF,oDAAkD;AAClD,8DAA0D;AAC1D,oEAA+D;
|
|
1
|
+
{"version":3,"file":"js-task-runner.js","sourceRoot":"","sources":["../../src/js-task-runner/js-task-runner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAA6C;AAC7C,+CAA2D;AAgB3D,+CAAiC;AACjC,qCAAwD;AASxD,+CAAsD;AAEtD,0EAAqE;AACrE,sFAAgF;AAChF,oDAAkD;AAClD,8DAA0D;AAC1D,oEAA+D;AAC/D,0DAAsD;AAEtD,yDAA2D;AAC3D,2DAAiG;AACjG,yGAAmG;AAmCnG,MAAa,YAAa,SAAQ,wBAAU;IAO3C,YAAY,MAAkB,EAAE,IAAI,GAAG,gBAAgB;QACtD,KAAK,CAAC;YACL,QAAQ,EAAE,YAAY;YACtB,IAAI;YACJ,GAAG,MAAM,CAAC,gBAAgB;SAC1B,CAAC,CAAC;QATa,mBAAc,GAAG,IAAI,iCAAc,EAAE,CAAC;QAEtC,wBAAmB,GAAG,IAAI,kEAA8B,EAAE,CAAC;QAQ3E,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;QAElC,MAAM,oBAAoB,GAAG,CAAC,UAAkB,EAAE,EAAE,CACnD,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAEjF,IAAI,CAAC,eAAe,GAAG,IAAA,wCAAqB,EAAC;YAC5C,qBAAqB,EAAE,oBAAoB,CAAC,cAAc,CAAC,qBAAqB,IAAI,EAAE,CAAC;YACvF,sBAAsB,EAAE,oBAAoB,CAAC,cAAc,CAAC,sBAAsB,IAAI,EAAE,CAAC;SACzF,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAA0B,EAAE,MAAmB;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,4BAA4B,CAAC,CAAC;QAE7C,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAEpC,MAAM,oBAAoB,GAAG,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClF,MAAM,cAAc,GAAG,oBAAoB,CAAC,EAAE;YAC7C,CAAC,CAAC,oBAAoB,CAAC,MAAM;YAC7B,CAAC,CAAC,4CAAmB,CAAC,oBAAoB,EAAE,CAAC;QAE9C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,WAAW,CAC1C,IAAI,CAAC,MAAM,EACX,cAAc,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAClD,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEpE,MAAM,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAE/E,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,uBAAQ,CAAC;YAC7B,GAAG,cAAc;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;SACzB,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG;YAGrB,GAAG,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;gBAC3B,MAAM,SAAS,GAAG,IAAI;qBACpB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;qBACnF,IAAI,CAAC,GAAG,CAAC,CAAC;gBACZ,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;YAClE,CAAC;SACD,CAAC;QAEF,MAAM,MAAM,GACX,QAAQ,CAAC,QAAQ,KAAK,oBAAoB;YACzC,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC;YACzF,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;QAE5F,OAAO;YACN,MAAM;YACN,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,QAAQ;SACrD,CAAC;IACH,CAAC;IAEO,oBAAoB,CAAC,QAAwB;QACpD,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;QAE1C,IAAI,QAAQ,CAAC,QAAQ,KAAK,oBAAoB,EAAE,CAAC;YAChD,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,kDAAkD,CAAC,CAAC;QACxF,CAAC;IACF,CAAC;IAEO,kBAAkB;QACzB,OAAO;YAEN,MAAM;YACN,QAAQ;YACR,IAAI;YACJ,UAAU;YACV,WAAW;YACX,YAAY;YACZ,YAAY;YACZ,aAAa;YACb,cAAc;YAGd,IAAI;YACJ,IAAI;YACJ,WAAW;YACX,iBAAiB;YACjB,WAAW;YACX,iBAAiB;YACjB,QAAQ;SACR,CAAC;IACH,CAAC;IAKO,KAAK,CAAC,cAAc,CAC3B,MAAc,EACd,QAAwB,EACxB,IAAgB,EAChB,QAAkB,EAClB,aAA4B,EAC5B,MAAmB;QAEnB,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC;QAE5C,MAAM,OAAO,GAAY;YACxB,OAAO,EAAE,IAAI,CAAC,eAAe;YAC7B,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,aAAa;YACtB,KAAK,EAAE,UAAU;YAEjB,GAAG,IAAI,CAAC,kBAAkB,EAAE;YAC5B,GAAG,SAAS;YACZ,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;SAClC,CAAC;QAEF,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAA2B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC9E,MAAM,YAAY,GAAG,GAAG,EAAE;oBACzB,MAAM,CAAC,IAAI,4BAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC5C,CAAC,CAAC;gBAEF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAE/D,MAAM,UAAU,GAAG,IAAA,yBAAe,EACjC,oFAAoF,QAAQ,CAAC,IAAI,OAAO,EACxG,OAAO,EACP,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,EAAE,CACC,CAAC;gBAEvC,KAAK,UAAU;qBACb,IAAI,CAAC,OAAO,CAAC;qBACb,KAAK,CAAC,MAAM,CAAC;qBACb,OAAO,CAAC,GAAG,EAAE;oBACb,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;gBACnD,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACrB,OAAO,EAAE,CAAC;YACX,CAAC;YAED,OAAO,IAAA,gDAA4B,EAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YAEZ,MAAM,KAAK,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;YAE/C,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;gBAC7B,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC7C,CAAC;YAED,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC;IAKO,KAAK,CAAC,cAAc,CAC3B,MAAc,EACd,QAAwB,EACxB,IAAgB,EAChB,QAAkB,EAClB,aAA4B,EAC5B,MAAmB;QAEnB,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC;QAC5C,MAAM,UAAU,GAAyB,EAAE,CAAC;QAG5C,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK;YACjC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK;YAClD,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;QAErB,KAAK,IAAI,KAAK,GAAG,aAAa,EAAE,KAAK,GAAG,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9D,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC9D,MAAM,OAAO,GAAY;gBACxB,OAAO,EAAE,IAAI,CAAC,eAAe;gBAC7B,MAAM,EAAE,EAAE;gBACV,OAAO,EAAE,aAAa;gBACtB,IAAI;gBAEJ,GAAG,IAAI,CAAC,kBAAkB,EAAE;gBAC5B,GAAG,SAAS;gBACZ,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;aAClC,CAAC;YAEF,IAAI,CAAC;gBACJ,IAAI,MAAM,GAAG,MAAM,IAAI,OAAO,CAAiC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBAClF,MAAM,YAAY,GAAG,GAAG,EAAE;wBACzB,MAAM,CAAC,IAAI,4BAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;oBAC5C,CAAC,CAAC;oBAEF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;oBAE/C,MAAM,UAAU,GAAG,IAAA,yBAAe,EACjC,oDAAoD,QAAQ,CAAC,IAAI,OAAO,EACxE,OAAO,EACP,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,EAAE,CACL,CAAC;oBAEjC,KAAK,UAAU;yBACb,IAAI,CAAC,OAAO,CAAC;yBACb,KAAK,CAAC,MAAM,CAAC;yBACb,OAAO,CAAC,GAAG,EAAE;wBACb,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;oBACnD,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;gBAGH,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBACrB,SAAS;gBACV,CAAC;gBAED,MAAM,GAAG,IAAA,gDAA4B,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBACrD,IAAI,MAAM,EAAE,CAAC;oBACZ,UAAU,CAAC,IAAI,CACd,MAAM,CAAC,MAAM;wBACZ,CAAC,CAAC;4BACA,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;4BAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;yBACrB;wBACF,CAAC,CAAC;4BACA,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;yBAC3B,CACH,CAAC;gBACH,CAAC;YACF,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBAEZ,MAAM,KAAK,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;gBAE/C,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;oBAC9B,MAAM,KAAK,CAAC;gBACb,CAAC;gBAED,UAAU,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE;oBAC9B,UAAU,EAAE;wBACX,IAAI,EAAE,KAAK;qBACX;iBACD,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;QAED,OAAO,UAAU,CAAC;IACnB,CAAC;IAEO,eAAe,CAAC,IAAgB,EAAE,QAAkB,EAAE,SAAiB;QAC9E,OAAO,IAAI,gCAAiB,CAC3B,QAAQ,EACR,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,QAAQ,EACb,SAAS,EACT,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,IAAI,EACT,IAAA,4BAAiB,EAChB,IAAI,CAAC,cAAgD,EACrD,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,gBAAgB,CACrB,EACD,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,qBAAqB,EAC1B,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,eAAe,EAGpB,IAAI,CAAC,gBAAgB,IAAI;YACxB,GAAG,EAAE,EAAE;YACP,kBAAkB,EAAE,KAAK;YACzB,kBAAkB,EAAE,IAAI;SACxB,CAKD,CAAC,YAAY,CAAC,EAAE,2BAA2B,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,CAAC;IAEO,wBAAwB,CAAC,KAAc;QAC9C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC5B,OAAO,IAAA,qCAAgB,EAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,IAAA,wBAAW,EAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,gCAAc,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,IAAI,gCAAc,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IAEO,mBAAmB,CAC1B,QAA6B,EAC7B,KAAgC;QAEhC,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,+BAA+B,CACzE,QAAQ,CAAC,SAAS,EAClB,KAAK,CAMmB,CAAC;QAE1B,OAAO;YACN,GAAG,QAAQ;YACX,mBAAmB,EAAE,SAAS;YAC9B,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,QAAQ,EAAE,SAAS,CAAC;SACjF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,uBAAuB,CACpC,cAAmC,EACnC,QAAgC,EAChC,MAAc;QAOd,IAAI,cAAc,CAAC,aAAa,EAAE,CAAC;YAClC,MAAM,eAAe,GAAG,IAAI,GAAG,CAC9B,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC5B,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE;gBAClC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE;aAC9C,CAAC,CACF,CAAC;YAEF,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAEnF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAC5C,MAAM,EACN,gBAAgB,CAChB,CAAC;YAEF,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC;IACF,CAAC;CACD;AAtWD,oCAsWC"}
|
package/dist/start.js
CHANGED
|
@@ -40,22 +40,26 @@ const n8n_workflow_1 = require("n8n-workflow");
|
|
|
40
40
|
const typedi_1 = __importDefault(require("typedi"));
|
|
41
41
|
const main_config_1 = require("./config/main-config");
|
|
42
42
|
const js_task_runner_1 = require("./js-task-runner/js-task-runner");
|
|
43
|
-
let
|
|
43
|
+
let healthCheckServer;
|
|
44
44
|
let runner;
|
|
45
45
|
let isShuttingDown = false;
|
|
46
46
|
let errorReporter;
|
|
47
|
-
function createSignalHandler(signal) {
|
|
47
|
+
function createSignalHandler(signal, timeoutInS = 10) {
|
|
48
48
|
return async function onSignal() {
|
|
49
49
|
if (isShuttingDown) {
|
|
50
50
|
return;
|
|
51
51
|
}
|
|
52
52
|
console.log(`Received ${signal} signal, shutting down...`);
|
|
53
|
+
setTimeout(() => {
|
|
54
|
+
console.error('Shutdown timeout reached, forcing shutdown...');
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}, timeoutInS * 1000).unref();
|
|
53
57
|
isShuttingDown = true;
|
|
54
58
|
try {
|
|
55
59
|
if (runner) {
|
|
56
60
|
await runner.stop();
|
|
57
61
|
runner = undefined;
|
|
58
|
-
void
|
|
62
|
+
void healthCheckServer?.stop();
|
|
59
63
|
}
|
|
60
64
|
if (errorReporter) {
|
|
61
65
|
await errorReporter.stop();
|
|
@@ -84,13 +88,13 @@ void (async function start() {
|
|
|
84
88
|
}
|
|
85
89
|
runner = new js_task_runner_1.JsTaskRunner(config);
|
|
86
90
|
runner.on('runner:reached-idle-timeout', () => {
|
|
87
|
-
void createSignalHandler('IDLE_TIMEOUT')();
|
|
91
|
+
void createSignalHandler('IDLE_TIMEOUT', 1)();
|
|
88
92
|
});
|
|
89
93
|
const { enabled, host, port } = config.baseRunnerConfig.healthcheckServer;
|
|
90
94
|
if (enabled) {
|
|
91
|
-
const {
|
|
92
|
-
|
|
93
|
-
await
|
|
95
|
+
const { HealthCheckServer } = await Promise.resolve().then(() => __importStar(require('./health-check-server')));
|
|
96
|
+
healthCheckServer = new HealthCheckServer();
|
|
97
|
+
await healthCheckServer.start(host, port);
|
|
94
98
|
}
|
|
95
99
|
process.on('SIGINT', createSignalHandler('SIGINT'));
|
|
96
100
|
process.on('SIGTERM', createSignalHandler('SIGTERM'));
|
package/dist/start.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAA2D;AAC3D,oDAA+B;AAE/B,sDAAkD;AAGlD,oEAA+D;AAE/D,IAAI,iBAAgD,CAAC;AACrD,IAAI,MAAgC,CAAC;AACrC,IAAI,cAAc,GAAG,KAAK,CAAC;AAC3B,IAAI,aAAwC,CAAC;AAE7C,SAAS,mBAAmB,CAAC,MAAc;
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"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"}
|
package/dist/task-runner.d.ts
CHANGED
|
@@ -15,11 +15,13 @@ export interface TaskOffer {
|
|
|
15
15
|
validUntil: bigint;
|
|
16
16
|
}
|
|
17
17
|
interface DataRequest {
|
|
18
|
+
taskId: string;
|
|
18
19
|
requestId: string;
|
|
19
20
|
resolve: (data: unknown) => void;
|
|
20
21
|
reject: (error: unknown) => void;
|
|
21
22
|
}
|
|
22
23
|
interface NodeTypesRequest {
|
|
24
|
+
taskId: string;
|
|
23
25
|
requestId: string;
|
|
24
26
|
resolve: (data: unknown) => void;
|
|
25
27
|
reject: (error: unknown) => void;
|
|
@@ -51,7 +53,9 @@ export declare abstract class TaskRunner extends EventEmitter {
|
|
|
51
53
|
maxConcurrency: number;
|
|
52
54
|
name: string;
|
|
53
55
|
private idleTimer;
|
|
56
|
+
protected readonly taskTimeout: number;
|
|
54
57
|
private readonly idleTimeout;
|
|
58
|
+
protected taskCancellations: Map<string, AbortController>;
|
|
55
59
|
constructor(opts: TaskRunnerOpts);
|
|
56
60
|
private resetIdleTimer;
|
|
57
61
|
private receiveMessage;
|
|
@@ -65,11 +69,11 @@ export declare abstract class TaskRunner extends EventEmitter {
|
|
|
65
69
|
processNodeTypesResponse(requestId: string, nodeTypes: unknown): void;
|
|
66
70
|
hasOpenTasks(): boolean;
|
|
67
71
|
offerAccepted(offerId: string, taskId: string): void;
|
|
68
|
-
taskCancelled(taskId: string): void;
|
|
72
|
+
taskCancelled(taskId: string, reason: string): void;
|
|
69
73
|
taskErrored(taskId: string, error: unknown): void;
|
|
70
74
|
taskDone(taskId: string, data: RunnerMessage.ToBroker.TaskDone['data']): void;
|
|
71
75
|
receivedSettings(taskId: string, settings: unknown): Promise<void>;
|
|
72
|
-
executeTask(_task: Task): Promise<TaskResultData>;
|
|
76
|
+
executeTask(_task: Task, _signal: AbortSignal): Promise<TaskResultData>;
|
|
73
77
|
requestNodeTypes<T = unknown>(taskId: Task['taskId'], requestParams: RunnerMessage.ToBroker.NodeTypesRequest['requestParams']): Promise<T>;
|
|
74
78
|
requestData<T = unknown>(taskId: Task['taskId'], requestParams: RunnerMessage.ToBroker.TaskDataRequest['requestParams']): Promise<T>;
|
|
75
79
|
makeRpcCall(taskId: string, name: RunnerMessage.ToBroker.RPC['name'], params: unknown[]): Promise<unknown>;
|
package/dist/task-runner.js
CHANGED
|
@@ -7,6 +7,7 @@ const node_events_1 = require("node:events");
|
|
|
7
7
|
const ws_1 = require("ws");
|
|
8
8
|
const node_types_1 = require("./node-types");
|
|
9
9
|
const runner_types_1 = require("./runner-types");
|
|
10
|
+
const task_cancelled_error_1 = require("./js-task-runner/errors/task-cancelled-error");
|
|
10
11
|
const OFFER_VALID_TIME_MS = 5000;
|
|
11
12
|
const OFFER_VALID_EXTRA_MS = 100;
|
|
12
13
|
const msToNs = (ms) => BigInt(ms * 1_000_000);
|
|
@@ -21,6 +22,7 @@ class TaskRunner extends node_events_1.EventEmitter {
|
|
|
21
22
|
this.nodeTypesRequests = new Map();
|
|
22
23
|
this.rpcCalls = new Map();
|
|
23
24
|
this.nodeTypes = new node_types_1.TaskRunnerNodeTypes([]);
|
|
25
|
+
this.taskCancellations = new Map();
|
|
24
26
|
this.receiveMessage = (message) => {
|
|
25
27
|
const data = JSON.parse(message.data);
|
|
26
28
|
void this.onMessage(data);
|
|
@@ -35,8 +37,10 @@ class TaskRunner extends node_events_1.EventEmitter {
|
|
|
35
37
|
this.taskType = opts.taskType;
|
|
36
38
|
this.name = opts.name ?? 'Node.js Task Runner SDK';
|
|
37
39
|
this.maxConcurrency = opts.maxConcurrency;
|
|
40
|
+
this.taskTimeout = opts.taskTimeout;
|
|
38
41
|
this.idleTimeout = opts.idleTimeout;
|
|
39
|
-
const
|
|
42
|
+
const { host: taskBrokerHost } = new URL(opts.taskBrokerUri);
|
|
43
|
+
const wsUrl = `ws://${taskBrokerHost}/runners/_ws?id=${this.id}`;
|
|
40
44
|
this.ws = new ws_1.WebSocket(wsUrl, {
|
|
41
45
|
headers: {
|
|
42
46
|
authorization: `Bearer ${opts.grantToken}`,
|
|
@@ -48,11 +52,11 @@ class TaskRunner extends node_events_1.EventEmitter {
|
|
|
48
52
|
if ('code' in error &&
|
|
49
53
|
typeof error.code === 'string' &&
|
|
50
54
|
['ECONNREFUSED', 'ENOTFOUND'].some((code) => code === error.code)) {
|
|
51
|
-
console.error(`Error: Failed to connect to n8n. Please ensure n8n is reachable at: ${
|
|
55
|
+
console.error(`Error: Failed to connect to n8n task broker. Please ensure n8n task broker is reachable at: ${taskBrokerHost}`);
|
|
52
56
|
process.exit(1);
|
|
53
57
|
}
|
|
54
58
|
else {
|
|
55
|
-
console.error(`Error: Failed to connect to n8n at ${
|
|
59
|
+
console.error(`Error: Failed to connect to n8n task broker at ${taskBrokerHost}`);
|
|
56
60
|
console.error('Details:', event.message || 'Unknown error');
|
|
57
61
|
}
|
|
58
62
|
});
|
|
@@ -122,7 +126,7 @@ class TaskRunner extends node_events_1.EventEmitter {
|
|
|
122
126
|
this.offerAccepted(message.offerId, message.taskId);
|
|
123
127
|
break;
|
|
124
128
|
case 'broker:taskcancel':
|
|
125
|
-
this.taskCancelled(message.taskId);
|
|
129
|
+
this.taskCancelled(message.taskId, message.reason);
|
|
126
130
|
break;
|
|
127
131
|
case 'broker:tasksettings':
|
|
128
132
|
void this.receivedSettings(message.taskId, message.settings);
|
|
@@ -186,17 +190,31 @@ class TaskRunner extends node_events_1.EventEmitter {
|
|
|
186
190
|
taskId,
|
|
187
191
|
});
|
|
188
192
|
}
|
|
189
|
-
taskCancelled(taskId) {
|
|
193
|
+
taskCancelled(taskId, reason) {
|
|
190
194
|
const task = this.runningTasks.get(taskId);
|
|
191
195
|
if (!task) {
|
|
192
196
|
return;
|
|
193
197
|
}
|
|
194
198
|
task.cancelled = true;
|
|
195
|
-
|
|
199
|
+
for (const [requestId, request] of this.dataRequests.entries()) {
|
|
200
|
+
if (request.taskId === taskId) {
|
|
201
|
+
request.reject(new task_cancelled_error_1.TaskCancelledError(reason));
|
|
202
|
+
this.dataRequests.delete(requestId);
|
|
203
|
+
}
|
|
196
204
|
}
|
|
197
|
-
|
|
198
|
-
|
|
205
|
+
for (const [requestId, request] of this.nodeTypesRequests.entries()) {
|
|
206
|
+
if (request.taskId === taskId) {
|
|
207
|
+
request.reject(new task_cancelled_error_1.TaskCancelledError(reason));
|
|
208
|
+
this.nodeTypesRequests.delete(requestId);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const controller = this.taskCancellations.get(taskId);
|
|
212
|
+
if (controller) {
|
|
213
|
+
controller.abort();
|
|
214
|
+
this.taskCancellations.delete(taskId);
|
|
199
215
|
}
|
|
216
|
+
if (!task.active)
|
|
217
|
+
this.runningTasks.delete(taskId);
|
|
200
218
|
this.sendOffers();
|
|
201
219
|
}
|
|
202
220
|
taskErrored(taskId, error) {
|
|
@@ -226,20 +244,31 @@ class TaskRunner extends node_events_1.EventEmitter {
|
|
|
226
244
|
this.runningTasks.delete(taskId);
|
|
227
245
|
return;
|
|
228
246
|
}
|
|
247
|
+
const controller = new AbortController();
|
|
248
|
+
this.taskCancellations.set(taskId, controller);
|
|
249
|
+
const taskTimeout = setTimeout(() => {
|
|
250
|
+
if (!task.cancelled) {
|
|
251
|
+
controller.abort();
|
|
252
|
+
this.taskCancellations.delete(taskId);
|
|
253
|
+
}
|
|
254
|
+
}, this.taskTimeout * 1_000);
|
|
229
255
|
task.settings = settings;
|
|
230
256
|
task.active = true;
|
|
231
257
|
try {
|
|
232
|
-
const data = await this.executeTask(task);
|
|
258
|
+
const data = await this.executeTask(task, controller.signal);
|
|
233
259
|
this.taskDone(taskId, data);
|
|
234
260
|
}
|
|
235
261
|
catch (error) {
|
|
236
|
-
|
|
262
|
+
if (!task.cancelled)
|
|
263
|
+
this.taskErrored(taskId, error);
|
|
237
264
|
}
|
|
238
265
|
finally {
|
|
266
|
+
clearTimeout(taskTimeout);
|
|
267
|
+
this.taskCancellations.delete(taskId);
|
|
239
268
|
this.resetIdleTimer();
|
|
240
269
|
}
|
|
241
270
|
}
|
|
242
|
-
async executeTask(_task) {
|
|
271
|
+
async executeTask(_task, _signal) {
|
|
243
272
|
throw new n8n_workflow_1.ApplicationError('Unimplemented');
|
|
244
273
|
}
|
|
245
274
|
async requestNodeTypes(taskId, requestParams) {
|
|
@@ -247,6 +276,7 @@ class TaskRunner extends node_events_1.EventEmitter {
|
|
|
247
276
|
const nodeTypesPromise = new Promise((resolve, reject) => {
|
|
248
277
|
this.nodeTypesRequests.set(requestId, {
|
|
249
278
|
requestId,
|
|
279
|
+
taskId,
|
|
250
280
|
resolve: resolve,
|
|
251
281
|
reject,
|
|
252
282
|
});
|
|
@@ -269,6 +299,7 @@ class TaskRunner extends node_events_1.EventEmitter {
|
|
|
269
299
|
const p = new Promise((resolve, reject) => {
|
|
270
300
|
this.dataRequests.set(requestId, {
|
|
271
301
|
requestId,
|
|
302
|
+
taskId,
|
|
272
303
|
resolve: resolve,
|
|
273
304
|
reject,
|
|
274
305
|
});
|