n8n 1.110.1 → 1.112.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/auth/auth.service.js +2 -0
- package/dist/auth/auth.service.js.map +1 -1
- package/dist/build.tsbuildinfo +1 -1
- package/dist/commands/start.d.ts +1 -0
- package/dist/commands/start.js +17 -0
- package/dist/commands/start.js.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.js +3 -1
- package/dist/constants.js.map +1 -1
- package/dist/controllers/dynamic-node-parameters.controller.js +6 -16
- package/dist/controllers/dynamic-node-parameters.controller.js.map +1 -1
- package/dist/controllers/e2e.controller.js +1 -0
- package/dist/controllers/e2e.controller.js.map +1 -1
- package/dist/controllers/folder.controller.d.ts +7 -2
- package/dist/controllers/folder.controller.js +24 -3
- package/dist/controllers/folder.controller.js.map +1 -1
- package/dist/controllers/role.controller.d.ts +5 -4
- package/dist/controllers/role.controller.js +21 -15
- package/dist/controllers/role.controller.js.map +1 -1
- package/dist/environments.ee/source-control/source-control.service.ee.js +2 -5
- package/dist/environments.ee/source-control/source-control.service.ee.js.map +1 -1
- package/dist/events/maps/relay.event-map.d.ts +4 -0
- package/dist/execution-lifecycle/execution-lifecycle-hooks.js +8 -1
- package/dist/execution-lifecycle/execution-lifecycle-hooks.js.map +1 -1
- package/dist/executions/execution-recovery.service.js +2 -1
- package/dist/executions/execution-recovery.service.js.map +1 -1
- package/dist/executions/execution.service.d.ts +2 -2
- package/dist/executions/execution.service.js +14 -1
- package/dist/executions/execution.service.js.map +1 -1
- package/dist/executions/execution.types.d.ts +2 -5
- package/dist/executions/executions.controller.d.ts +2 -2
- package/dist/middlewares/list-query/dtos/workflow.filter.dto.d.ts +1 -0
- package/dist/middlewares/list-query/dtos/workflow.filter.dto.js +6 -0
- package/dist/middlewares/list-query/dtos/workflow.filter.dto.js.map +1 -1
- package/dist/modules/community-packages/npm-utils.js +10 -0
- package/dist/modules/community-packages/npm-utils.js.map +1 -1
- package/dist/modules/data-table/data-store-aggregate.controller.d.ts +7 -1
- package/dist/modules/data-table/data-store-aggregate.controller.js +15 -2
- package/dist/modules/data-table/data-store-aggregate.controller.js.map +1 -1
- package/dist/modules/data-table/data-store-column.repository.js +1 -1
- package/dist/modules/data-table/data-store-column.repository.js.map +1 -1
- package/dist/modules/data-table/data-store-proxy.service.d.ts +3 -3
- package/dist/modules/data-table/data-store-proxy.service.js +13 -13
- package/dist/modules/data-table/data-store-proxy.service.js.map +1 -1
- package/dist/modules/data-table/data-store-rows.repository.d.ts +13 -20
- package/dist/modules/data-table/data-store-rows.repository.js +144 -125
- package/dist/modules/data-table/data-store-rows.repository.js.map +1 -1
- package/dist/modules/data-table/data-store-size-validator.service.d.ts +16 -0
- package/dist/modules/data-table/data-store-size-validator.service.js +79 -0
- package/dist/modules/data-table/data-store-size-validator.service.js.map +1 -0
- package/dist/modules/data-table/data-store.controller.d.ts +9 -9
- package/dist/modules/data-table/data-store.controller.js +16 -14
- package/dist/modules/data-table/data-store.controller.js.map +1 -1
- package/dist/modules/data-table/data-store.repository.d.ts +4 -1
- package/dist/modules/data-table/data-store.repository.js +47 -5
- package/dist/modules/data-table/data-store.repository.js.map +1 -1
- package/dist/modules/data-table/data-store.service.d.ts +19 -11
- package/dist/modules/data-table/data-store.service.js +102 -73
- package/dist/modules/data-table/data-store.service.js.map +1 -1
- package/dist/modules/data-table/data-store.types.d.ts +2 -0
- package/dist/modules/data-table/data-store.types.js +7 -0
- package/dist/modules/data-table/data-store.types.js.map +1 -1
- package/dist/modules/data-table/data-table.module.js +1 -1
- package/dist/modules/data-table/utils/sql-utils.d.ts +2 -5
- package/dist/modules/data-table/utils/sql-utils.js +7 -17
- package/dist/modules/data-table/utils/sql-utils.js.map +1 -1
- package/dist/public-api/types.d.ts +5 -0
- package/dist/public-api/v1/handlers/executions/executions.handler.d.ts +1 -0
- package/dist/public-api/v1/handlers/executions/executions.handler.js +34 -1
- package/dist/public-api/v1/handlers/executions/executions.handler.js.map +1 -1
- package/dist/public-api/v1/openapi.yml +60 -7
- package/dist/push/abstract.push.d.ts +2 -2
- package/dist/push/abstract.push.js +4 -4
- package/dist/push/abstract.push.js.map +1 -1
- package/dist/push/index.d.ts +3 -2
- package/dist/push/index.js +30 -26
- package/dist/push/index.js.map +1 -1
- package/dist/push/origin-validator.d.ts +13 -0
- package/dist/push/origin-validator.js +145 -0
- package/dist/push/origin-validator.js.map +1 -0
- package/dist/push/websocket.push.d.ts +1 -1
- package/dist/push/websocket.push.js +2 -2
- package/dist/push/websocket.push.js.map +1 -1
- package/dist/scaling/constants.d.ts +2 -2
- package/dist/scaling/pubsub/pubsub.event-map.d.ts +2 -0
- package/dist/scaling/pubsub/pubsub.registry.d.ts +1 -0
- package/dist/scaling/pubsub/pubsub.registry.js +9 -2
- package/dist/scaling/pubsub/pubsub.registry.js.map +1 -1
- package/dist/scaling/pubsub/pubsub.types.d.ts +2 -1
- package/dist/scaling/scaling.service.d.ts +1 -1
- package/dist/scaling/scaling.service.js +0 -4
- package/dist/scaling/scaling.service.js.map +1 -1
- package/dist/server.js +22 -23
- package/dist/server.js.map +1 -1
- package/dist/services/dynamic-node-parameters.service.d.ts +7 -1
- package/dist/services/dynamic-node-parameters.service.js +15 -2
- package/dist/services/dynamic-node-parameters.service.js.map +1 -1
- package/dist/services/frontend.service.js +5 -0
- package/dist/services/frontend.service.js.map +1 -1
- package/dist/services/ownership.service.d.ts +1 -0
- package/dist/services/ownership.service.js +6 -0
- package/dist/services/ownership.service.js.map +1 -1
- package/dist/services/public-api-key.service.js +2 -0
- package/dist/services/public-api-key.service.js.map +1 -1
- package/dist/services/role.service.d.ts +2 -2
- package/dist/services/role.service.js +3 -3
- package/dist/services/role.service.js.map +1 -1
- package/dist/sso.ee/oidc/oidc.service.ee.d.ts +25 -4
- package/dist/sso.ee/oidc/oidc.service.ee.js +167 -22
- package/dist/sso.ee/oidc/oidc.service.ee.js.map +1 -1
- package/dist/sso.ee/oidc/routes/oidc.controller.ee.d.ts +6 -2
- package/dist/sso.ee/oidc/routes/oidc.controller.ee.js +41 -7
- package/dist/sso.ee/oidc/routes/oidc.controller.ee.js.map +1 -1
- package/dist/sso.ee/sso-helpers.d.ts +1 -0
- package/dist/sso.ee/sso-helpers.js +19 -0
- package/dist/sso.ee/sso-helpers.js.map +1 -1
- package/dist/task-runners/errors/missing-requirements.error.d.ts +6 -0
- package/dist/task-runners/errors/missing-requirements.error.js +17 -0
- package/dist/task-runners/errors/missing-requirements.error.js.map +1 -0
- package/dist/task-runners/internal-task-runner-disconnect-analyzer.d.ts +2 -2
- package/dist/task-runners/internal-task-runner-disconnect-analyzer.js +2 -2
- package/dist/task-runners/internal-task-runner-disconnect-analyzer.js.map +1 -1
- package/dist/task-runners/task-runner-module.d.ts +5 -3
- package/dist/task-runners/task-runner-module.js +25 -13
- package/dist/task-runners/task-runner-module.js.map +1 -1
- package/dist/task-runners/task-runner-process-base.d.ts +39 -0
- package/dist/task-runners/task-runner-process-base.js +111 -0
- package/dist/task-runners/task-runner-process-base.js.map +1 -0
- package/dist/task-runners/task-runner-process-js.d.ts +21 -0
- package/dist/task-runners/{task-runner-process.js → task-runner-process-js.js} +35 -108
- package/dist/task-runners/task-runner-process-js.js.map +1 -0
- package/dist/task-runners/task-runner-process-py.d.ts +15 -0
- package/dist/task-runners/task-runner-process-py.js +76 -0
- package/dist/task-runners/task-runner-process-py.js.map +1 -0
- package/dist/task-runners/task-runner-process-restart-loop-detector.d.ts +2 -2
- package/dist/task-runners/task-runner-process-restart-loop-detector.js.map +1 -1
- package/dist/user-management/email/templates/credentials-shared.handlebars +48 -40
- package/dist/user-management/email/templates/n8n-logo.png +0 -0
- package/dist/user-management/email/templates/password-reset-requested.handlebars +68 -60
- package/dist/user-management/email/templates/project-shared.handlebars +43 -35
- package/dist/user-management/email/templates/user-invited.handlebars +48 -40
- package/dist/user-management/email/templates/workflow-shared.handlebars +48 -40
- package/dist/workflows/workflow.request.d.ts +1 -0
- package/dist/workflows/workflow.service.ee.js +1 -0
- package/dist/workflows/workflow.service.ee.js.map +1 -1
- package/package.json +24 -18
- package/dist/task-runners/task-runner-process.d.ts +0 -36
- package/dist/task-runners/task-runner-process.js.map +0 -1
|
@@ -198,7 +198,9 @@ paths:
|
|
|
198
198
|
schema:
|
|
199
199
|
type: string
|
|
200
200
|
enum:
|
|
201
|
+
- canceled
|
|
201
202
|
- error
|
|
203
|
+
- running
|
|
202
204
|
- success
|
|
203
205
|
- waiting
|
|
204
206
|
- name: workflowId
|
|
@@ -271,6 +273,39 @@ paths:
|
|
|
271
273
|
$ref: '#/components/responses/unauthorized'
|
|
272
274
|
'404':
|
|
273
275
|
$ref: '#/components/responses/notFound'
|
|
276
|
+
/executions/{id}/retry:
|
|
277
|
+
post:
|
|
278
|
+
x-eov-operation-id: retryExecution
|
|
279
|
+
x-eov-operation-handler: v1/handlers/executions/executions.handler
|
|
280
|
+
tags:
|
|
281
|
+
- Execution
|
|
282
|
+
summary: Retry an execution
|
|
283
|
+
description: Retry an execution from your instance.
|
|
284
|
+
parameters:
|
|
285
|
+
- $ref: '#/components/parameters/executionId'
|
|
286
|
+
requestBody:
|
|
287
|
+
required: false
|
|
288
|
+
content:
|
|
289
|
+
application/json:
|
|
290
|
+
schema:
|
|
291
|
+
type: object
|
|
292
|
+
properties:
|
|
293
|
+
loadWorkflow:
|
|
294
|
+
type: boolean
|
|
295
|
+
description: Whether to load the currently saved workflow to execute instead of the one saved at the time of the execution. If set to true, it will retry with the latest version of the workflow.
|
|
296
|
+
responses:
|
|
297
|
+
'200':
|
|
298
|
+
description: Operation successful.
|
|
299
|
+
content:
|
|
300
|
+
application/json:
|
|
301
|
+
schema:
|
|
302
|
+
$ref: '#/components/schemas/execution'
|
|
303
|
+
'401':
|
|
304
|
+
$ref: '#/components/responses/unauthorized'
|
|
305
|
+
'404':
|
|
306
|
+
$ref: '#/components/responses/notFound'
|
|
307
|
+
'409':
|
|
308
|
+
$ref: '#/components/responses/conflict'
|
|
274
309
|
/tags:
|
|
275
310
|
post:
|
|
276
311
|
x-eov-operation-id: createTag
|
|
@@ -948,6 +983,8 @@ paths:
|
|
|
948
983
|
- Variables
|
|
949
984
|
summary: Update a variable
|
|
950
985
|
description: Update a variable from your instance.
|
|
986
|
+
parameters:
|
|
987
|
+
- $ref: '#/components/parameters/variableId'
|
|
951
988
|
requestBody:
|
|
952
989
|
description: Payload for variable to update.
|
|
953
990
|
content:
|
|
@@ -1356,6 +1393,8 @@ components:
|
|
|
1356
1393
|
stoppedAt:
|
|
1357
1394
|
type: string
|
|
1358
1395
|
format: date-time
|
|
1396
|
+
nullable: true
|
|
1397
|
+
description: The time at which the execution stopped. Will only be null for executions that still have the status 'running'.
|
|
1359
1398
|
workflowId:
|
|
1360
1399
|
type: number
|
|
1361
1400
|
example: '1000'
|
|
@@ -1365,6 +1404,17 @@ components:
|
|
|
1365
1404
|
format: date-time
|
|
1366
1405
|
customData:
|
|
1367
1406
|
type: object
|
|
1407
|
+
status:
|
|
1408
|
+
type: string
|
|
1409
|
+
enum:
|
|
1410
|
+
- canceled
|
|
1411
|
+
- crashed
|
|
1412
|
+
- error
|
|
1413
|
+
- new
|
|
1414
|
+
- running
|
|
1415
|
+
- success
|
|
1416
|
+
- unknown
|
|
1417
|
+
- waiting
|
|
1368
1418
|
executionList:
|
|
1369
1419
|
type: object
|
|
1370
1420
|
properties:
|
|
@@ -1430,7 +1480,7 @@ components:
|
|
|
1430
1480
|
type: string
|
|
1431
1481
|
type:
|
|
1432
1482
|
type: string
|
|
1433
|
-
example: n8n-nodes-base.
|
|
1483
|
+
example: n8n-nodes-base.jira
|
|
1434
1484
|
typeVersion:
|
|
1435
1485
|
type: number
|
|
1436
1486
|
example: 1
|
|
@@ -1578,10 +1628,11 @@ components:
|
|
|
1578
1628
|
connections:
|
|
1579
1629
|
type: object
|
|
1580
1630
|
example:
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1631
|
+
Jira:
|
|
1632
|
+
main:
|
|
1633
|
+
- - node: Jira
|
|
1634
|
+
type: main
|
|
1635
|
+
index: 0
|
|
1585
1636
|
settings:
|
|
1586
1637
|
$ref: '#/components/schemas/workflowSettings'
|
|
1587
1638
|
staticData:
|
|
@@ -1899,10 +1950,10 @@ components:
|
|
|
1899
1950
|
description: Unauthorized
|
|
1900
1951
|
notFound:
|
|
1901
1952
|
description: The specified resource was not found.
|
|
1902
|
-
badRequest:
|
|
1903
|
-
description: The request is invalid or provides malformed data.
|
|
1904
1953
|
conflict:
|
|
1905
1954
|
description: Conflict
|
|
1955
|
+
badRequest:
|
|
1956
|
+
description: The request is invalid or provides malformed data.
|
|
1906
1957
|
forbidden:
|
|
1907
1958
|
description: Forbidden
|
|
1908
1959
|
NotFound:
|
|
@@ -2009,6 +2060,8 @@ components:
|
|
|
2009
2060
|
$ref: '#/components/parameters/userIdentifier'
|
|
2010
2061
|
IncludeRole:
|
|
2011
2062
|
$ref: '#/components/parameters/includeRole'
|
|
2063
|
+
VariableId:
|
|
2064
|
+
$ref: '#/components/parameters/variableId'
|
|
2012
2065
|
securitySchemes:
|
|
2013
2066
|
ApiKeyAuth:
|
|
2014
2067
|
type: apiKey
|
|
@@ -13,7 +13,7 @@ export declare abstract class AbstractPush<Connection> extends TypedEmitter<Abst
|
|
|
13
13
|
protected connections: Record<string, Connection>;
|
|
14
14
|
protected userIdByPushRef: Record<string, string>;
|
|
15
15
|
protected abstract close(connection: Connection): void;
|
|
16
|
-
protected abstract sendToOneConnection(connection: Connection, data: string): void;
|
|
16
|
+
protected abstract sendToOneConnection(connection: Connection, data: string, isBinary: boolean): void;
|
|
17
17
|
protected abstract ping(connection: Connection): void;
|
|
18
18
|
constructor(logger: Logger, errorReporter: ErrorReporter);
|
|
19
19
|
protected add(pushRef: string, userId: User['id'], connection: Connection): void;
|
|
@@ -22,7 +22,7 @@ export declare abstract class AbstractPush<Connection> extends TypedEmitter<Abst
|
|
|
22
22
|
private sendTo;
|
|
23
23
|
private pingAll;
|
|
24
24
|
sendToAll(pushMsg: PushMessage): void;
|
|
25
|
-
sendToOne(pushMsg: PushMessage, pushRef: string): void;
|
|
25
|
+
sendToOne(pushMsg: PushMessage, pushRef: string, asBinary?: boolean): void;
|
|
26
26
|
sendToUsers(pushMsg: PushMessage, userIds: Array<User['id']>): void;
|
|
27
27
|
closeAllConnections(): void;
|
|
28
28
|
hasPushRef(pushRef: string): boolean;
|
|
@@ -46,7 +46,7 @@ let AbstractPush = class AbstractPush extends typed_emitter_1.TypedEmitter {
|
|
|
46
46
|
delete this.connections[pushRef];
|
|
47
47
|
delete this.userIdByPushRef[pushRef];
|
|
48
48
|
}
|
|
49
|
-
sendTo({ type, data }, pushRefs) {
|
|
49
|
+
sendTo({ type, data }, pushRefs, asBinary = false) {
|
|
50
50
|
this.logger.debug(`Pushed to frontend: ${type}`, {
|
|
51
51
|
dataType: type,
|
|
52
52
|
pushRefs: pushRefs.join(', '),
|
|
@@ -55,7 +55,7 @@ let AbstractPush = class AbstractPush extends typed_emitter_1.TypedEmitter {
|
|
|
55
55
|
for (const pushRef of pushRefs) {
|
|
56
56
|
const connection = this.connections[pushRef];
|
|
57
57
|
(0, n8n_workflow_1.assert)(connection);
|
|
58
|
-
this.sendToOneConnection(connection, stringifiedPayload);
|
|
58
|
+
this.sendToOneConnection(connection, stringifiedPayload, asBinary);
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
pingAll() {
|
|
@@ -66,12 +66,12 @@ let AbstractPush = class AbstractPush extends typed_emitter_1.TypedEmitter {
|
|
|
66
66
|
sendToAll(pushMsg) {
|
|
67
67
|
this.sendTo(pushMsg, Object.keys(this.connections));
|
|
68
68
|
}
|
|
69
|
-
sendToOne(pushMsg, pushRef) {
|
|
69
|
+
sendToOne(pushMsg, pushRef, asBinary = false) {
|
|
70
70
|
if (this.connections[pushRef] === undefined) {
|
|
71
71
|
this.logger.debug(`The session "${pushRef}" is not registered.`, { pushRef });
|
|
72
72
|
return;
|
|
73
73
|
}
|
|
74
|
-
this.sendTo(pushMsg, [pushRef]);
|
|
74
|
+
this.sendTo(pushMsg, [pushRef], asBinary);
|
|
75
75
|
}
|
|
76
76
|
sendToUsers(pushMsg, userIds) {
|
|
77
77
|
const { connections } = this;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract.push.js","sourceRoot":"","sources":["../../src/push/abstract.push.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,wDAA6C;AAE7C,gCAAkC;AAClC,uCAAyC;AACzC,+CAAqD;AAGrD,mDAA+C;AAaxC,IAAe,YAAY,GAA3B,MAAe,YAAyB,SAAQ,4BAAgC;
|
|
1
|
+
{"version":3,"file":"abstract.push.js","sourceRoot":"","sources":["../../src/push/abstract.push.ts"],"names":[],"mappings":"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"}
|
package/dist/push/index.d.ts
CHANGED
|
@@ -31,11 +31,12 @@ export declare class Push extends TypedEmitter<PushEvents> {
|
|
|
31
31
|
handleRequest(req: SSEPushRequest | WebSocketPushRequest, res: PushResponse): void;
|
|
32
32
|
broadcast(pushMsg: PushMessage): void;
|
|
33
33
|
hasPushRef(pushRef: string): boolean;
|
|
34
|
-
send(pushMsg: PushMessage, pushRef: string): void;
|
|
34
|
+
send(pushMsg: PushMessage, pushRef: string, asBinary?: boolean): void;
|
|
35
35
|
sendToUsers(pushMsg: PushMessage, userIds: Array<User['id']>): void;
|
|
36
36
|
onShutdown(): void;
|
|
37
37
|
private shouldRelayViaPubSub;
|
|
38
|
-
handleRelayExecutionLifecycleEvent({ pushRef, ...pushMsg }: PushMessage & {
|
|
38
|
+
handleRelayExecutionLifecycleEvent({ pushRef, asBinary, ...pushMsg }: PushMessage & {
|
|
39
|
+
asBinary: boolean;
|
|
39
40
|
pushRef: string;
|
|
40
41
|
}): void;
|
|
41
42
|
private relayViaPubSub;
|
package/dist/push/index.js
CHANGED
|
@@ -23,10 +23,10 @@ const n8n_workflow_1 = require("n8n-workflow");
|
|
|
23
23
|
const url_1 = require("url");
|
|
24
24
|
const ws_1 = require("ws");
|
|
25
25
|
const auth_service_1 = require("../auth/auth.service");
|
|
26
|
-
const constants_1 = require("../constants");
|
|
27
26
|
const bad_request_error_1 = require("../errors/response-errors/bad-request.error");
|
|
28
27
|
const publisher_service_1 = require("../scaling/pubsub/publisher.service");
|
|
29
28
|
const typed_emitter_1 = require("../typed-emitter");
|
|
29
|
+
const origin_validator_1 = require("./origin-validator");
|
|
30
30
|
const push_config_1 = require("./push.config");
|
|
31
31
|
const sse_push_1 = require("./sse.push");
|
|
32
32
|
const websocket_push_1 = require("./websocket.push");
|
|
@@ -74,20 +74,24 @@ let Push = class Push extends typed_emitter_1.TypedEmitter {
|
|
|
74
74
|
handleRequest(req, res) {
|
|
75
75
|
const { ws, query: { pushRef }, user, headers, } = req;
|
|
76
76
|
let connectionError = '';
|
|
77
|
-
const originHost = headers.origin?.replace(/^https?:\/\//, '');
|
|
78
77
|
if (!pushRef) {
|
|
79
78
|
connectionError = 'The query parameter "pushRef" is missing!';
|
|
80
79
|
}
|
|
81
|
-
else if (!originHost) {
|
|
82
|
-
this.logger.warn('Origin header is missing');
|
|
83
|
-
connectionError = 'Invalid origin!';
|
|
84
|
-
}
|
|
85
80
|
else if (backend_common_1.inProduction) {
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
81
|
+
const validation = (0, origin_validator_1.validateOriginHeaders)(headers);
|
|
82
|
+
if (!validation.isValid) {
|
|
83
|
+
this.logger.warn('Origin header does NOT match the expected origin. ' +
|
|
84
|
+
`(Origin: "${headers.origin}" -> "${validation.originInfo?.host || 'N/A'}", ` +
|
|
85
|
+
`Expected: "${validation.rawExpectedHost}" -> "${validation.expectedHost}", ` +
|
|
86
|
+
`Protocol: "${validation.expectedProtocol}")`, {
|
|
87
|
+
headers: (0, pick_1.default)(headers, [
|
|
88
|
+
'host',
|
|
89
|
+
'origin',
|
|
90
|
+
'x-forwarded-proto',
|
|
91
|
+
'x-forwarded-host',
|
|
92
|
+
'forwarded',
|
|
93
|
+
]),
|
|
94
|
+
});
|
|
91
95
|
connectionError = 'Invalid origin!';
|
|
92
96
|
}
|
|
93
97
|
}
|
|
@@ -117,12 +121,12 @@ let Push = class Push extends typed_emitter_1.TypedEmitter {
|
|
|
117
121
|
hasPushRef(pushRef) {
|
|
118
122
|
return this.backend.hasPushRef(pushRef);
|
|
119
123
|
}
|
|
120
|
-
send(pushMsg, pushRef) {
|
|
124
|
+
send(pushMsg, pushRef, asBinary = false) {
|
|
121
125
|
if (this.shouldRelayViaPubSub(pushRef)) {
|
|
122
|
-
this.relayViaPubSub(pushMsg, pushRef);
|
|
126
|
+
this.relayViaPubSub(pushMsg, pushRef, asBinary);
|
|
123
127
|
return;
|
|
124
128
|
}
|
|
125
|
-
this.backend.sendToOne(pushMsg, pushRef);
|
|
129
|
+
this.backend.sendToOne(pushMsg, pushRef, asBinary);
|
|
126
130
|
}
|
|
127
131
|
sendToUsers(pushMsg, userIds) {
|
|
128
132
|
this.backend.sendToUsers(pushMsg, userIds);
|
|
@@ -134,36 +138,36 @@ let Push = class Push extends typed_emitter_1.TypedEmitter {
|
|
|
134
138
|
const { isWorker, isMultiMain } = this.instanceSettings;
|
|
135
139
|
return isWorker || (isMultiMain && !this.hasPushRef(pushRef));
|
|
136
140
|
}
|
|
137
|
-
handleRelayExecutionLifecycleEvent({ pushRef, ...pushMsg }) {
|
|
141
|
+
handleRelayExecutionLifecycleEvent({ pushRef, asBinary, ...pushMsg }) {
|
|
138
142
|
if (!this.hasPushRef(pushRef))
|
|
139
143
|
return;
|
|
140
|
-
this.send(pushMsg, pushRef);
|
|
144
|
+
this.send(pushMsg, pushRef, asBinary);
|
|
141
145
|
}
|
|
142
|
-
relayViaPubSub(pushMsg, pushRef) {
|
|
146
|
+
relayViaPubSub(pushMsg, pushRef, asBinary = false) {
|
|
143
147
|
const eventSizeBytes = new TextEncoder().encode(JSON.stringify(pushMsg.data)).length;
|
|
144
148
|
if (eventSizeBytes <= MAX_PAYLOAD_SIZE_BYTES) {
|
|
145
149
|
void this.publisher.publishCommand({
|
|
146
150
|
command: 'relay-execution-lifecycle-event',
|
|
147
|
-
payload: { ...pushMsg, pushRef },
|
|
151
|
+
payload: { ...pushMsg, pushRef, asBinary },
|
|
148
152
|
});
|
|
149
153
|
return;
|
|
150
154
|
}
|
|
151
|
-
const
|
|
155
|
+
const { type } = pushMsg;
|
|
152
156
|
const toMb = (bytes) => (bytes / (1024 * 1024)).toFixed(0);
|
|
153
157
|
const eventMb = toMb(eventSizeBytes);
|
|
154
158
|
const maxMb = toMb(MAX_PAYLOAD_SIZE_BYTES);
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
pushMsgCopy.data.itemCount = pushMsgCopy.data.data.data?.main[0]?.length ?? 1;
|
|
159
|
-
pushMsgCopy.data.data.data = constants_1.TRIMMED_TASK_DATA_CONNECTIONS;
|
|
159
|
+
if (type === 'nodeExecuteAfterData') {
|
|
160
|
+
this.logger.warn(`Size of "${type}" (${eventMb} MB) exceeds max size ${maxMb} MB. Skipping...`);
|
|
161
|
+
return;
|
|
160
162
|
}
|
|
161
|
-
|
|
163
|
+
this.logger.warn(`Size of "${type}" (${eventMb} MB) exceeds max size ${maxMb} MB. Trimming...`);
|
|
164
|
+
const pushMsgCopy = (0, n8n_workflow_1.deepCopy)(pushMsg);
|
|
165
|
+
if (pushMsgCopy.type === 'executionFinished') {
|
|
162
166
|
pushMsgCopy.data.rawData = '';
|
|
163
167
|
}
|
|
164
168
|
void this.publisher.publishCommand({
|
|
165
169
|
command: 'relay-execution-lifecycle-event',
|
|
166
|
-
payload: { ...pushMsgCopy, pushRef },
|
|
170
|
+
payload: { ...pushMsgCopy, pushRef, asBinary },
|
|
167
171
|
});
|
|
168
172
|
}
|
|
169
173
|
};
|
package/dist/push/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/push/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,wDAA2D;AAE3D,gDAA4D;AAC5D,gCAA6C;AAE7C,+BAAsC;AAEtC,uDAA+B;AAC/B,uCAA4C;AAC5C,+CAAwC;AACxC,6BAAwC;AACxC,2BAAwC;AAExC,sDAAkD;AAClD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/push/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Request } from 'express';
|
|
2
|
+
export interface OriginValidationResult {
|
|
3
|
+
isValid: boolean;
|
|
4
|
+
originInfo?: {
|
|
5
|
+
protocol: 'http' | 'https';
|
|
6
|
+
host: string;
|
|
7
|
+
};
|
|
8
|
+
expectedHost?: string;
|
|
9
|
+
expectedProtocol?: 'http' | 'https';
|
|
10
|
+
rawExpectedHost?: string;
|
|
11
|
+
error?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function validateOriginHeaders(headers: Request['headers']): OriginValidationResult;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateOriginHeaders = validateOriginHeaders;
|
|
4
|
+
function validateOriginHeaders(headers) {
|
|
5
|
+
const originInfo = parseOrigin(headers.origin ?? '');
|
|
6
|
+
if (!originInfo) {
|
|
7
|
+
return {
|
|
8
|
+
isValid: false,
|
|
9
|
+
error: 'Origin header is missing or malformed',
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
let rawExpectedHost;
|
|
13
|
+
let expectedProtocol = originInfo.protocol;
|
|
14
|
+
const forwarded = parseForwardedHeader(headers.forwarded ?? '');
|
|
15
|
+
if (forwarded?.host) {
|
|
16
|
+
rawExpectedHost = forwarded.host;
|
|
17
|
+
if (forwarded.proto) {
|
|
18
|
+
const validatedProto = validateProtocol(forwarded.proto);
|
|
19
|
+
if (validatedProto) {
|
|
20
|
+
expectedProtocol = validatedProto;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
const xForwardedHost = getFirstHeaderValue(headers['x-forwarded-host']);
|
|
26
|
+
if (xForwardedHost) {
|
|
27
|
+
rawExpectedHost = xForwardedHost;
|
|
28
|
+
const xForwardedProto = getFirstHeaderValue(headers['x-forwarded-proto']);
|
|
29
|
+
if (xForwardedProto) {
|
|
30
|
+
const validatedProto = validateProtocol(xForwardedProto.split(',')[0]?.trim());
|
|
31
|
+
if (validatedProto) {
|
|
32
|
+
expectedProtocol = validatedProto;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
rawExpectedHost = headers.host;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const normalizedExpectedHost = normalizeHost(rawExpectedHost ?? '', expectedProtocol);
|
|
41
|
+
const isValid = normalizedExpectedHost === originInfo.host;
|
|
42
|
+
return {
|
|
43
|
+
isValid,
|
|
44
|
+
originInfo,
|
|
45
|
+
expectedHost: normalizedExpectedHost,
|
|
46
|
+
expectedProtocol,
|
|
47
|
+
rawExpectedHost,
|
|
48
|
+
error: isValid ? undefined : 'Origin header does not match expected host',
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function normalizeHost(host, protocol) {
|
|
52
|
+
if (!host)
|
|
53
|
+
return host;
|
|
54
|
+
try {
|
|
55
|
+
const url = new URL(`${protocol}://${host}`);
|
|
56
|
+
const defaultPort = protocol === 'https' ? '443' : '80';
|
|
57
|
+
const actualPort = url.port || defaultPort;
|
|
58
|
+
if (actualPort === defaultPort) {
|
|
59
|
+
return stripIPv6Brackets(url.hostname);
|
|
60
|
+
}
|
|
61
|
+
return stripIPv6Brackets(url.host);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return host;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function stripIPv6Brackets(hostname) {
|
|
68
|
+
if (hostname.startsWith('[') && hostname.includes(']:')) {
|
|
69
|
+
const closingBracket = hostname.indexOf(']:');
|
|
70
|
+
const ipv6 = hostname.slice(1, closingBracket);
|
|
71
|
+
const port = hostname.slice(closingBracket + 2);
|
|
72
|
+
return `${ipv6}:${port}`;
|
|
73
|
+
}
|
|
74
|
+
if (hostname.startsWith('[') && hostname.endsWith(']')) {
|
|
75
|
+
return hostname.slice(1, -1);
|
|
76
|
+
}
|
|
77
|
+
return hostname;
|
|
78
|
+
}
|
|
79
|
+
function getFirstHeaderValue(header) {
|
|
80
|
+
if (!header)
|
|
81
|
+
return undefined;
|
|
82
|
+
if (typeof header === 'string')
|
|
83
|
+
return header;
|
|
84
|
+
return header[0];
|
|
85
|
+
}
|
|
86
|
+
function validateProtocol(proto) {
|
|
87
|
+
if (!proto)
|
|
88
|
+
return undefined;
|
|
89
|
+
const normalized = proto.toLowerCase().trim();
|
|
90
|
+
return normalized === 'http' || normalized === 'https' ? normalized : undefined;
|
|
91
|
+
}
|
|
92
|
+
function parseForwardedHeader(forwardedHeader) {
|
|
93
|
+
if (!forwardedHeader || typeof forwardedHeader !== 'string') {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const firstEntry = forwardedHeader.split(',')[0]?.trim();
|
|
98
|
+
if (!firstEntry)
|
|
99
|
+
return null;
|
|
100
|
+
const result = {};
|
|
101
|
+
const pairs = firstEntry.split(';');
|
|
102
|
+
for (const pair of pairs) {
|
|
103
|
+
const [key, value] = pair.split('=', 2);
|
|
104
|
+
if (!key || !value)
|
|
105
|
+
continue;
|
|
106
|
+
const cleanKey = key.trim().toLowerCase();
|
|
107
|
+
const cleanValue = value.trim().replace(/^["']|["']$/g, '');
|
|
108
|
+
if (cleanKey === 'host') {
|
|
109
|
+
result.host = cleanValue;
|
|
110
|
+
}
|
|
111
|
+
else if (cleanKey === 'proto') {
|
|
112
|
+
result.proto = cleanValue;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function parseOrigin(origin) {
|
|
122
|
+
if (!origin || typeof origin !== 'string') {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
const url = new URL(origin);
|
|
127
|
+
const protocol = url.protocol.toLowerCase();
|
|
128
|
+
if (protocol !== 'http:' && protocol !== 'https:') {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
const protocolName = protocol === 'https:' ? 'https' : 'http';
|
|
132
|
+
const defaultPort = protocolName === 'https' ? '443' : '80';
|
|
133
|
+
const actualPort = url.port || defaultPort;
|
|
134
|
+
const rawHost = actualPort === defaultPort ? url.hostname : url.host;
|
|
135
|
+
const normalizedHost = stripIPv6Brackets(rawHost);
|
|
136
|
+
return {
|
|
137
|
+
protocol: protocolName,
|
|
138
|
+
host: normalizedHost,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=origin-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"origin-validator.js","sourceRoot":"","sources":["../../src/push/origin-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { AbstractPush } from './abstract.push';
|
|
|
4
4
|
export declare class WebSocketPush extends AbstractPush<WebSocket> {
|
|
5
5
|
add(pushRef: string, userId: User['id'], connection: WebSocket): void;
|
|
6
6
|
protected close(connection: WebSocket): void;
|
|
7
|
-
protected sendToOneConnection(connection: WebSocket, data: string): void;
|
|
7
|
+
protected sendToOneConnection(connection: WebSocket, data: string, asBinary: boolean): void;
|
|
8
8
|
protected ping(connection: WebSocket): void;
|
|
9
9
|
private isClientHeartbeat;
|
|
10
10
|
}
|
|
@@ -57,8 +57,8 @@ let WebSocketPush = class WebSocketPush extends abstract_push_1.AbstractPush {
|
|
|
57
57
|
close(connection) {
|
|
58
58
|
connection.close();
|
|
59
59
|
}
|
|
60
|
-
sendToOneConnection(connection, data) {
|
|
61
|
-
connection.send(data);
|
|
60
|
+
sendToOneConnection(connection, data, asBinary) {
|
|
61
|
+
connection.send(data, { binary: asBinary });
|
|
62
62
|
}
|
|
63
63
|
ping(connection) {
|
|
64
64
|
if (!connection.isAlive) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.push.js","sourceRoot":"","sources":["../../src/push/websocket.push.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8CAAwD;AAExD,gCAAkC;AAClC,+CAA+C;AAG/C,mDAA+C;AAE/C,SAAS,SAAS;IACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AACrB,CAAC;AAGM,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,4BAAuB;IACzD,GAAG,CAAC,OAAe,EAAE,MAAkB,EAAE,UAAqB;QAC7D,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEjC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAEvC,MAAM,SAAS,GAAG,KAAK,EAAE,IAAuB,EAAE,EAAE;YACnD,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;oBACjC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACrB,CAAC,CAAC,IAAI,YAAY,WAAW;wBAC5B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;wBACnB,CAAC,CAAC,IAAI,CAAC;gBAET,MAAM,GAAG,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;gBAKzD,IAAI,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvC,OAAO;gBACR,CAAC;gBAED,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC,aAAa,CAAC,KAAK,CACvB,IAAI,8BAAe,CAAC,4BAA4B,EAAE;oBACjD,KAAK,EAAE;wBACN,MAAM;wBACN,IAAI;qBACJ;oBACD,KAAK,EAAE,KAAK;iBACZ,CAAC,CACF,CAAC;gBACF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE;oBAC1D,KAAK,EAAE,KAAgB;oBACvB,OAAO;oBACP,IAAI;iBACJ,CAAC,CAAC;YACJ,CAAC;QACF,CAAC,CAAC;QAGF,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YAC7B,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAClC,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACrC,CAAC;IAES,KAAK,CAAC,UAAqB;QACpC,UAAU,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAES,mBAAmB,CAAC,UAAqB,EAAE,IAAY;
|
|
1
|
+
{"version":3,"file":"websocket.push.js","sourceRoot":"","sources":["../../src/push/websocket.push.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,5 +2,5 @@ export declare const QUEUE_NAME = "jobs";
|
|
|
2
2
|
export declare const JOB_TYPE_NAME = "job";
|
|
3
3
|
export declare const COMMAND_PUBSUB_CHANNEL = "n8n.commands";
|
|
4
4
|
export declare const WORKER_RESPONSE_PUBSUB_CHANNEL = "n8n.worker-response";
|
|
5
|
-
export declare const SELF_SEND_COMMANDS: Set<"reload-license" | "restart-event-bus" | "reload-external-secrets-providers" | "community-package-install" | "community-package-update" | "community-package-uninstall" | "get-worker-id" | "get-worker-status" | "add-webhooks-triggers-and-pollers" | "remove-triggers-and-pollers" | "display-workflow-activation" | "display-workflow-deactivation" | "display-workflow-activation-error" | "relay-execution-lifecycle-event" | "clear-test-webhooks">;
|
|
6
|
-
export declare const IMMEDIATE_COMMANDS: Set<"reload-license" | "restart-event-bus" | "reload-external-secrets-providers" | "community-package-install" | "community-package-update" | "community-package-uninstall" | "get-worker-id" | "get-worker-status" | "add-webhooks-triggers-and-pollers" | "remove-triggers-and-pollers" | "display-workflow-activation" | "display-workflow-deactivation" | "display-workflow-activation-error" | "relay-execution-lifecycle-event" | "clear-test-webhooks">;
|
|
5
|
+
export declare const SELF_SEND_COMMANDS: Set<"reload-license" | "restart-event-bus" | "reload-external-secrets-providers" | "community-package-install" | "community-package-update" | "community-package-uninstall" | "get-worker-id" | "get-worker-status" | "add-webhooks-triggers-and-pollers" | "remove-triggers-and-pollers" | "display-workflow-activation" | "display-workflow-deactivation" | "display-workflow-activation-error" | "relay-execution-lifecycle-event" | "clear-test-webhooks" | "reload-oidc-config">;
|
|
6
|
+
export declare const IMMEDIATE_COMMANDS: Set<"reload-license" | "restart-event-bus" | "reload-external-secrets-providers" | "community-package-install" | "community-package-update" | "community-package-uninstall" | "get-worker-id" | "get-worker-status" | "add-webhooks-triggers-and-pollers" | "remove-triggers-and-pollers" | "display-workflow-activation" | "display-workflow-deactivation" | "display-workflow-activation-error" | "relay-execution-lifecycle-event" | "clear-test-webhooks" | "reload-oidc-config">;
|
|
@@ -4,6 +4,7 @@ export type PubSubCommandMap = {
|
|
|
4
4
|
'reload-license': never;
|
|
5
5
|
'restart-event-bus': never;
|
|
6
6
|
'reload-external-secrets-providers': never;
|
|
7
|
+
'reload-oidc-config': never;
|
|
7
8
|
'community-package-install': {
|
|
8
9
|
packageName: string;
|
|
9
10
|
packageVersion: string;
|
|
@@ -35,6 +36,7 @@ export type PubSubCommandMap = {
|
|
|
35
36
|
};
|
|
36
37
|
'relay-execution-lifecycle-event': PushMessage & {
|
|
37
38
|
pushRef: string;
|
|
39
|
+
asBinary: boolean;
|
|
38
40
|
};
|
|
39
41
|
'clear-test-webhooks': {
|
|
40
42
|
webhookKey: string;
|
|
@@ -8,5 +8,6 @@ export declare class PubSubRegistry {
|
|
|
8
8
|
private readonly pubSubMetadata;
|
|
9
9
|
private readonly pubsubEventBus;
|
|
10
10
|
constructor(logger: Logger, instanceSettings: InstanceSettings, pubSubMetadata: PubSubMetadata, pubsubEventBus: PubSubEventBus);
|
|
11
|
+
private eventHandlers;
|
|
11
12
|
init(): void;
|
|
12
13
|
}
|
|
@@ -21,22 +21,29 @@ let PubSubRegistry = class PubSubRegistry {
|
|
|
21
21
|
this.instanceSettings = instanceSettings;
|
|
22
22
|
this.pubSubMetadata = pubSubMetadata;
|
|
23
23
|
this.pubsubEventBus = pubsubEventBus;
|
|
24
|
+
this.eventHandlers = [];
|
|
24
25
|
this.logger = this.logger.scoped('pubsub');
|
|
25
26
|
}
|
|
26
27
|
init() {
|
|
27
28
|
const { instanceSettings, pubSubMetadata } = this;
|
|
29
|
+
for (const { eventName, handler } of this.eventHandlers) {
|
|
30
|
+
this.pubsubEventBus.off(eventName, handler);
|
|
31
|
+
}
|
|
32
|
+
this.eventHandlers = [];
|
|
28
33
|
const handlers = pubSubMetadata.getHandlers();
|
|
29
34
|
for (const { eventHandlerClass, methodName, eventName, filter } of handlers) {
|
|
30
35
|
const handlerClass = di_1.Container.get(eventHandlerClass);
|
|
31
36
|
if (!filter?.instanceType || filter.instanceType === instanceSettings.instanceType) {
|
|
32
37
|
this.logger.debug(`Registered a "${eventName}" event handler on ${eventHandlerClass.name}#${methodName}`);
|
|
33
|
-
|
|
38
|
+
const eventHandler = async (...args) => {
|
|
34
39
|
const shouldTrigger = filter?.instanceType !== 'main' ||
|
|
35
40
|
!filter.instanceRole ||
|
|
36
41
|
filter.instanceRole === instanceSettings.instanceRole;
|
|
37
42
|
if (shouldTrigger)
|
|
38
43
|
await handlerClass[methodName].call(handlerClass, ...args);
|
|
39
|
-
}
|
|
44
|
+
};
|
|
45
|
+
this.pubsubEventBus.on(eventName, eventHandler);
|
|
46
|
+
this.eventHandlers.push({ eventName, handler: eventHandler });
|
|
40
47
|
}
|
|
41
48
|
}
|
|
42
49
|
}
|