n8n 1.15.2 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/AbstractServer.js +3 -0
  2. package/dist/AbstractServer.js.map +1 -1
  3. package/dist/ActiveWorkflowRunner.d.ts +33 -11
  4. package/dist/ActiveWorkflowRunner.js +170 -131
  5. package/dist/ActiveWorkflowRunner.js.map +1 -1
  6. package/dist/CredentialsHelper.d.ts +2 -5
  7. package/dist/CredentialsHelper.js +1 -20
  8. package/dist/CredentialsHelper.js.map +1 -1
  9. package/dist/Interfaces.d.ts +24 -25
  10. package/dist/Interfaces.js.map +1 -1
  11. package/dist/License.js +9 -0
  12. package/dist/License.js.map +1 -1
  13. package/dist/LoadNodesAndCredentials.js +1 -1
  14. package/dist/LoadNodesAndCredentials.js.map +1 -1
  15. package/dist/Server.js +8 -146
  16. package/dist/Server.js.map +1 -1
  17. package/dist/auth/jwt.d.ts +1 -0
  18. package/dist/auth/jwt.js +6 -4
  19. package/dist/auth/jwt.js.map +1 -1
  20. package/dist/build.tsbuildinfo +1 -1
  21. package/dist/collaboration/collaboration.message.d.ts +11 -0
  22. package/dist/collaboration/collaboration.message.js +15 -0
  23. package/dist/collaboration/collaboration.message.js.map +1 -0
  24. package/dist/collaboration/collaboration.service.d.ts +15 -0
  25. package/dist/collaboration/collaboration.service.js +85 -0
  26. package/dist/collaboration/collaboration.service.js.map +1 -0
  27. package/dist/collaboration/collaboration.state.d.ts +13 -0
  28. package/dist/collaboration/collaboration.state.js +52 -0
  29. package/dist/collaboration/collaboration.state.js.map +1 -0
  30. package/dist/commands/BaseCommand.js +10 -0
  31. package/dist/commands/BaseCommand.js.map +1 -1
  32. package/dist/commands/start.d.ts +1 -0
  33. package/dist/commands/start.js +24 -7
  34. package/dist/commands/start.js.map +1 -1
  35. package/dist/config/index.d.ts +1 -0
  36. package/dist/config/index.js +1 -1
  37. package/dist/config/index.js.map +1 -1
  38. package/dist/config/schema.d.ts +6 -0
  39. package/dist/config/schema.js +6 -0
  40. package/dist/config/schema.js.map +1 -1
  41. package/dist/constants.d.ts +0 -1
  42. package/dist/constants.js +1 -4
  43. package/dist/constants.js.map +1 -1
  44. package/dist/controllers/communityPackages.controller.js +5 -5
  45. package/dist/controllers/communityPackages.controller.js.map +1 -1
  46. package/dist/controllers/index.d.ts +2 -0
  47. package/dist/controllers/index.js +5 -1
  48. package/dist/controllers/index.js.map +1 -1
  49. package/dist/controllers/oauth/abstractOAuth.controller.d.ts +25 -0
  50. package/dist/controllers/oauth/abstractOAuth.controller.js +104 -0
  51. package/dist/controllers/oauth/abstractOAuth.controller.js.map +1 -0
  52. package/dist/controllers/oauth/oAuth1Credential.controller.d.ts +8 -0
  53. package/dist/controllers/oauth/oAuth1Credential.controller.js +156 -0
  54. package/dist/controllers/oauth/oAuth1Credential.controller.js.map +1 -0
  55. package/dist/controllers/oauth/oAuth2Credential.controller.d.ts +12 -0
  56. package/dist/controllers/oauth/oAuth2Credential.controller.js +233 -0
  57. package/dist/controllers/oauth/oAuth2Credential.controller.js.map +1 -0
  58. package/dist/controllers/passwordReset.controller.d.ts +6 -6
  59. package/dist/controllers/passwordReset.controller.js +35 -63
  60. package/dist/controllers/passwordReset.controller.js.map +1 -1
  61. package/dist/controllers/users.controller.js +2 -8
  62. package/dist/controllers/users.controller.js.map +1 -1
  63. package/dist/databases/entities/WorkflowEntity.d.ts +1 -0
  64. package/dist/databases/entities/WorkflowEntity.js +3 -0
  65. package/dist/databases/entities/WorkflowEntity.js.map +1 -1
  66. package/dist/databases/repositories/execution.repository.d.ts +0 -10
  67. package/dist/databases/repositories/execution.repository.js +0 -99
  68. package/dist/databases/repositories/execution.repository.js.map +1 -1
  69. package/dist/databases/repositories/sharedCredentials.repository.d.ts +2 -0
  70. package/dist/databases/repositories/sharedCredentials.repository.js +12 -0
  71. package/dist/databases/repositories/sharedCredentials.repository.js.map +1 -1
  72. package/dist/databases/repositories/workflow.repository.d.ts +2 -0
  73. package/dist/databases/repositories/workflow.repository.js +12 -0
  74. package/dist/databases/repositories/workflow.repository.js.map +1 -1
  75. package/dist/databases/utils/migrationHelpers.js +2 -2
  76. package/dist/databases/utils/migrationHelpers.js.map +1 -1
  77. package/dist/decorators/Route.d.ts +1 -0
  78. package/dist/decorators/Route.js +2 -1
  79. package/dist/decorators/Route.js.map +1 -1
  80. package/dist/decorators/registerController.d.ts +2 -1
  81. package/dist/decorators/registerController.js +5 -3
  82. package/dist/decorators/registerController.js.map +1 -1
  83. package/dist/decorators/types.d.ts +1 -0
  84. package/dist/eventbus/MessageEventBus/recoverEvents.js +1 -1
  85. package/dist/eventbus/MessageEventBus/recoverEvents.js.map +1 -1
  86. package/dist/executionLifecycleHooks/toSaveSettings.js +13 -9
  87. package/dist/executionLifecycleHooks/toSaveSettings.js.map +1 -1
  88. package/dist/executions/executions.service.js +1 -1
  89. package/dist/executions/executions.service.js.map +1 -1
  90. package/dist/middlewares/auth.js +1 -3
  91. package/dist/middlewares/auth.js.map +1 -1
  92. package/dist/push/abstract.push.d.ts +12 -4
  93. package/dist/push/abstract.push.js +39 -12
  94. package/dist/push/abstract.push.js.map +1 -1
  95. package/dist/push/index.d.ts +5 -1
  96. package/dist/push/index.js +16 -5
  97. package/dist/push/index.js.map +1 -1
  98. package/dist/push/sse.push.d.ts +2 -1
  99. package/dist/push/sse.push.js +2 -2
  100. package/dist/push/sse.push.js.map +1 -1
  101. package/dist/push/types.d.ts +8 -0
  102. package/dist/push/websocket.push.d.ts +2 -1
  103. package/dist/push/websocket.push.js +17 -2
  104. package/dist/push/websocket.push.js.map +1 -1
  105. package/dist/requests.d.ts +3 -1
  106. package/dist/services/frontend.service.js +4 -2
  107. package/dist/services/frontend.service.js.map +1 -1
  108. package/dist/services/jwt.service.d.ts +1 -1
  109. package/dist/services/jwt.service.js.map +1 -1
  110. package/dist/services/orchestration/main/MultiMainInstance.publisher.ee.d.ts +2 -1
  111. package/dist/services/orchestration/main/MultiMainInstance.publisher.ee.js +6 -0
  112. package/dist/services/orchestration/main/MultiMainInstance.publisher.ee.js.map +1 -1
  113. package/dist/services/orchestration.base.service.d.ts +3 -1
  114. package/dist/services/orchestration.base.service.js +3 -1
  115. package/dist/services/orchestration.base.service.js.map +1 -1
  116. package/dist/services/pruning.service.d.ts +22 -0
  117. package/dist/services/pruning.service.js +179 -0
  118. package/dist/services/pruning.service.js.map +1 -0
  119. package/dist/services/user.service.d.ts +8 -2
  120. package/dist/services/user.service.js +45 -5
  121. package/dist/services/user.service.js.map +1 -1
  122. package/oclif.manifest.json +1 -1
  123. package/package.json +6 -5
  124. package/dist/credentials/oauth2Credential.api.d.ts +0 -1
  125. package/dist/credentials/oauth2Credential.api.js +0 -227
  126. package/dist/credentials/oauth2Credential.api.js.map +0 -1
  127. /package/templates/{oauth-callback.html → oauth-callback.handlebars} +0 -0
