@n8n/task-runner 1.6.0 → 1.7.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.
@@ -1,6 +1,13 @@
1
+ declare class HealthcheckServerConfig {
2
+ enabled: boolean;
3
+ host: string;
4
+ port: number;
5
+ }
1
6
  export declare class BaseRunnerConfig {
2
7
  n8nUri: string;
3
8
  grantToken: string;
4
9
  maxPayloadSize: number;
5
10
  maxConcurrency: number;
11
+ healthcheckServer: HealthcheckServerConfig;
6
12
  }
13
+ export {};
@@ -11,6 +11,28 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.BaseRunnerConfig = void 0;
13
13
  const config_1 = require("@n8n/config");
14
+ let HealthcheckServerConfig = class HealthcheckServerConfig {
15
+ constructor() {
16
+ this.enabled = false;
17
+ this.host = '127.0.0.1';
18
+ this.port = 5680;
19
+ }
20
+ };
21
+ __decorate([
22
+ (0, config_1.Env)('N8N_RUNNERS_SERVER_ENABLED'),
23
+ __metadata("design:type", Boolean)
24
+ ], HealthcheckServerConfig.prototype, "enabled", void 0);
25
+ __decorate([
26
+ (0, config_1.Env)('N8N_RUNNERS_SERVER_HOST'),
27
+ __metadata("design:type", String)
28
+ ], HealthcheckServerConfig.prototype, "host", void 0);
29
+ __decorate([
30
+ (0, config_1.Env)('N8N_RUNNERS_SERVER_PORT'),
31
+ __metadata("design:type", Number)
32
+ ], HealthcheckServerConfig.prototype, "port", void 0);
33
+ HealthcheckServerConfig = __decorate([
34
+ config_1.Config
35
+ ], HealthcheckServerConfig);
14
36
  let BaseRunnerConfig = class BaseRunnerConfig {
15
37
  constructor() {
16
38
  this.n8nUri = '127.0.0.1:5679';
@@ -36,6 +58,10 @@ __decorate([
36
58
  (0, config_1.Env)('N8N_RUNNERS_MAX_CONCURRENCY'),
37
59
  __metadata("design:type", Number)
38
60
  ], BaseRunnerConfig.prototype, "maxConcurrency", void 0);
61
+ __decorate([
62
+ config_1.Nested,
63
+ __metadata("design:type", HealthcheckServerConfig)
64
+ ], BaseRunnerConfig.prototype, "healthcheckServer", void 0);
39
65
  exports.BaseRunnerConfig = BaseRunnerConfig = __decorate([
40
66
  config_1.Config
41
67
  ], BaseRunnerConfig);
@@ -1 +1 @@
1
- {"version":3,"file":"base-runner-config.js","sourceRoot":"","sources":["../../src/config/base-runner-config.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wCAA0C;AAGnC,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAAtB;QAEN,WAAM,GAAW,gBAAgB,CAAC;QAGlC,eAAU,GAAW,EAAE,CAAC;QAGxB,mBAAc,GAAW,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;QAG5C,mBAAc,GAAW,CAAC,CAAC;IAC5B,CAAC;CAAA,CAAA;AAZY,4CAAgB;AAE5B;IADC,IAAA,YAAG,EAAC,qBAAqB,CAAC;;gDACO;AAGlC;IADC,IAAA,YAAG,EAAC,yBAAyB,CAAC;;oDACP;AAGxB;IADC,IAAA,YAAG,EAAC,yBAAyB,CAAC;;wDACa;AAG5C;IADC,IAAA,YAAG,EAAC,6BAA6B,CAAC;;wDACR;2BAXf,gBAAgB;IAD5B,eAAM;GACM,gBAAgB,CAY5B"}
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,4BAA4B,CAAC;;wDACT;AAGzB;IADC,IAAA,YAAG,EAAC,yBAAyB,CAAC;;qDACJ;AAG3B;IADC,IAAA,YAAG,EAAC,yBAAyB,CAAC;;qDACX;AARf,uBAAuB;IAD5B,eAAM;GACD,uBAAuB,CAS5B;AAGM,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAAtB;QAEN,WAAM,GAAW,gBAAgB,CAAC;QAGlC,eAAU,GAAW,EAAE,CAAC;QAGxB,mBAAc,GAAW,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;QAG5C,mBAAc,GAAW,CAAC,CAAC;IAI5B,CAAC;CAAA,CAAA;AAfY,4CAAgB;AAE5B;IADC,IAAA,YAAG,EAAC,qBAAqB,CAAC;;gDACO;AAGlC;IADC,IAAA,YAAG,EAAC,yBAAyB,CAAC;;oDACP;AAGxB;IADC,IAAA,YAAG,EAAC,yBAAyB,CAAC;;wDACa;AAG5C;IADC,IAAA,YAAG,EAAC,6BAA6B,CAAC;;wDACR;AAG3B;IADC,eAAM;8BACa,uBAAuB;2DAAC;2BAdhC,gBAAgB;IAD5B,eAAM;GACM,gBAAgB,CAe5B"}
@@ -1,6 +1,8 @@
1
1
  import { BaseRunnerConfig } from './base-runner-config';
2
2
  import { JsRunnerConfig } from './js-runner-config';
3
+ import { SentryConfig } from './sentry-config';
3
4
  export declare class MainConfig {
4
5
  baseRunnerConfig: BaseRunnerConfig;
5
6
  jsRunnerConfig: JsRunnerConfig;
7
+ sentryConfig: SentryConfig;
6
8
  }
@@ -13,6 +13,7 @@ exports.MainConfig = void 0;
13
13
  const config_1 = require("@n8n/config");
14
14
  const base_runner_config_1 = require("./base-runner-config");
15
15
  const js_runner_config_1 = require("./js-runner-config");
16
+ const sentry_config_1 = require("./sentry-config");
16
17
  let MainConfig = class MainConfig {
17
18
  };
18
19
  exports.MainConfig = MainConfig;
@@ -24,6 +25,10 @@ __decorate([
24
25
  config_1.Nested,
25
26
  __metadata("design:type", js_runner_config_1.JsRunnerConfig)
26
27
  ], MainConfig.prototype, "jsRunnerConfig", void 0);
28
+ __decorate([
29
+ config_1.Nested,
30
+ __metadata("design:type", sentry_config_1.SentryConfig)
31
+ ], MainConfig.prototype, "sentryConfig", void 0);
27
32
  exports.MainConfig = MainConfig = __decorate([
28
33
  config_1.Config
29
34
  ], MainConfig);
@@ -1 +1 @@
1
- {"version":3,"file":"main-config.js","sourceRoot":"","sources":["../../src/config/main-config.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wCAA6C;AAE7C,6DAAwD;AACxD,yDAAoD;AAG7C,IAAM,UAAU,GAAhB,MAAM,UAAU;CAMtB,CAAA;AANY,gCAAU;AAEtB;IADC,eAAM;8BACY,qCAAgB;oDAAC;AAGpC;IADC,eAAM;8BACU,iCAAc;kDAAC;qBALpB,UAAU;IADtB,eAAM;GACM,UAAU,CAMtB"}
1
+ {"version":3,"file":"main-config.js","sourceRoot":"","sources":["../../src/config/main-config.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wCAA6C;AAE7C,6DAAwD;AACxD,yDAAoD;AACpD,mDAA+C;AAGxC,IAAM,UAAU,GAAhB,MAAM,UAAU;CAStB,CAAA;AATY,gCAAU;AAEtB;IADC,eAAM;8BACY,qCAAgB;oDAAC;AAGpC;IADC,eAAM;8BACU,iCAAc;kDAAC;AAGhC;IADC,eAAM;8BACQ,4BAAY;gDAAC;qBARhB,UAAU;IADtB,eAAM;GACM,UAAU,CAStB"}
@@ -0,0 +1,6 @@
1
+ export declare class SentryConfig {
2
+ sentryDsn: string;
3
+ n8nVersion: string;
4
+ environment: string;
5
+ deploymentName: string;
6
+ }
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SentryConfig = void 0;
13
+ const config_1 = require("@n8n/config");
14
+ let SentryConfig = class SentryConfig {
15
+ constructor() {
16
+ this.sentryDsn = '';
17
+ this.n8nVersion = '';
18
+ this.environment = '';
19
+ this.deploymentName = '';
20
+ }
21
+ };
22
+ exports.SentryConfig = SentryConfig;
23
+ __decorate([
24
+ (0, config_1.Env)('N8N_SENTRY_DSN'),
25
+ __metadata("design:type", String)
26
+ ], SentryConfig.prototype, "sentryDsn", void 0);
27
+ __decorate([
28
+ (0, config_1.Env)('N8N_VERSION'),
29
+ __metadata("design:type", String)
30
+ ], SentryConfig.prototype, "n8nVersion", void 0);
31
+ __decorate([
32
+ (0, config_1.Env)('ENVIRONMENT'),
33
+ __metadata("design:type", String)
34
+ ], SentryConfig.prototype, "environment", void 0);
35
+ __decorate([
36
+ (0, config_1.Env)('DEPLOYMENT_NAME'),
37
+ __metadata("design:type", String)
38
+ ], SentryConfig.prototype, "deploymentName", void 0);
39
+ exports.SentryConfig = SentryConfig = __decorate([
40
+ config_1.Config
41
+ ], SentryConfig);
42
+ //# sourceMappingURL=sentry-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry-config.js","sourceRoot":"","sources":["../../src/config/sentry-config.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wCAA0C;AAGnC,IAAM,YAAY,GAAlB,MAAM,YAAY;IAAlB;QAGN,cAAS,GAAW,EAAE,CAAC;QAKvB,eAAU,GAAW,EAAE,CAAC;QAGxB,gBAAW,GAAW,EAAE,CAAC;QAGzB,mBAAc,GAAW,EAAE,CAAC;IAG7B,CAAC;CAAA,CAAA;AAjBY,oCAAY;AAGxB;IADC,IAAA,YAAG,EAAC,gBAAgB,CAAC;;+CACC;AAKvB;IADC,IAAA,YAAG,EAAC,aAAa,CAAC;;gDACK;AAGxB;IADC,IAAA,YAAG,EAAC,aAAa,CAAC;;iDACM;AAGzB;IADC,IAAA,YAAG,EAAC,iBAAiB,CAAC;;oDACK;uBAdhB,YAAY;IADxB,eAAM;GACM,YAAY,CAiBxB"}
@@ -0,0 +1,12 @@
1
+ import type { ErrorEvent, EventHint } from '@sentry/types';
2
+ import type { SentryConfig } from './config/sentry-config';
3
+ export declare class ErrorReporter {
4
+ private readonly sentryConfig;
5
+ private isInitialized;
6
+ private readonly seenErrors;
7
+ private get dsn();
8
+ constructor(sentryConfig: SentryConfig);
9
+ start(): Promise<void>;
10
+ stop(): Promise<void>;
11
+ beforeSend(event: ErrorEvent, { originalException }: EventHint): Promise<ErrorEvent | null>;
12
+ }
@@ -0,0 +1,102 @@
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.ErrorReporter = void 0;
27
+ const integrations_1 = require("@sentry/integrations");
28
+ const node_1 = require("@sentry/node");
29
+ const a = __importStar(require("assert/strict"));
30
+ const crypto_1 = require("crypto");
31
+ const n8n_workflow_1 = require("n8n-workflow");
32
+ class ErrorReporter {
33
+ get dsn() {
34
+ return this.sentryConfig.sentryDsn;
35
+ }
36
+ constructor(sentryConfig) {
37
+ this.sentryConfig = sentryConfig;
38
+ this.isInitialized = false;
39
+ this.seenErrors = new Set();
40
+ a.ok(this.dsn, 'Sentry DSN is required to initialize Sentry');
41
+ }
42
+ async start() {
43
+ if (this.isInitialized)
44
+ return;
45
+ Error.stackTraceLimit = 50;
46
+ process.on('uncaughtException', node_1.captureException);
47
+ const ENABLED_INTEGRATIONS = [
48
+ 'InboundFilters',
49
+ 'FunctionToString',
50
+ 'LinkedErrors',
51
+ 'OnUnhandledRejection',
52
+ 'ContextLines',
53
+ ];
54
+ (0, node_1.setTag)('server_type', 'task_runner');
55
+ (0, node_1.init)({
56
+ dsn: this.dsn,
57
+ release: this.sentryConfig.n8nVersion,
58
+ environment: this.sentryConfig.environment,
59
+ enableTracing: false,
60
+ serverName: this.sentryConfig.deploymentName,
61
+ beforeBreadcrumb: () => null,
62
+ beforeSend: async (event, hint) => await this.beforeSend(event, hint),
63
+ integrations: (integrations) => [
64
+ ...integrations.filter(({ name }) => ENABLED_INTEGRATIONS.includes(name)),
65
+ new integrations_1.RewriteFrames({ root: process.cwd() }),
66
+ ],
67
+ });
68
+ this.isInitialized = true;
69
+ }
70
+ async stop() {
71
+ if (!this.isInitialized) {
72
+ return;
73
+ }
74
+ await (0, node_1.close)(1000);
75
+ }
76
+ async beforeSend(event, { originalException }) {
77
+ if (!originalException)
78
+ return null;
79
+ if (originalException instanceof Promise) {
80
+ originalException = await originalException.catch((error) => error);
81
+ }
82
+ if (originalException instanceof n8n_workflow_1.ApplicationError) {
83
+ const { level, extra, tags } = originalException;
84
+ if (level === 'warning')
85
+ return null;
86
+ event.level = level;
87
+ if (extra)
88
+ event.extra = { ...event.extra, ...extra };
89
+ if (tags)
90
+ event.tags = { ...event.tags, ...tags };
91
+ }
92
+ if (originalException instanceof Error && originalException.stack) {
93
+ const eventHash = (0, crypto_1.createHash)('sha1').update(originalException.stack).digest('base64');
94
+ if (this.seenErrors.has(eventHash))
95
+ return null;
96
+ this.seenErrors.add(eventHash);
97
+ }
98
+ return event;
99
+ }
100
+ }
101
+ exports.ErrorReporter = ErrorReporter;
102
+ //# sourceMappingURL=error-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-reporter.js","sourceRoot":"","sources":["../src/error-reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare class HealthcheckServer {
2
+ private server;
3
+ start(host: string, port: number): Promise<void>;
4
+ stop(): Promise<void>;
5
+ }
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HealthcheckServer = void 0;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ const node_http_1 = require("node:http");
6
+ class HealthcheckServer {
7
+ constructor() {
8
+ this.server = (0, node_http_1.createServer)((_, res) => {
9
+ res.writeHead(200);
10
+ res.end('OK');
11
+ });
12
+ }
13
+ async start(host, port) {
14
+ return await new Promise((resolve, reject) => {
15
+ const portInUseErrorHandler = (error) => {
16
+ if (error.code === 'EADDRINUSE') {
17
+ reject(new n8n_workflow_1.ApplicationError(`Port ${port} is already in use`));
18
+ }
19
+ else {
20
+ reject(error);
21
+ }
22
+ };
23
+ this.server.on('error', portInUseErrorHandler);
24
+ this.server.listen(port, host, () => {
25
+ this.server.removeListener('error', portInUseErrorHandler);
26
+ console.log(`Healthcheck server listening on ${host}, port ${port}`);
27
+ resolve();
28
+ });
29
+ });
30
+ }
31
+ async stop() {
32
+ return await new Promise((resolve, reject) => {
33
+ this.server.close((error) => {
34
+ if (error)
35
+ reject(error);
36
+ else
37
+ resolve();
38
+ });
39
+ });
40
+ }
41
+ }
42
+ exports.HealthcheckServer = HealthcheckServer;
43
+ //# sourceMappingURL=healthcheck-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"healthcheck-server.js","sourceRoot":"","sources":["../src/healthcheck-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,mCAAmC,IAAI,UAAU,IAAI,EAAE,CAAC,CAAC;gBACrE,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"}
@@ -137,6 +137,10 @@ export declare namespace RunnerMessage {
137
137
  taskId: string;
138
138
  reason: string;
139
139
  }
140
+ interface TaskDeferred {
141
+ type: 'runner:taskdeferred';
142
+ taskId: string;
143
+ }
140
144
  interface TaskDone {
141
145
  type: 'runner:taskdone';
142
146
  taskId: string;
@@ -172,6 +176,6 @@ export declare namespace RunnerMessage {
172
176
  name: (typeof RPC_ALLOW_LIST)[number];
173
177
  params: unknown[];
174
178
  }
175
- type All = Info | TaskDone | TaskError | TaskAccepted | TaskRejected | TaskOffer | RPC | TaskDataRequest | NodeTypesRequest;
179
+ type All = Info | TaskDone | TaskError | TaskAccepted | TaskRejected | TaskDeferred | TaskOffer | RPC | TaskDataRequest | NodeTypesRequest;
176
180
  }
177
181
  }
package/dist/start.js CHANGED
@@ -1,4 +1,27 @@
1
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
+ };
2
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
27
  };
@@ -7,8 +30,10 @@ const n8n_workflow_1 = require("n8n-workflow");
7
30
  const typedi_1 = __importDefault(require("typedi"));
8
31
  const main_config_1 = require("./config/main-config");
9
32
  const js_task_runner_1 = require("./js-task-runner/js-task-runner");
33
+ let healthcheckServer;
10
34
  let runner;
11
35
  let isShuttingDown = false;
36
+ let errorReporter;
12
37
  function createSignalHandler(signal) {
13
38
  return async function onSignal() {
14
39
  if (isShuttingDown) {
@@ -20,6 +45,11 @@ function createSignalHandler(signal) {
20
45
  if (runner) {
21
46
  await runner.stop();
22
47
  runner = undefined;
48
+ void healthcheckServer?.stop();
49
+ }
50
+ if (errorReporter) {
51
+ await errorReporter.stop();
52
+ errorReporter = undefined;
23
53
  }
24
54
  }
25
55
  catch (e) {
@@ -27,13 +57,25 @@ function createSignalHandler(signal) {
27
57
  console.error('Error stopping task runner', { error });
28
58
  }
29
59
  finally {
60
+ console.log('Task runner stopped');
30
61
  process.exit(0);
31
62
  }
32
63
  };
33
64
  }
34
65
  void (async function start() {
35
66
  const config = typedi_1.default.get(main_config_1.MainConfig);
67
+ if (config.sentryConfig.sentryDsn) {
68
+ const { ErrorReporter } = await Promise.resolve().then(() => __importStar(require('./error-reporter')));
69
+ errorReporter = new ErrorReporter(config.sentryConfig);
70
+ await errorReporter.start();
71
+ }
36
72
  runner = new js_task_runner_1.JsTaskRunner(config);
73
+ const { enabled, host, port } = config.baseRunnerConfig.healthcheckServer;
74
+ if (enabled) {
75
+ const { HealthcheckServer } = await Promise.resolve().then(() => __importStar(require('./healthcheck-server')));
76
+ healthcheckServer = new HealthcheckServer();
77
+ await healthcheckServer.start(host, port);
78
+ }
37
79
  process.on('SIGINT', createSignalHandler('SIGINT'));
38
80
  process.on('SIGTERM', createSignalHandler('SIGTERM'));
39
81
  })().catch((e) => {
package/dist/start.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":";;;;;AAAA,+CAA2C;AAC3C,oDAA+B;AAE/B,sDAAkD;AAClD,oEAA+D;AAE/D,IAAI,MAAgC,CAAC;AACrC,IAAI,cAAc,GAAG,KAAK,CAAC;AAE3B,SAAS,mBAAmB,CAAC,MAAc;IAC1C,OAAO,KAAK,UAAU,QAAQ;QAC7B,IAAI,cAAc,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,2BAA2B,CAAC,CAAC;QAE3D,cAAc,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC;YACJ,IAAI,MAAM,EAAE,CAAC;gBACZ,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBACpB,MAAM,GAAG,SAAS,CAAC;YACpB,CAAC;QACF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,IAAA,0BAAW,EAAC,CAAC,CAAC,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,CAAC;gBAAS,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACF,CAAC,CAAC;AACH,CAAC;AAED,KAAK,CAAC,KAAK,UAAU,KAAK;IACzB,MAAM,MAAM,GAAG,gBAAS,CAAC,GAAG,CAAC,wBAAU,CAAC,CAAC;IAEzC,MAAM,GAAG,IAAI,6BAAY,CAAC,MAAM,CAAC,CAAC;IAElC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IAChB,MAAM,KAAK,GAAG,IAAA,0BAAW,EAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAA2C;AAC3C,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;IAC1C,OAAO,KAAK,UAAU,QAAQ;QAC7B,IAAI,cAAc,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,2BAA2B,CAAC,CAAC;QAE3D,cAAc,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC;YACJ,IAAI,MAAM,EAAE,CAAC;gBACZ,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBACpB,MAAM,GAAG,SAAS,CAAC;gBACnB,KAAK,iBAAiB,EAAE,IAAI,EAAE,CAAC;YAChC,CAAC;YAED,IAAI,aAAa,EAAE,CAAC;gBACnB,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;gBAC3B,aAAa,GAAG,SAAS,CAAC;YAC3B,CAAC;QACF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,IAAA,0BAAW,EAAC,CAAC,CAAC,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,CAAC;gBAAS,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACF,CAAC,CAAC;AACH,CAAC;AAED,KAAK,CAAC,KAAK,UAAU,KAAK;IACzB,MAAM,MAAM,GAAG,gBAAS,CAAC,GAAG,CAAC,wBAAU,CAAC,CAAC;IAEzC,IAAI,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;QACnC,MAAM,EAAE,aAAa,EAAE,GAAG,wDAAa,kBAAkB,GAAC,CAAC;QAC3D,aAAa,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACvD,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,GAAG,IAAI,6BAAY,CAAC,MAAM,CAAC,CAAC;IAElC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,CAAC;IAE1E,IAAI,OAAO,EAAE,CAAC;QACb,MAAM,EAAE,iBAAiB,EAAE,GAAG,wDAAa,sBAAsB,GAAC,CAAC;QACnE,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAC5C,MAAM,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IAChB,MAAM,KAAK,GAAG,IAAA,0BAAW,EAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@n8n/task-runner",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "main": "dist/start.js",
5
5
  "module": "src/start.ts",
6
6
  "types": "dist/index.d.ts",
@@ -22,14 +22,16 @@
22
22
  }
23
23
  },
24
24
  "dependencies": {
25
+ "@sentry/integrations": "7.87.0",
26
+ "@sentry/node": "7.87.0",
25
27
  "acorn": "8.14.0",
26
28
  "acorn-walk": "8.3.4",
27
29
  "nanoid": "^3.3.6",
28
30
  "typedi": "0.10.0",
29
31
  "ws": "^8.18.0",
30
- "@n8n/config": "1.18.0",
31
- "n8n-core": "1.68.0",
32
- "n8n-workflow": "1.67.0"
32
+ "@n8n/config": "1.19.0",
33
+ "n8n-workflow": "1.68.0",
34
+ "n8n-core": "1.69.0"
33
35
  },
34
36
  "devDependencies": {
35
37
  "luxon": "3.4.4"