@@ -50,6 +50,9 @@ class AbstractServer {
50
50
  this.testWebhooksEnabled = false;
51
51
  this.app = (0, express_1.default)();
52
52
  this.app.disable('x-powered-by');
53
+ const proxyHops = config_1.default.getEnv('proxy_hops');
54
+ if (proxyHops > 0)
55
+ this.app.set('trust proxy', proxyHops);
53
56
  this.protocol = config_1.default.getEnv('protocol');
54
57
  this.sslKey = config_1.default.getEnv('ssl_key');
55
58
  this.sslCert = config_1.default.getEnv('ssl_cert');
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractServer.js","sourceRoot":"","sources":["../src/AbstractServer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AbstractServer.js","sourceRoot":"","sources":["../src/AbstractServer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAmC;AACnC,0CAAuC;AAEvC,sDAA8B;AAC9B,8DAAsC;AACtC,kDAA0B;AAE1B,sDAA8B;AAC9B,2CAAiE;AACjE,iEAA8D;AAC9D,yCAA2B;AAG3B,mDAAgD;AAChD,qDAAoF;AACpF,+CAA0E;AAC1E,iDAA8C;AAC9C,uDAAoD;AACpD,qDAAyD;AACzD,6DAAsE;AACtE,qCAAkC;AAElC,MAAsB,cAAc;IA+BnC,YAAY,eAAgC,MAAM;QANxC,oBAAe,GAAG,IAAI,CAAC;QAEvB,wBAAmB,GAAG,KAAK,CAAC;QAKrC,IAAI,CAAC,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAEjC,MAAM,SAAS,GAAG,gBAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC9C,IAAI,SAAS,GAAG,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QAE1D,IAAI,CAAC,QAAQ,GAAG,gBAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,gBAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,gBAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAEzC,IAAI,CAAC,YAAY,GAAG,gBAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACpD,IAAI,CAAC,eAAe,GAAG,gBAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC1D,IAAI,CAAC,mBAAmB,GAAG,gBAAM,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAClE,IAAI,CAAC,sBAAsB,GAAG,gBAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;QAExE,IAAI,CAAC,gBAAgB,GAAG,IAAA,mCAAsB,EAAC,YAAY,CAAC,CAAC;QAE7D,IAAI,CAAC,MAAM,GAAG,kBAAS,CAAC,GAAG,CAAC,eAAM,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,SAAS;IAEf,CAAC;IAEO,KAAK,CAAC,kBAAkB;QAC/B,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAGrB,MAAM,EACL,QAAQ,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,GAC1C,GAAG,wDAAa,cAAc,GAAC,CAAC;QACjC,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;QAC1B,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;IACzB,CAAC;IAEO,sBAAsB;QAE7B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAA,qBAAW,GAAE,CAAC,CAAC;QAG5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,2BAAa,CAAC,CAAC;IAC7B,CAAC;IAEO,mBAAmB;QAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,4BAAc,CAAC,CAAC;IAC9B,CAAC;IAES,eAAe,KAAI,CAAC;IAEtB,KAAK,CAAC,gBAAgB;QAE7B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAC3C,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YAC/B,IAAI,eAAe,CAAC,SAAS,EAAE;gBAC9B,IAAI,eAAe,CAAC,QAAQ;oBAAE,IAAI,EAAE,CAAC;;oBAChC,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;aACjD;;gBAAM,IAAA,kCAAiB,EAAC,GAAG,EAAE,IAAI,wCAAuB,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI;QACT,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAEhD,IAAI,QAAQ,KAAK,OAAO,IAAI,MAAM,IAAI,OAAO,EAAE;YAC9C,MAAM,KAAK,GAAG,wDAAa,OAAO,GAAC,CAAC;YACpC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,YAAY,CAC/B;gBACC,GAAG,EAAE,MAAM,IAAA,mBAAQ,EAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;gBACxC,IAAI,EAAE,MAAM,IAAA,mBAAQ,EAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;aAC1C,EACD,GAAG,CACH,CAAC;SACF;aAAM;YACN,MAAM,IAAI,GAAG,wDAAa,MAAM,GAAC,CAAC;YAClC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;SACrC;QAED,MAAM,IAAI,GAAG,gBAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,gBAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAEhD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAA+B,EAAE,EAAE;YAC3D,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE;gBAChC,OAAO,CAAC,GAAG,CACV,cAAc,IAAI,0EAA0E,CAC5F,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aAChB;QACF,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEzF,IAAI,CAAC,aAAa,GAAG,kBAAS,CAAC,GAAG,CAAC,6BAAa,CAAC,CAAC;QAClD,IAAI,CAAC,oBAAoB,GAAG,kBAAS,CAAC,GAAG,CAAC,2CAAoB,CAAC,CAAC;QAEhE,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAE9B,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,UAAU,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,KAAK;QACV,IAAI,CAAC,kBAAM,EAAE;YACZ,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAChC,IAAI,CAAC,eAAe,EAAE,CAAC;SACvB;QAED,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAG9B,IAAI,IAAI,CAAC,eAAe,EAAE;YAEzB,IAAI,CAAC,GAAG,CAAC,GAAG,CACX,IAAI,IAAI,CAAC,eAAe,WAAW,EACnC,IAAA,sCAAqB,EAAC,kBAAS,CAAC,GAAG,CAAC,2CAAoB,CAAC,CAAC,CAC1D,CAAC;YAGF,IAAI,CAAC,GAAG,CAAC,GAAG,CACX,IAAI,IAAI,CAAC,sBAAsB,iBAAiB,EAChD,IAAA,sCAAqB,EAAC,kBAAS,CAAC,GAAG,CAAC,iCAAe,CAAC,CAAC,CACrD,CAAC;SACF;QAED,IAAI,IAAI,CAAC,mBAAmB,EAAE;YAC7B,MAAM,YAAY,GAAG,kBAAS,CAAC,GAAG,CAAC,2BAAY,CAAC,CAAC;YAGjD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,mBAAmB,WAAW,EAAE,IAAA,sCAAqB,EAAC,YAAY,CAAC,CAAC,CAAC;YAI3F,IAAI,CAAC,GAAG,CAAC,MAAM,CACd,IAAI,IAAI,CAAC,YAAY,mBAAmB,EACxC,IAAA,qBAAI,EAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAClE,CAAC;SACF;QAGD,MAAM,UAAU,GAAG,eAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YAC/B,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAC5C,IAAI,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE;gBACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,SAAS,SAAS,GAAG,CAAC,CAAC;gBACxE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;aACtB;;gBAAM,IAAI,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,IAAI,yBAAa,EAAE;YAClB,IAAI,CAAC,mBAAmB,EAAE,CAAC;SAC3B;QAGD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,wBAAU,CAAC,CAAC;QAEzB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAEvB,IAAI,CAAC,kBAAM,EAAE;YACZ,OAAO,CAAC,GAAG,CAAC,YAAY,uBAAW,EAAE,CAAC,CAAC;YAEvC,MAAM,aAAa,GAAG,gBAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YACrD,IAAI,aAAa,KAAK,IAAI,EAAE;gBAC3B,OAAO,CAAC,GAAG,CAAC,WAAW,aAAa,EAAE,CAAC,CAAC;aACxC;YAED,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,gBAAM,CAAC,CAAC,CAAC;SAC1D;IACF,CAAC;CACD;AA1MD,wCA0MC"}
@@ -1,39 +1,61 @@
1
+ import { ActiveWorkflows } from 'n8n-core';
1
2
  import type { ExecutionError, IDeferredPromise, IExecuteResponsePromiseData, IGetExecutePollFunctions, IGetExecuteTriggerFunctions, INode, INodeExecutionData, IWorkflowBase, IWorkflowExecuteAdditionalData as IWorkflowExecuteAdditionalDataWorkflow, WorkflowActivateMode, WorkflowExecuteMode } from 'n8n-workflow';
2
3
  import { Workflow } from 'n8n-workflow';
3
4
  import type express from 'express';
4
- import type { IActivationError, IResponseCallbackData, IWebhookManager, IWorkflowDb, WebhookRequest } from './Interfaces';
5
+ import type { IResponseCallbackData, IWebhookManager, IWorkflowDb, WebhookRequest } from './Interfaces';
5
6
  import type { User } from './databases/entities/User';
7
+ import type { WorkflowEntity } from './databases/entities/WorkflowEntity';
6
8
  import { ActiveExecutions } from './ActiveExecutions';
7
9
  import { NodeTypes } from './NodeTypes';
8
10
  import { ExternalHooks } from './ExternalHooks';
9
11
  import { WebhookService } from './services/webhook.service';
10
12
  import { Logger } from './Logger';
13
+ import { WorkflowRepository } from './databases/repositories';
14
+ import type { MultiMainInstancePublisher } from './services/orchestration/main/MultiMainInstance.publisher.ee';
11
15
  export declare class ActiveWorkflowRunner implements IWebhookManager {
12
16
  private readonly logger;
13
17
  private readonly activeExecutions;
14
18
  private readonly externalHooks;
15
19
  private readonly nodeTypes;
16
20
  private readonly webhookService;
17
- private activeWorkflows;
21
+ private readonly workflowRepository;
22
+ activeWorkflows: ActiveWorkflows;
18
23
  private activationErrors;
19
- private queuedWorkflowActivations;
20
- constructor(logger: Logger, activeExecutions: ActiveExecutions, externalHooks: ExternalHooks, nodeTypes: NodeTypes, webhookService: WebhookService);
24
+ private queuedActivations;
25
+ isMultiMainScenario: boolean;
26
+ multiMainInstancePublisher: MultiMainInstancePublisher | undefined;
27
+ constructor(logger: Logger, activeExecutions: ActiveExecutions, externalHooks: ExternalHooks, nodeTypes: NodeTypes, webhookService: WebhookService, workflowRepository: WorkflowRepository);
21
28
  init(): Promise<void>;
22
29
  removeAll(): Promise<void>;
23
30
  executeWebhook(request: WebhookRequest, response: express.Response): Promise<IResponseCallbackData>;
24
31
  getWebhookMethods(path: string): Promise<import("n8n-workflow").IHttpRequestMethods[]>;
25
- getActiveWorkflows(user?: User): Promise<string[]>;
26
- isActive(id: string): Promise<boolean>;
27
- getActivationError(id: string): IActivationError | undefined;
28
- addWorkflowWebhooks(workflow: Workflow, additionalData: IWorkflowExecuteAdditionalDataWorkflow, mode: WorkflowExecuteMode, activation: WorkflowActivateMode): Promise<void>;
29
- removeWorkflowWebhooks(workflowId: string): Promise<void>;
32
+ allActiveInMemory(): string[];
33
+ allActiveInStorage(user?: User): Promise<string[]>;
34
+ isActive(workflowId: string): Promise<boolean>;
35
+ getActivationError(workflowId: string): {
36
+ time: number;
37
+ error: {
38
+ message: string;
39
+ };
40
+ };
41
+ addWebhooks(workflow: Workflow, additionalData: IWorkflowExecuteAdditionalDataWorkflow, mode: WorkflowExecuteMode, activation: WorkflowActivateMode): Promise<void>;
42
+ clearWebhooks(workflowId: string): Promise<void>;
30
43
  runWorkflow(workflowData: IWorkflowDb, node: INode, data: INodeExecutionData[][], additionalData: IWorkflowExecuteAdditionalDataWorkflow, mode: WorkflowExecuteMode, responsePromise?: IDeferredPromise<IExecuteResponsePromiseData>): Promise<string>;
31
44
  getExecutePollFunctions(workflowData: IWorkflowDb, additionalData: IWorkflowExecuteAdditionalDataWorkflow, mode: WorkflowExecuteMode, activation: WorkflowActivateMode): IGetExecutePollFunctions;
32
45
  getExecuteTriggerFunctions(workflowData: IWorkflowDb, additionalData: IWorkflowExecuteAdditionalDataWorkflow, mode: WorkflowExecuteMode, activation: WorkflowActivateMode): IGetExecuteTriggerFunctions;
33
46
  executeErrorWorkflow(error: ExecutionError, workflowData: IWorkflowBase, mode: WorkflowExecuteMode): void;
34
- add(workflowId: string, activation: WorkflowActivateMode, workflowData?: IWorkflowDb): Promise<void>;
35
- addQueuedWorkflowActivation(activationMode: WorkflowActivateMode, workflowData: IWorkflowDb): void;
47
+ addActiveWorkflows(activationMode: WorkflowActivateMode): Promise<void>;
48
+ addAllTriggerAndPollerBasedWorkflows(): Promise<void>;
49
+ removeAllTriggerAndPollerBasedWorkflows(): Promise<void>;
50
+ add(workflowId: string, activationMode: WorkflowActivateMode, existingWorkflow?: WorkflowEntity): Promise<void>;
51
+ private countTriggers;
52
+ addQueuedWorkflowActivation(activationMode: WorkflowActivateMode, workflowData: WorkflowEntity): void;
36
53
  removeQueuedWorkflowActivation(workflowId: string): void;
37
54
  removeAllQueuedWorkflowActivations(): void;
38
55
  remove(workflowId: string): Promise<void>;
56
+ addTriggersAndPollers(dbWorkflow: WorkflowEntity, workflow: Workflow, { activationMode, executionMode, additionalData, }: {
57
+ activationMode: WorkflowActivateMode;
58
+ executionMode: WorkflowExecuteMode;
59
+ additionalData: IWorkflowExecuteAdditionalDataWorkflow;
60
+ }): Promise<void>;
39
61
  }
@@ -31,9 +31,12 @@ var __importStar = (this && this.__importStar) || function (mod) {
31
31
  var __metadata = (this && this.__metadata) || function (k, v) {
32
32
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
33
33
  };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
34
37
  Object.defineProperty(exports, "__esModule", { value: true });
35
38
  exports.ActiveWorkflowRunner = void 0;
36
- const typedi_1 = require("typedi");
39
+ const typedi_1 = __importStar(require("typedi"));
37
40
  const n8n_core_1 = require("n8n-core");
38
41
  const n8n_workflow_1 = require("n8n-workflow");
39
42
  const Db = __importStar(require("./Db"));
@@ -52,57 +55,29 @@ const utils_1 = require("./utils");
52
55
  const typeorm_1 = require("typeorm");
53
56
  const webhook_service_1 = require("./services/webhook.service");
54
57
  const Logger_1 = require("./Logger");
58
+ const repositories_1 = require("./databases/repositories");
59
+ const config_1 = __importDefault(require("./config"));
55
60
  const WEBHOOK_PROD_UNREGISTERED_HINT = "The workflow must be active for a production URL to run successfully. You can activate the workflow using the toggle in the top-right of the editor. Note that unlike test URL calls, production URL calls aren't shown on the canvas (only in the executions list)";
56
61
  let ActiveWorkflowRunner = class ActiveWorkflowRunner {
57
- constructor(logger, activeExecutions, externalHooks, nodeTypes, webhookService) {
62
+ constructor(logger, activeExecutions, externalHooks, nodeTypes, webhookService, workflowRepository) {
58
63
  this.logger = logger;
59
64
  this.activeExecutions = activeExecutions;
60
65
  this.externalHooks = externalHooks;
61
66
  this.nodeTypes = nodeTypes;
62
67
  this.webhookService = webhookService;
68
+ this.workflowRepository = workflowRepository;
63
69
  this.activeWorkflows = new n8n_core_1.ActiveWorkflows();
64
70
  this.activationErrors = {};
65
- this.queuedWorkflowActivations = {};
71
+ this.queuedActivations = {};
72
+ this.isMultiMainScenario = config_1.default.getEnv('executions.mode') === 'queue' && config_1.default.getEnv('leaderSelection.enabled');
66
73
  }
67
74
  async init() {
68
- const workflowsData = (await Db.collections.Workflow.find({
69
- where: { active: true },
70
- relations: ['shared', 'shared.user', 'shared.user.globalRole', 'shared.role'],
71
- }));
72
- if (workflowsData.length !== 0) {
73
- this.logger.info(' ================================');
74
- this.logger.info(' Start Active Workflows:');
75
- this.logger.info(' ================================');
76
- for (const workflowData of workflowsData) {
77
- this.logger.info(` - ${workflowData.name} (ID: ${workflowData.id})`);
78
- this.logger.debug(`Initializing active workflow "${workflowData.name}" (startup)`, {
79
- workflowName: workflowData.name,
80
- workflowId: workflowData.id,
81
- });
82
- try {
83
- await this.add(workflowData.id, 'init', workflowData);
84
- this.logger.verbose(`Successfully started workflow "${workflowData.name}"`, {
85
- workflowName: workflowData.name,
86
- workflowId: workflowData.id,
87
- });
88
- this.logger.info(' => Started');
89
- }
90
- catch (error) {
91
- n8n_workflow_1.ErrorReporterProxy.error(error);
92
- this.logger.info(' => ERROR: Workflow could not be activated on first try, keep on trying if not an auth issue');
93
- this.logger.info(` ${error.message}`);
94
- this.logger.error(`Issue on initial workflow activation try "${workflowData.name}" (startup)`, {
95
- workflowName: workflowData.name,
96
- workflowId: workflowData.id,
97
- });
98
- this.executeErrorWorkflow(error, workflowData, 'internal');
99
- if (!error.message.includes('Authorization')) {
100
- this.addQueuedWorkflowActivation('init', workflowData);
101
- }
102
- }
103
- }
104
- this.logger.verbose('Finished initializing active workflows (startup)');
75
+ if (this.isMultiMainScenario) {
76
+ const { MultiMainInstancePublisher } = await Promise.resolve().then(() => __importStar(require('./services/orchestration/main/MultiMainInstance.publisher.ee')));
77
+ this.multiMainInstancePublisher = typedi_1.default.get(MultiMainInstancePublisher);
78
+ await this.multiMainInstancePublisher.init();
105
79
  }
80
+ await this.addActiveWorkflows('init');
106
81
  await this.externalHooks.run('activeWorkflows.initialized', []);
107
82
  await this.webhookService.populateCache();
108
83
  }
@@ -110,7 +85,7 @@ let ActiveWorkflowRunner = class ActiveWorkflowRunner {
110
85
  let activeWorkflowIds = [];
111
86
  this.logger.verbose('Call to remove all active workflows received (removeAll)');
112
87
  activeWorkflowIds.push(...this.activeWorkflows.allActiveWorkflows());
113
- const activeWorkflows = await this.getActiveWorkflows();
88
+ const activeWorkflows = await this.allActiveInStorage();
114
89
  activeWorkflowIds = [...activeWorkflowIds, ...activeWorkflows];
115
90
  activeWorkflowIds = Array.from(new Set(activeWorkflowIds));
116
91
  const removePromises = [];
@@ -175,10 +150,13 @@ let ActiveWorkflowRunner = class ActiveWorkflowRunner {
175
150
  async getWebhookMethods(path) {
176
151
  return this.webhookService.getWebhookMethods(path);
177
152
  }
178
- async getActiveWorkflows(user) {
179
- let activeWorkflows = [];
180
- if (!user || user.globalRole.name === 'owner') {
181
- activeWorkflows = await Db.collections.Workflow.find({
153
+ allActiveInMemory() {
154
+ return this.activeWorkflows.allActiveWorkflows();
155
+ }
156
+ async allActiveInStorage(user) {
157
+ const isFullAccess = !user || user.globalRole.name === 'owner';
158
+ if (isFullAccess) {
159
+ const activeWorkflows = await this.workflowRepository.find({
182
160
  select: ['id'],
183
161
  where: { active: true },
184
162
  });
@@ -186,40 +164,35 @@ let ActiveWorkflowRunner = class ActiveWorkflowRunner {
186
164
  .map((workflow) => workflow.id)
187
165
  .filter((workflowId) => !this.activationErrors[workflowId]);
188
166
  }
189
- else {
190
- const active = await Db.collections.Workflow.find({
191
- select: ['id'],
192
- where: { active: true },
193
- });
194
- const activeIds = active.map((workflow) => workflow.id);
195
- const where = (0, UserManagementHelper_1.whereClause)({
196
- user,
197
- entityType: 'workflow',
198
- });
199
- Object.assign(where, { workflowId: (0, typeorm_1.In)(activeIds) });
200
- const shared = await Db.collections.SharedWorkflow.find({
201
- select: ['workflowId'],
202
- where,
203
- });
204
- return shared
205
- .map((id) => id.workflowId)
206
- .filter((workflowId) => !this.activationErrors[workflowId]);
207
- }
167
+ const where = (0, UserManagementHelper_1.whereClause)({
168
+ user,
169
+ entityType: 'workflow',
170
+ });
171
+ const activeWorkflows = await this.workflowRepository.find({
172
+ select: ['id'],
173
+ where: { active: true },
174
+ });
175
+ const activeIds = activeWorkflows.map((workflow) => workflow.id);
176
+ Object.assign(where, { workflowId: (0, typeorm_1.In)(activeIds) });
177
+ const sharings = await Db.collections.SharedWorkflow.find({
178
+ select: ['workflowId'],
179
+ where,
180
+ });
181
+ return sharings
182
+ .map((sharing) => sharing.workflowId)
183
+ .filter((workflowId) => !this.activationErrors[workflowId]);
208
184
  }
209
- async isActive(id) {
210
- const workflow = await Db.collections.Workflow.findOne({
185
+ async isActive(workflowId) {
186
+ const workflow = await this.workflowRepository.findOne({
211
187
  select: ['active'],
212
- where: { id },
188
+ where: { id: workflowId },
213
189
  });
214
190
  return !!(workflow === null || workflow === void 0 ? void 0 : workflow.active);
215
191
  }
216
- getActivationError(id) {
217
- if (this.activationErrors[id] === undefined) {
218
- return undefined;
219
- }
220
- return this.activationErrors[id];
192
+ getActivationError(workflowId) {
193
+ return this.activationErrors[workflowId];
221
194
  }
222
- async addWorkflowWebhooks(workflow, additionalData, mode, activation) {
195
+ async addWebhooks(workflow, additionalData, mode, activation) {
223
196
  const webhooks = WebhookHelpers.getWorkflowWebhooks(workflow, additionalData, undefined, true);
224
197
  let path = '';
225
198
  for (const webhookData of webhooks) {
@@ -251,7 +224,7 @@ let ActiveWorkflowRunner = class ActiveWorkflowRunner {
251
224
  continue;
252
225
  }
253
226
  try {
254
- await this.removeWorkflowWebhooks(workflow.id);
227
+ await this.clearWebhooks(workflow.id);
255
228
  }
256
229
  catch (error1) {
257
230
  n8n_workflow_1.ErrorReporterProxy.error(error1);
@@ -269,7 +242,7 @@ let ActiveWorkflowRunner = class ActiveWorkflowRunner {
269
242
  await this.webhookService.populateCache();
270
243
  await workflows_services_1.WorkflowsService.saveStaticData(workflow);
271
244
  }
272
- async removeWorkflowWebhooks(workflowId) {
245
+ async clearWebhooks(workflowId) {
273
246
  const workflowData = await Db.collections.Workflow.findOne({
274
247
  where: { id: workflowId },
275
248
  relations: ['shared', 'shared.user', 'shared.user.globalRole'],
@@ -410,62 +383,110 @@ let ActiveWorkflowRunner = class ActiveWorkflowRunner {
410
383
  };
411
384
  WorkflowExecuteAdditionalData.executeErrorWorkflow(workflowData, fullRunData, mode);
412
385
  }
413
- async add(workflowId, activation, workflowData) {
414
- let workflowInstance;
415
- try {
416
- if (workflowData === undefined) {
417
- workflowData = (await Db.collections.Workflow.findOne({
418
- where: { id: workflowId },
419
- relations: ['shared', 'shared.user', 'shared.user.globalRole', 'shared.role'],
420
- }));
386
+ async addActiveWorkflows(activationMode) {
387
+ const dbWorkflows = await this.workflowRepository.getAllActive();
388
+ if (dbWorkflows.length === 0)
389
+ return;
390
+ this.logger.info(' ================================');
391
+ this.logger.info(' Start Active Workflows:');
392
+ this.logger.info(' ================================');
393
+ for (const dbWorkflow of dbWorkflows) {
394
+ this.logger.info(` - ${dbWorkflow.display()}`);
395
+ this.logger.debug(`Initializing active workflow ${dbWorkflow.display()} (startup)`, {
396
+ workflowName: dbWorkflow.name,
397
+ workflowId: dbWorkflow.id,
398
+ });
399
+ try {
400
+ await this.add(dbWorkflow.id, activationMode, dbWorkflow);
401
+ this.logger.verbose(`Successfully started workflow ${dbWorkflow.display()}`, {
402
+ workflowName: dbWorkflow.name,
403
+ workflowId: dbWorkflow.id,
404
+ });
405
+ this.logger.info(' => Started');
421
406
  }
422
- if (!workflowData) {
423
- throw new Error(`Could not find workflow with id "${workflowId}".`);
407
+ catch (error) {
408
+ n8n_workflow_1.ErrorReporterProxy.error(error);
409
+ this.logger.info(' => ERROR: Workflow could not be activated on first try, keep on trying if not an auth issue');
410
+ this.logger.info(` ${error.message}`);
411
+ this.logger.error(`Issue on initial workflow activation try of ${dbWorkflow.display()} (startup)`, {
412
+ workflowName: dbWorkflow.name,
413
+ workflowId: dbWorkflow.id,
414
+ });
415
+ this.executeErrorWorkflow(error, dbWorkflow, 'internal');
416
+ if (error.message.includes('Authorization'))
417
+ continue;
418
+ this.addQueuedWorkflowActivation('init', dbWorkflow);
424
419
  }
425
- workflowInstance = new n8n_workflow_1.Workflow({
426
- id: workflowId,
427
- name: workflowData.name,
428
- nodes: workflowData.nodes,
429
- connections: workflowData.connections,
430
- active: workflowData.active,
420
+ }
421
+ this.logger.verbose('Finished activating workflows (startup)');
422
+ }
423
+ async addAllTriggerAndPollerBasedWorkflows() {
424
+ this.logger.debug('[Leadership change] Adding all trigger- and poller-based workflows...');
425
+ await this.addActiveWorkflows('leadershipChange');
426
+ }
427
+ async removeAllTriggerAndPollerBasedWorkflows() {
428
+ this.logger.debug('[Leadership change] Removing all trigger- and poller-based workflows...');
429
+ await this.activeWorkflows.removeAllTriggerAndPollerBasedWorkflows();
430
+ }
431
+ async add(workflowId, activationMode, existingWorkflow) {
432
+ var _a, _b, _c, _d;
433
+ let workflow;
434
+ let shouldAddWebhooks = true;
435
+ let shouldAddTriggersAndPollers = true;
436
+ if (this.isMultiMainScenario && activationMode !== 'leadershipChange') {
437
+ shouldAddWebhooks = (_b = (_a = this.multiMainInstancePublisher) === null || _a === void 0 ? void 0 : _a.isLeader) !== null && _b !== void 0 ? _b : false;
438
+ shouldAddTriggersAndPollers = (_d = (_c = this.multiMainInstancePublisher) === null || _c === void 0 ? void 0 : _c.isLeader) !== null && _d !== void 0 ? _d : false;
439
+ }
440
+ if (this.isMultiMainScenario && activationMode === 'leadershipChange') {
441
+ shouldAddWebhooks = false;
442
+ shouldAddTriggersAndPollers = true;
443
+ }
444
+ try {
445
+ const dbWorkflow = existingWorkflow !== null && existingWorkflow !== void 0 ? existingWorkflow : (await this.workflowRepository.findById(workflowId));
446
+ if (!dbWorkflow) {
447
+ throw new n8n_workflow_1.WorkflowActivationError(`Failed to find workflow with ID "${workflowId}"`);
448
+ }
449
+ workflow = new n8n_workflow_1.Workflow({
450
+ id: dbWorkflow.id,
451
+ name: dbWorkflow.name,
452
+ nodes: dbWorkflow.nodes,
453
+ connections: dbWorkflow.connections,
454
+ active: dbWorkflow.active,
431
455
  nodeTypes: this.nodeTypes,
432
- staticData: workflowData.staticData,
433
- settings: workflowData.settings,
456
+ staticData: dbWorkflow.staticData,
457
+ settings: dbWorkflow.settings,
434
458
  });
435
- const canBeActivated = workflowInstance.checkIfWorkflowCanBeActivated(constants_1.STARTING_NODES);
459
+ const canBeActivated = workflow.checkIfWorkflowCanBeActivated(constants_1.STARTING_NODES);
436
460
  if (!canBeActivated) {
437
- this.logger.error(`Unable to activate workflow "${workflowData.name}"`);
438
- throw new Error('The workflow can not be activated because it does not contain any nodes which could start the workflow. Only workflows which have trigger or webhook nodes can be activated.');
461
+ throw new n8n_workflow_1.WorkflowActivationError(`Workflow ${dbWorkflow.display()} has no node to start the workflow - at least one trigger, poller or webhook node is required`);
439
462
  }
440
- const mode = 'trigger';
441
- const workflowOwner = workflowData.shared.find((shared) => shared.role.name === 'owner');
442
- if (!workflowOwner) {
443
- throw new Error('Workflow cannot be activated because it has no owner');
463
+ const sharing = dbWorkflow.shared.find((shared) => shared.role.name === 'owner');
464
+ if (!sharing) {
465
+ throw new n8n_workflow_1.WorkflowActivationError(`Workflow ${dbWorkflow.display()} has no owner`);
444
466
  }
445
- const additionalData = await WorkflowExecuteAdditionalData.getBase(workflowOwner.user.id);
446
- const getTriggerFunctions = this.getExecuteTriggerFunctions(workflowData, additionalData, mode, activation);
447
- const getPollFunctions = this.getExecutePollFunctions(workflowData, additionalData, mode, activation);
448
- await this.addWorkflowWebhooks(workflowInstance, additionalData, mode, activation);
449
- if (workflowInstance.getTriggerNodes().length !== 0 ||
450
- workflowInstance.getPollNodes().length !== 0) {
451
- await this.activeWorkflows.add(workflowId, workflowInstance, additionalData, mode, activation, getTriggerFunctions, getPollFunctions);
452
- this.logger.verbose(`Successfully activated workflow "${workflowData.name}"`, {
453
- workflowId,
454
- workflowName: workflowData.name,
467
+ const additionalData = await WorkflowExecuteAdditionalData.getBase(sharing.user.id);
468
+ if (shouldAddWebhooks) {
469
+ this.logger.debug('============');
470
+ this.logger.debug(`Adding webhooks for workflow "${dbWorkflow.display()}"`);
471
+ this.logger.debug('============');
472
+ await this.addWebhooks(workflow, additionalData, 'trigger', activationMode);
473
+ }
474
+ if (shouldAddTriggersAndPollers) {
475
+ this.logger.debug('============');
476
+ this.logger.debug(`Adding triggers and pollers for workflow "${dbWorkflow.display()}"`);
477
+ this.logger.debug('============');
478
+ await this.addTriggersAndPollers(dbWorkflow, workflow, {
479
+ activationMode,
480
+ executionMode: 'trigger',
481
+ additionalData,
455
482
  });
456
483
  }
457
484
  this.removeQueuedWorkflowActivation(workflowId);
458
- if (this.activationErrors[workflowId] !== undefined) {
485
+ if (this.activationErrors[workflowId]) {
459
486
  delete this.activationErrors[workflowId];
460
487
  }
461
- if (workflowInstance.id) {
462
- const triggerFilter = (nodeType) => !!nodeType.trigger && !nodeType.description.name.includes('manualTrigger');
463
- const triggerCount = workflowInstance.queryNodes(triggerFilter).length +
464
- workflowInstance.getPollNodes().length +
465
- WebhookHelpers.getWorkflowWebhooks(workflowInstance, additionalData, undefined, true)
466
- .length;
467
- await workflows_services_1.WorkflowsService.updateWorkflowTriggerCount(workflowInstance.id, triggerCount);
468
- }
488
+ const triggerCount = this.countTriggers(workflow, additionalData);
489
+ await workflows_services_1.WorkflowsService.updateWorkflowTriggerCount(workflow.id, triggerCount);
469
490
  }
470
491
  catch (error) {
471
492
  this.activationErrors[workflowId] = {
@@ -476,7 +497,13 @@ let ActiveWorkflowRunner = class ActiveWorkflowRunner {
476
497
  };
477
498
  throw error;
478
499
  }
479
- await workflows_services_1.WorkflowsService.saveStaticData(workflowInstance);
500
+ await workflows_services_1.WorkflowsService.saveStaticData(workflow);
501
+ }
502
+ countTriggers(workflow, additionalData) {
503
+ const triggerFilter = (nodeType) => !!nodeType.trigger && !nodeType.description.name.includes('manualTrigger');
504
+ return (workflow.queryNodes(triggerFilter).length +
505
+ workflow.getPollNodes().length +
506
+ WebhookHelpers.getWorkflowWebhooks(workflow, additionalData, undefined, true).length);
480
507
  }
481
508
  addQueuedWorkflowActivation(activationMode, workflowData) {
482
509
  const workflowId = workflowData.id;
@@ -491,7 +518,7 @@ let ActiveWorkflowRunner = class ActiveWorkflowRunner {
491
518
  }
492
519
  catch (error) {
493
520
  n8n_workflow_1.ErrorReporterProxy.error(error);
494
- let lastTimeout = this.queuedWorkflowActivations[workflowId].lastTimeout;
521
+ let lastTimeout = this.queuedActivations[workflowId].lastTimeout;
495
522
  if (lastTimeout < constants_1.WORKFLOW_REACTIVATE_MAX_TIMEOUT) {
496
523
  lastTimeout = Math.min(lastTimeout * 2, constants_1.WORKFLOW_REACTIVATE_MAX_TIMEOUT);
497
524
  }
@@ -499,8 +526,8 @@ let ActiveWorkflowRunner = class ActiveWorkflowRunner {
499
526
  workflowId,
500
527
  workflowName,
501
528
  });
502
- this.queuedWorkflowActivations[workflowId].lastTimeout = lastTimeout;
503
- this.queuedWorkflowActivations[workflowId].timeout = setTimeout(retryFunction, lastTimeout);
529
+ this.queuedActivations[workflowId].lastTimeout = lastTimeout;
530
+ this.queuedActivations[workflowId].timeout = setTimeout(retryFunction, lastTimeout);
504
531
  return;
505
532
  }
506
533
  this.logger.info(` -> Activation of workflow "${workflowName}" (${workflowId}) was successful!`, {
@@ -509,7 +536,7 @@ let ActiveWorkflowRunner = class ActiveWorkflowRunner {
509
536
  });
510
537
  };
511
538
  this.removeQueuedWorkflowActivation(workflowId);
512
- this.queuedWorkflowActivations[workflowId] = {
539
+ this.queuedActivations[workflowId] = {
513
540
  activationMode,
514
541
  lastTimeout: constants_1.WORKFLOW_REACTIVATE_INITIAL_TIMEOUT,
515
542
  timeout: setTimeout(retryFunction, constants_1.WORKFLOW_REACTIVATE_INITIAL_TIMEOUT),
@@ -517,19 +544,19 @@ let ActiveWorkflowRunner = class ActiveWorkflowRunner {
517
544
  };
518
545
  }
519
546
  removeQueuedWorkflowActivation(workflowId) {
520
- if (this.queuedWorkflowActivations[workflowId]) {
521
- clearTimeout(this.queuedWorkflowActivations[workflowId].timeout);
522
- delete this.queuedWorkflowActivations[workflowId];
547
+ if (this.queuedActivations[workflowId]) {
548
+ clearTimeout(this.queuedActivations[workflowId].timeout);
549
+ delete this.queuedActivations[workflowId];
523
550
  }
524
551
  }
525
552
  removeAllQueuedWorkflowActivations() {
526
- for (const workflowId in this.queuedWorkflowActivations) {
553
+ for (const workflowId in this.queuedActivations) {
527
554
  this.removeQueuedWorkflowActivation(workflowId);
528
555
  }
529
556
  }
530
557
  async remove(workflowId) {
531
558
  try {
532
- await this.removeWorkflowWebhooks(workflowId);
559
+ await this.clearWebhooks(workflowId);
533
560
  }
534
561
  catch (error) {
535
562
  n8n_workflow_1.ErrorReporterProxy.error(error);
@@ -538,7 +565,7 @@ let ActiveWorkflowRunner = class ActiveWorkflowRunner {
538
565
  if (this.activationErrors[workflowId] !== undefined) {
539
566
  delete this.activationErrors[workflowId];
540
567
  }
541
- if (this.queuedWorkflowActivations[workflowId] !== undefined) {
568
+ if (this.queuedActivations[workflowId] !== undefined) {
542
569
  this.removeQueuedWorkflowActivation(workflowId);
543
570
  }
544
571
  if (this.activeWorkflows.isActive(workflowId)) {
@@ -548,6 +575,17 @@ let ActiveWorkflowRunner = class ActiveWorkflowRunner {
548
575
  }
549
576
  }
550
577
  }
578
+ async addTriggersAndPollers(dbWorkflow, workflow, { activationMode, executionMode, additionalData, }) {
579
+ const getTriggerFunctions = this.getExecuteTriggerFunctions(dbWorkflow, additionalData, executionMode, activationMode);
580
+ const getPollFunctions = this.getExecutePollFunctions(dbWorkflow, additionalData, executionMode, activationMode);
581
+ if (workflow.getTriggerNodes().length !== 0 || workflow.getPollNodes().length !== 0) {
582
+ await this.activeWorkflows.add(workflow.id, workflow, additionalData, executionMode, activationMode, getTriggerFunctions, getPollFunctions);
583
+ this.logger.verbose(`Workflow ${dbWorkflow.display()} activated`, {
584
+ workflowId: dbWorkflow.id,
585
+ workflowName: dbWorkflow.name,
586
+ });
587
+ }
588
+ }
551
589
  };
552
590
  exports.ActiveWorkflowRunner = ActiveWorkflowRunner;
553
591
  exports.ActiveWorkflowRunner = ActiveWorkflowRunner = __decorate([
@@ -556,6 +594,7 @@ exports.ActiveWorkflowRunner = ActiveWorkflowRunner = __decorate([
556
594
  ActiveExecutions_1.ActiveExecutions,
557
595
  ExternalHooks_1.ExternalHooks,
558
596
  NodeTypes_1.NodeTypes,
559
- webhook_service_1.WebhookService])
597
+ webhook_service_1.WebhookService,
598
+ repositories_1.WorkflowRepository])
560
599
  ], ActiveWorkflowRunner);
561
600
  //# sourceMappingURL=ActiveWorkflowRunner.js.map