@t4h.framework/dev 0.14.2 → 0.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 (199) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +112 -58
  3. package/dist/AppProcess.d.ts +36 -0
  4. package/dist/AppProcess.js +126 -0
  5. package/dist/AppProcess.js.map +1 -0
  6. package/dist/Server.d.ts +41 -0
  7. package/dist/Server.js +177 -0
  8. package/dist/Server.js.map +1 -0
  9. package/dist/constants/panel-config.d.ts +2 -0
  10. package/dist/constants/panel-config.js +34 -0
  11. package/dist/constants/panel-config.js.map +1 -0
  12. package/dist/constants/server.d.ts +9 -0
  13. package/dist/constants/server.js +10 -0
  14. package/dist/constants/server.js.map +1 -0
  15. package/dist/http/create-app.d.ts +16 -0
  16. package/dist/http/create-app.js +138 -0
  17. package/dist/http/create-app.js.map +1 -0
  18. package/dist/http/helpers/to-http-error.d.ts +8 -0
  19. package/dist/http/helpers/to-http-error.js +9 -0
  20. package/dist/http/helpers/to-http-error.js.map +1 -0
  21. package/dist/http/middlewares/error-handler.middleware.d.ts +2 -0
  22. package/dist/http/middlewares/error-handler.middleware.js +27 -0
  23. package/dist/http/middlewares/error-handler.middleware.js.map +1 -0
  24. package/dist/http/middlewares/project-manifest.middleware.d.ts +11 -0
  25. package/dist/http/middlewares/project-manifest.middleware.js +11 -0
  26. package/dist/http/middlewares/project-manifest.middleware.js.map +1 -0
  27. package/dist/http/middlewares/read-json-body.middleware.d.ts +6 -0
  28. package/dist/http/middlewares/read-json-body.middleware.js +22 -0
  29. package/dist/http/middlewares/read-json-body.middleware.js.map +1 -0
  30. package/dist/http/middlewares/workflow-authorization.middleware.d.ts +12 -0
  31. package/dist/http/middlewares/workflow-authorization.middleware.js +28 -0
  32. package/dist/http/middlewares/workflow-authorization.middleware.js.map +1 -0
  33. package/dist/index.d.ts +3 -15
  34. package/dist/index.js +2 -15
  35. package/dist/index.js.map +1 -1
  36. package/dist/models/JSONRPCClient.d.ts +2 -0
  37. package/dist/models/JSONRPCClient.js +21 -4
  38. package/dist/models/JSONRPCClient.js.map +1 -1
  39. package/dist/models/JSONRPCError.d.ts +13 -0
  40. package/dist/models/JSONRPCError.js +11 -0
  41. package/dist/models/JSONRPCError.js.map +1 -0
  42. package/dist/models/JSONRPCServer.d.ts +2 -0
  43. package/dist/models/JSONRPCServer.js +10 -2
  44. package/dist/models/JSONRPCServer.js.map +1 -1
  45. package/dist/models/WorkflowAuthorizationMissingError.d.ts +5 -0
  46. package/dist/models/WorkflowAuthorizationMissingError.js +9 -0
  47. package/dist/models/WorkflowAuthorizationMissingError.js.map +1 -0
  48. package/dist/models/WorkflowRun.d.ts +20 -15
  49. package/dist/models/WorkflowRun.js +14 -9
  50. package/dist/models/WorkflowRun.js.map +1 -1
  51. package/dist/models/WorkflowRunActivity.d.ts +40 -27
  52. package/dist/models/WorkflowRunActivity.js +46 -34
  53. package/dist/models/WorkflowRunActivity.js.map +1 -1
  54. package/dist/models/claims/DevHttpClientRequestClaim.js +4 -5
  55. package/dist/models/claims/DevHttpClientRequestClaim.js.map +1 -1
  56. package/dist/models/claims/DevORMClaim.d.ts +15 -4
  57. package/dist/models/claims/DevORMClaim.js +128 -29
  58. package/dist/models/claims/DevORMClaim.js.map +1 -1
  59. package/dist/models/claims/DevWorkflowBatchClaim.js +3 -6
  60. package/dist/models/claims/DevWorkflowBatchClaim.js.map +1 -1
  61. package/dist/models/claims/DevWorkflowClaim.d.ts +1 -1
  62. package/dist/models/claims/DevWorkflowClaim.js +6 -11
  63. package/dist/models/claims/DevWorkflowClaim.js.map +1 -1
  64. package/dist/repositories/WorkflowRun.repository.d.ts +44 -6
  65. package/dist/repositories/WorkflowRun.repository.js +196 -11
  66. package/dist/repositories/WorkflowRun.repository.js.map +1 -1
  67. package/dist/repositories/WorkflowRunActivity.repository.d.ts +19 -6
  68. package/dist/repositories/WorkflowRunActivity.repository.js +73 -23
  69. package/dist/repositories/WorkflowRunActivity.repository.js.map +1 -1
  70. package/dist/repositories/WorkflowRunAsyncActivityPending.repository.d.ts +39 -0
  71. package/dist/repositories/WorkflowRunAsyncActivityPending.repository.js +160 -0
  72. package/dist/repositories/WorkflowRunAsyncActivityPending.repository.js.map +1 -0
  73. package/dist/services/ActivityRegistry.service.d.ts +7 -0
  74. package/dist/services/ActivityRegistry.service.js +32 -0
  75. package/dist/services/ActivityRegistry.service.js.map +1 -0
  76. package/dist/services/Database.service.d.ts +14 -0
  77. package/dist/services/Database.service.js +106 -0
  78. package/dist/services/Database.service.js.map +1 -0
  79. package/dist/services/TimeoutScheduler.service.js +9 -3
  80. package/dist/services/TimeoutScheduler.service.js.map +1 -1
  81. package/dist/services/WorkflowAuthorization.service.d.ts +19 -0
  82. package/dist/services/WorkflowAuthorization.service.js +75 -0
  83. package/dist/services/WorkflowAuthorization.service.js.map +1 -0
  84. package/dist/services/WorkflowRunAsyncActivityFacade.service.d.ts +8 -15
  85. package/dist/services/WorkflowRunAsyncActivityFacade.service.js +12 -26
  86. package/dist/services/WorkflowRunAsyncActivityFacade.service.js.map +1 -1
  87. package/dist/services/WorkflowRunEvents.service.d.ts +11 -0
  88. package/dist/services/WorkflowRunEvents.service.js +42 -0
  89. package/dist/services/WorkflowRunEvents.service.js.map +1 -0
  90. package/dist/services/WorkflowRunFacade.service.d.ts +106 -7
  91. package/dist/services/WorkflowRunFacade.service.js +65 -10
  92. package/dist/services/WorkflowRunFacade.service.js.map +1 -1
  93. package/dist/services/WorkflowRunLock.service.d.ts +6 -0
  94. package/dist/services/WorkflowRunLock.service.js +34 -0
  95. package/dist/services/WorkflowRunLock.service.js.map +1 -0
  96. package/dist/services/WorkflowRunSyncActivityFacade.service.d.ts +4 -4
  97. package/dist/services/WorkflowRunSyncActivityFacade.service.js +7 -7
  98. package/dist/services/WorkflowRunSyncActivityFacade.service.js.map +1 -1
  99. package/dist/tools/copy-additional-files.d.ts +0 -5
  100. package/dist/tools/copy-additional-files.js +0 -5
  101. package/dist/tools/copy-additional-files.js.map +1 -1
  102. package/dist/tools/find-free-port.d.ts +5 -0
  103. package/dist/tools/find-free-port.js +30 -0
  104. package/dist/tools/find-free-port.js.map +1 -0
  105. package/dist/tools/find-workflow-by-id.d.ts +2 -0
  106. package/dist/tools/find-workflow-by-id.js +9 -0
  107. package/dist/tools/find-workflow-by-id.js.map +1 -0
  108. package/dist/tools/format-routes.d.ts +10 -0
  109. package/dist/tools/format-routes.js +40 -0
  110. package/dist/tools/format-routes.js.map +1 -0
  111. package/dist/tools/replace.d.ts +1 -0
  112. package/dist/tools/replace.js +14 -0
  113. package/dist/tools/replace.js.map +1 -0
  114. package/dist/tools/to-rejected-reason.d.ts +5 -0
  115. package/dist/tools/to-rejected-reason.js +11 -0
  116. package/dist/tools/to-rejected-reason.js.map +1 -0
  117. package/dist/tools/to-workflow-run-activity-output.d.ts +24 -0
  118. package/dist/tools/to-workflow-run-activity-output.js +18 -0
  119. package/dist/tools/to-workflow-run-activity-output.js.map +1 -0
  120. package/dist/tools/to-workflow-run-output.d.ts +11 -0
  121. package/dist/tools/to-workflow-run-output.js +12 -0
  122. package/dist/tools/to-workflow-run-output.js.map +1 -0
  123. package/dist/transport/AppProcessJsonRpc.js +59 -0
  124. package/dist/transport/AppProcessJsonRpc.js.map +1 -0
  125. package/dist/use-cases/BuildWorkflowRunActivityHistory.usecase.d.ts +9 -0
  126. package/dist/use-cases/{WorkflowRunBuildHistory.usecase.js → BuildWorkflowRunActivityHistory.usecase.js} +18 -16
  127. package/dist/use-cases/BuildWorkflowRunActivityHistory.usecase.js.map +1 -0
  128. package/dist/use-cases/CreateWorkflowRun.usecase.d.ts +6 -6
  129. package/dist/use-cases/CreateWorkflowRun.usecase.js +20 -21
  130. package/dist/use-cases/CreateWorkflowRun.usecase.js.map +1 -1
  131. package/dist/use-cases/CreateWorkflowRunAsyncActivity.usecase.d.ts +9 -3
  132. package/dist/use-cases/CreateWorkflowRunAsyncActivity.usecase.js +45 -39
  133. package/dist/use-cases/CreateWorkflowRunAsyncActivity.usecase.js.map +1 -1
  134. package/dist/use-cases/EnqueueWorkflowRunNextTick.usecase.d.ts +9 -0
  135. package/dist/use-cases/EnqueueWorkflowRunNextTick.usecase.js +43 -0
  136. package/dist/use-cases/EnqueueWorkflowRunNextTick.usecase.js.map +1 -0
  137. package/dist/use-cases/ExecuteWorkflowRunActivity.usecase.d.ts +9 -0
  138. package/dist/use-cases/ExecuteWorkflowRunActivity.usecase.js +47 -0
  139. package/dist/use-cases/ExecuteWorkflowRunActivity.usecase.js.map +1 -0
  140. package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.d.ts +22 -0
  141. package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.js +117 -0
  142. package/dist/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.js.map +1 -0
  143. package/dist/use-cases/NextTickWorkflowRun.usecase.d.ts +16 -7
  144. package/dist/use-cases/NextTickWorkflowRun.usecase.js +139 -130
  145. package/dist/use-cases/NextTickWorkflowRun.usecase.js.map +1 -1
  146. package/dist/use-cases/RunWorkflow.usecase.d.ts +10 -0
  147. package/dist/use-cases/RunWorkflow.usecase.js +46 -0
  148. package/dist/use-cases/RunWorkflow.usecase.js.map +1 -0
  149. package/dist/use-cases/WorkflowRunActivityFind.usecase.d.ts +34 -0
  150. package/dist/use-cases/WorkflowRunActivityFind.usecase.js +49 -0
  151. package/dist/use-cases/WorkflowRunActivityFind.usecase.js.map +1 -0
  152. package/dist/use-cases/WorkflowRunActivityFindById.usecase.d.ts +34 -0
  153. package/dist/use-cases/WorkflowRunActivityFindById.usecase.js +60 -0
  154. package/dist/use-cases/WorkflowRunActivityFindById.usecase.js.map +1 -0
  155. package/dist/use-cases/WorkflowRunAsyncActivityAdvance.usecase.d.ts +12 -4
  156. package/dist/use-cases/WorkflowRunAsyncActivityAdvance.usecase.js +41 -27
  157. package/dist/use-cases/WorkflowRunAsyncActivityAdvance.usecase.js.map +1 -1
  158. package/dist/use-cases/WorkflowRunAsyncActivityPendingFind.usecase.d.ts +24 -0
  159. package/dist/use-cases/WorkflowRunAsyncActivityPendingFind.usecase.js +56 -0
  160. package/dist/use-cases/WorkflowRunAsyncActivityPendingFind.usecase.js.map +1 -0
  161. package/dist/use-cases/WorkflowRunFind.usecase.d.ts +17 -0
  162. package/dist/use-cases/WorkflowRunFind.usecase.js +28 -0
  163. package/dist/use-cases/WorkflowRunFind.usecase.js.map +1 -0
  164. package/dist/use-cases/WorkflowRunFindById.usecase.d.ts +19 -0
  165. package/dist/use-cases/WorkflowRunFindById.usecase.js +45 -0
  166. package/dist/use-cases/WorkflowRunFindById.usecase.js.map +1 -0
  167. package/dist/workers/app-process.js +10 -1
  168. package/dist/workers/app-process.js.map +1 -1
  169. package/package.json +15 -5
  170. package/.ai/skills/framework-dev/SKILL.md +0 -348
  171. package/dist/DevServer.d.ts +0 -24
  172. package/dist/DevServer.js +0 -87
  173. package/dist/DevServer.js.map +0 -1
  174. package/dist/models/InMemoryDatabase.d.ts +0 -20
  175. package/dist/models/InMemoryDatabase.js +0 -111
  176. package/dist/models/InMemoryDatabase.js.map +0 -1
  177. package/dist/services/BuildWorkflowRunResult.service.d.ts +0 -8
  178. package/dist/services/BuildWorkflowRunResult.service.js +0 -49
  179. package/dist/services/BuildWorkflowRunResult.service.js.map +0 -1
  180. package/dist/tools/is-workflow-waiting.d.ts +0 -4
  181. package/dist/tools/is-workflow-waiting.js +0 -12
  182. package/dist/tools/is-workflow-waiting.js.map +0 -1
  183. package/dist/transport/DevServerJsonRpc.js +0 -42
  184. package/dist/transport/DevServerJsonRpc.js.map +0 -1
  185. package/dist/use-cases/CallbackWorkflowRunAsyncActivity.usecase.d.ts +0 -14
  186. package/dist/use-cases/CallbackWorkflowRunAsyncActivity.usecase.js +0 -64
  187. package/dist/use-cases/CallbackWorkflowRunAsyncActivity.usecase.js.map +0 -1
  188. package/dist/use-cases/TimeoutWorkflowRunAsyncActivity.usecase.d.ts +0 -8
  189. package/dist/use-cases/TimeoutWorkflowRunAsyncActivity.usecase.js +0 -40
  190. package/dist/use-cases/TimeoutWorkflowRunAsyncActivity.usecase.js.map +0 -1
  191. package/dist/use-cases/WorkflowRunAsyncActivity.usecase.d.ts +0 -7
  192. package/dist/use-cases/WorkflowRunAsyncActivity.usecase.js +0 -46
  193. package/dist/use-cases/WorkflowRunAsyncActivity.usecase.js.map +0 -1
  194. package/dist/use-cases/WorkflowRunBuildHistory.usecase.d.ts +0 -8
  195. package/dist/use-cases/WorkflowRunBuildHistory.usecase.js.map +0 -1
  196. package/dist/use-cases/WorkflowRunSyncActivity.usecase.d.ts +0 -4
  197. package/dist/use-cases/WorkflowRunSyncActivity.usecase.js +0 -28
  198. package/dist/use-cases/WorkflowRunSyncActivity.usecase.js.map +0 -1
  199. /package/dist/transport/{DevServerJsonRpc.d.ts → AppProcessJsonRpc.d.ts} +0 -0
@@ -0,0 +1,9 @@
1
+ import type { WorkflowRunActivity } from '../models/WorkflowRunActivity.js';
2
+ import { WorkflowRunActivityRepository } from '../repositories/WorkflowRunActivity.repository.js';
3
+ import { ActivityRegistryService } from '../services/ActivityRegistry.service.js';
4
+ export declare class ExecuteWorkflowRunActivity {
5
+ private readonly workflowRunActivityRepository;
6
+ private readonly activityRegistry;
7
+ constructor(workflowRunActivityRepository: WorkflowRunActivityRepository, activityRegistry: ActivityRegistryService);
8
+ execute(activity: WorkflowRunActivity, input: unknown): Promise<void>;
9
+ }
@@ -0,0 +1,47 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { Claim, Internals, SyncActivity } from '@t4h.framework/core';
11
+ import { Inject, Injectable } from 'pleroma';
12
+ import { claims } from '../claims.js';
13
+ import { WorkflowRunActivityRepository } from '../repositories/WorkflowRunActivity.repository.js';
14
+ import { ActivityRegistryService } from '../services/ActivityRegistry.service.js';
15
+ import { toRejectedReason } from '../tools/to-rejected-reason.js';
16
+ import { env } from '../workers/app-process.js';
17
+ let ExecuteWorkflowRunActivity = class ExecuteWorkflowRunActivity {
18
+ workflowRunActivityRepository;
19
+ activityRegistry;
20
+ constructor(workflowRunActivityRepository, activityRegistry) {
21
+ this.workflowRunActivityRepository = workflowRunActivityRepository;
22
+ this.activityRegistry = activityRegistry;
23
+ }
24
+ async execute(activity, input) {
25
+ const Activity = this.activityRegistry.getActivityConstructor(activity.type);
26
+ let output;
27
+ try {
28
+ output = await Claim.run(claims, () => Internals.runActivity(Activity, { claims, env, id: activity.id }, async (instance) => {
29
+ if (!(instance instanceof SyncActivity))
30
+ throw new Error(`Activity is not a sync activity: ${instance.constructor.name}`);
31
+ return instance.run(input);
32
+ }));
33
+ }
34
+ catch (error) {
35
+ await this.workflowRunActivityRepository.fail(activity.id, toRejectedReason(error));
36
+ throw error;
37
+ }
38
+ await this.workflowRunActivityRepository.complete(activity.id, output);
39
+ }
40
+ };
41
+ ExecuteWorkflowRunActivity = __decorate([
42
+ Injectable(),
43
+ __param(0, Inject(() => WorkflowRunActivityRepository)),
44
+ __param(1, Inject(() => ActivityRegistryService))
45
+ ], ExecuteWorkflowRunActivity);
46
+ export { ExecuteWorkflowRunActivity };
47
+ //# sourceMappingURL=ExecuteWorkflowRunActivity.usecase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecuteWorkflowRunActivity.usecase.js","sourceRoot":"","sources":["../../src/use-cases/ExecuteWorkflowRunActivity.usecase.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAErC,OAAO,EAAE,6BAA6B,EAAE,MAAM,mDAAmD,CAAA;AACjG,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAA;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAA;AAGxC,IAAM,0BAA0B,GAAhC,MAAM,0BAA0B;IAGlB;IAGA;IALnB,YAEmB,6BAA4D,EAG5D,gBAAyC;QAHzC,kCAA6B,GAA7B,6BAA6B,CAA+B;QAG5D,qBAAgB,GAAhB,gBAAgB,CAAyB;IACzD,CAAC;IAEG,KAAK,CAAC,OAAO,CAClB,QAA6B,EAC7B,KAAc;QAEd,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAE5E,IAAI,MAAe,CAAA;QAEnB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,CACpC,SAAS,CAAC,WAAW,CACnB,QAAQ,EACR,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,EAChC,KAAK,EAAC,QAAQ,EAAC,EAAE;gBACf,IAAI,CAAC,CAAC,QAAQ,YAAY,YAAY,CAAC;oBACrC,MAAM,IAAI,KAAK,CACb,oCAAoC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAChE,CAAA;gBAEH,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YAC5B,CAAC,CACF,CACF,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAC3C,QAAQ,CAAC,EAAE,EACX,gBAAgB,CAAC,KAAK,CAAC,CACxB,CAAA;YAED,MAAM,KAAK,CAAA;QACb,CAAC;QAED,MAAM,IAAI,CAAC,6BAA6B,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IACxE,CAAC;CACF,CAAA;AA3CY,0BAA0B;IADtC,UAAU,EAAE;IAGR,WAAA,MAAM,CAAC,GAAG,EAAE,CAAC,6BAA6B,CAAC,CAAA;IAG3C,WAAA,MAAM,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,CAAA;GAL7B,0BAA0B,CA2CtC"}
@@ -0,0 +1,22 @@
1
+ import { WorkflowRunRepository } from '../repositories/WorkflowRun.repository.js';
2
+ import { WorkflowRunActivityRepository } from '../repositories/WorkflowRunActivity.repository.js';
3
+ import { WorkflowRunAsyncActivityPendingRepository } from '../repositories/WorkflowRunAsyncActivityPending.repository.js';
4
+ import { ActivityRegistryService } from '../services/ActivityRegistry.service.js';
5
+ import { RuntimeContextService } from '../services/RuntimeContext.service.js';
6
+ import { TimeoutSchedulerService } from '../services/TimeoutScheduler.service.js';
7
+ import { WorkflowRunEventsService } from '../services/WorkflowRunEvents.service.js';
8
+ import { WorkflowRunFacade } from '../services/WorkflowRunFacade.service.js';
9
+ import { WorkflowRunLockService } from '../services/WorkflowRunLock.service.js';
10
+ export declare class ExecuteWorkflowRunAsyncActivity {
11
+ private readonly workflowRunRepository;
12
+ private readonly workflowRunActivityRepository;
13
+ private readonly workflowRunAsyncActivityPendingRepository;
14
+ private readonly activityRegistry;
15
+ private readonly timeoutScheduler;
16
+ private readonly workflowRun;
17
+ private readonly lock;
18
+ private readonly context;
19
+ private readonly events;
20
+ constructor(workflowRunRepository: WorkflowRunRepository, workflowRunActivityRepository: WorkflowRunActivityRepository, workflowRunAsyncActivityPendingRepository: WorkflowRunAsyncActivityPendingRepository, activityRegistry: ActivityRegistryService, timeoutScheduler: TimeoutSchedulerService, workflowRun: WorkflowRunFacade, lock: WorkflowRunLockService, context: RuntimeContextService, events: WorkflowRunEventsService);
21
+ execute(pendingId: string): Promise<void>;
22
+ }
@@ -0,0 +1,117 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { AsyncActivity, AsyncActivityResultFulfilled, AsyncActivityResultPending, AsyncActivityResultRejected, Claim, Internals, } from '@t4h.framework/core';
11
+ import { Inject, Injectable } from 'pleroma';
12
+ import { claims } from '../claims.js';
13
+ import { WorkflowRunAsyncActivityPending } from '../models/WorkflowRunActivity.js';
14
+ import { WorkflowRunRepository } from '../repositories/WorkflowRun.repository.js';
15
+ import { WorkflowRunActivityRepository } from '../repositories/WorkflowRunActivity.repository.js';
16
+ import { WorkflowRunAsyncActivityPendingRepository } from '../repositories/WorkflowRunAsyncActivityPending.repository.js';
17
+ import { ActivityRegistryService } from '../services/ActivityRegistry.service.js';
18
+ import { RuntimeContextService } from '../services/RuntimeContext.service.js';
19
+ import { TimeoutSchedulerService } from '../services/TimeoutScheduler.service.js';
20
+ import { WorkflowRunEventsService } from '../services/WorkflowRunEvents.service.js';
21
+ import { WorkflowRunFacade } from '../services/WorkflowRunFacade.service.js';
22
+ import { WorkflowRunLockService } from '../services/WorkflowRunLock.service.js';
23
+ import { env } from '../workers/app-process.js';
24
+ let ExecuteWorkflowRunAsyncActivity = class ExecuteWorkflowRunAsyncActivity {
25
+ workflowRunRepository;
26
+ workflowRunActivityRepository;
27
+ workflowRunAsyncActivityPendingRepository;
28
+ activityRegistry;
29
+ timeoutScheduler;
30
+ workflowRun;
31
+ lock;
32
+ context;
33
+ events;
34
+ constructor(workflowRunRepository, workflowRunActivityRepository, workflowRunAsyncActivityPendingRepository, activityRegistry, timeoutScheduler, workflowRun, lock, context, events) {
35
+ this.workflowRunRepository = workflowRunRepository;
36
+ this.workflowRunActivityRepository = workflowRunActivityRepository;
37
+ this.workflowRunAsyncActivityPendingRepository = workflowRunAsyncActivityPendingRepository;
38
+ this.activityRegistry = activityRegistry;
39
+ this.timeoutScheduler = timeoutScheduler;
40
+ this.workflowRun = workflowRun;
41
+ this.lock = lock;
42
+ this.context = context;
43
+ this.events = events;
44
+ }
45
+ async execute(pendingId) {
46
+ const pending = await this.workflowRunAsyncActivityPendingRepository.findById(pendingId);
47
+ if (!pending)
48
+ throw new Error(`Unknown async activity pending: ${pendingId}`);
49
+ const activity = await this.workflowRunActivityRepository.findById(pending.activityId);
50
+ if (!activity)
51
+ throw new Error(`Unknown activity: ${pending.activityId}`);
52
+ await this.lock.run(activity.runId, async () => {
53
+ const run = await this.workflowRunRepository.findById(activity.runId);
54
+ if (!run || run.status !== 'running')
55
+ return;
56
+ const current = await this.workflowRunAsyncActivityPendingRepository.findById(pendingId);
57
+ if (!current || current.status !== 'pending')
58
+ return;
59
+ const root = await this.workflowRunAsyncActivityPendingRepository.findRootByActivityId(activity.id);
60
+ const Activity = this.activityRegistry.getActivityConstructor(activity.type);
61
+ const isTimedOut = current.timeoutAt !== undefined &&
62
+ current.timeoutAt.getTime() <= Date.now();
63
+ const result = await this.context.run({ runId: run.id, workflowId: run.workflow, activityId: activity.id }, () => Claim.run(claims, () => Internals.runActivity(Activity, { claims, env, id: activity.id }, async (instance) => {
64
+ if (!(instance instanceof AsyncActivity))
65
+ throw new Error(`Activity is not an async activity: ${instance.constructor.name}`);
66
+ if (isTimedOut)
67
+ return instance.onTimeout
68
+ ? instance.onTimeout(current.toResultPending())
69
+ : new AsyncActivityResultRejected({ reason: 'timeout' });
70
+ return instance.advance(current.payload, (root ?? current).toResultPending());
71
+ })));
72
+ this.timeoutScheduler.cancel(current.id);
73
+ if (result instanceof AsyncActivityResultPending) {
74
+ this.workflowRunAsyncActivityPendingRepository.updateStatus(current.id, 'fulfilled');
75
+ const next = new WorkflowRunAsyncActivityPending(activity.id, current.position + 1, {
76
+ previousId: current.id,
77
+ status: 'pending',
78
+ schema: result.schema,
79
+ timeoutAt: result.timeoutAt,
80
+ result: result.payload,
81
+ });
82
+ await this.workflowRunAsyncActivityPendingRepository.create(next);
83
+ this.events.runUpdated(run.id);
84
+ if (next.timeoutAt)
85
+ this.timeoutScheduler.schedule(next.id, next.timeoutAt, () => this.execute(next.id));
86
+ return;
87
+ }
88
+ const isFulfilled = result instanceof AsyncActivityResultFulfilled;
89
+ const isRejected = result instanceof AsyncActivityResultRejected;
90
+ if (!isFulfilled && !isRejected)
91
+ throw new Error('Unexpected async activity advance result', {
92
+ cause: result,
93
+ });
94
+ this.workflowRunAsyncActivityPendingRepository.updateStatus(current.id, isFulfilled ? 'fulfilled' : 'rejected');
95
+ if (isFulfilled)
96
+ await this.workflowRunActivityRepository.complete(activity.id, result.payload);
97
+ if (isRejected)
98
+ await this.workflowRunActivityRepository.fail(activity.id, result.payload);
99
+ this.events.runUpdated(run.id);
100
+ await this.workflowRun.nextTick(run.id);
101
+ });
102
+ }
103
+ };
104
+ ExecuteWorkflowRunAsyncActivity = __decorate([
105
+ Injectable(),
106
+ __param(0, Inject(() => WorkflowRunRepository)),
107
+ __param(1, Inject(() => WorkflowRunActivityRepository)),
108
+ __param(2, Inject(() => WorkflowRunAsyncActivityPendingRepository)),
109
+ __param(3, Inject(() => ActivityRegistryService)),
110
+ __param(4, Inject(() => TimeoutSchedulerService)),
111
+ __param(5, Inject(() => WorkflowRunFacade)),
112
+ __param(6, Inject(() => WorkflowRunLockService)),
113
+ __param(7, Inject(() => RuntimeContextService)),
114
+ __param(8, Inject(() => WorkflowRunEventsService))
115
+ ], ExecuteWorkflowRunAsyncActivity);
116
+ export { ExecuteWorkflowRunAsyncActivity };
117
+ //# sourceMappingURL=ExecuteWorkflowRunAsyncActivity.usecase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecuteWorkflowRunAsyncActivity.usecase.js","sourceRoot":"","sources":["../../src/use-cases/ExecuteWorkflowRunAsyncActivity.usecase.ts"],"names":[],"mappings":"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"}
@@ -1,22 +1,31 @@
1
+ import { EnqueueWorkflowRunNextTick } from './EnqueueWorkflowRunNextTick.usecase.js';
1
2
  import { WorkflowRunRepository } from '../repositories/WorkflowRun.repository.js';
2
3
  import { WorkflowRunActivityRepository } from '../repositories/WorkflowRunActivity.repository.js';
4
+ import { WorkflowRunAsyncActivityPendingRepository } from '../repositories/WorkflowRunAsyncActivityPending.repository.js';
5
+ import { ActivityRegistryService } from '../services/ActivityRegistry.service.js';
3
6
  import { RuntimeContextService } from '../services/RuntimeContext.service.js';
4
7
  import { WorkflowRunAsyncActivityFacade } from '../services/WorkflowRunAsyncActivityFacade.service.js';
8
+ import { WorkflowRunEventsService } from '../services/WorkflowRunEvents.service.js';
5
9
  import { WorkflowRunFacade } from '../services/WorkflowRunFacade.service.js';
10
+ import { WorkflowRunLockService } from '../services/WorkflowRunLock.service.js';
6
11
  import { WorkflowRunSyncActivityFacade } from '../services/WorkflowRunSyncActivityFacade.service.js';
7
12
  export declare class NextTickWorkflowRun {
8
13
  private readonly workflowRunRepository;
9
14
  private readonly workflowRunActivityRepository;
15
+ private readonly workflowRunAsyncActivityPendingRepository;
10
16
  private readonly workflowRun;
11
17
  private readonly workflowRunSyncActivity;
12
18
  private readonly workflowRunAsyncActivity;
19
+ private readonly enqueueNextTick;
20
+ private readonly activityRegistry;
21
+ private readonly lock;
13
22
  private readonly context;
14
- constructor(workflowRunRepository: WorkflowRunRepository, workflowRunActivityRepository: WorkflowRunActivityRepository, workflowRun: WorkflowRunFacade, workflowRunSyncActivity: WorkflowRunSyncActivityFacade, workflowRunAsyncActivity: WorkflowRunAsyncActivityFacade, context: RuntimeContextService);
23
+ private readonly events;
24
+ constructor(workflowRunRepository: WorkflowRunRepository, workflowRunActivityRepository: WorkflowRunActivityRepository, workflowRunAsyncActivityPendingRepository: WorkflowRunAsyncActivityPendingRepository, workflowRun: WorkflowRunFacade, workflowRunSyncActivity: WorkflowRunSyncActivityFacade, workflowRunAsyncActivity: WorkflowRunAsyncActivityFacade, enqueueNextTick: EnqueueWorkflowRunNextTick, activityRegistry: ActivityRegistryService, lock: WorkflowRunLockService, context: RuntimeContextService, events: WorkflowRunEventsService);
15
25
  nextTick(runId: string): Promise<void>;
16
- private run;
17
- private findWorkflow;
18
- private linkChildRunsToParentActivity;
19
- private resolveParentActivity;
20
- private startPendingChildWorkflows;
21
- private notifyParentWorkflowRun;
26
+ onWorkflowRunFinished(childRunId: string): Promise<void>;
27
+ private tick;
28
+ private pushActivity;
29
+ private enqueueChildWorkflowRuns;
30
+ private reject;
22
31
  }
@@ -7,179 +7,188 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __param = (this && this.__param) || function (paramIndex, decorator) {
8
8
  return function (target, key) { decorator(target, key, paramIndex); }
9
9
  };
10
- import { randomUUID } from 'node:crypto';
11
- import { App, AsyncActivity, Claim, Internals, PushActivity, PushWaitAsyncActivity, SyncActivity, } from '@t4h.framework/core';
10
+ import { styleText } from 'node:util';
11
+ import { AsyncActivity, Claim, Internals, PushActivity, PushWaitAsyncActivity, SyncActivity, } from '@t4h.framework/core';
12
12
  import { Inject, Injectable } from 'pleroma';
13
+ import { uuidv7 } from 'uuidv7';
14
+ import { EnqueueWorkflowRunNextTick } from './EnqueueWorkflowRunNextTick.usecase.js';
13
15
  import { claims } from '../claims.js';
14
16
  import { WorkflowRunActivity } from '../models/WorkflowRunActivity.js';
15
17
  import { WorkflowRunRepository } from '../repositories/WorkflowRun.repository.js';
16
18
  import { WorkflowRunActivityRepository } from '../repositories/WorkflowRunActivity.repository.js';
19
+ import { WorkflowRunAsyncActivityPendingRepository } from '../repositories/WorkflowRunAsyncActivityPending.repository.js';
20
+ import { ActivityRegistryService } from '../services/ActivityRegistry.service.js';
17
21
  import { RuntimeContextService } from '../services/RuntimeContext.service.js';
18
22
  import { WorkflowRunAsyncActivityFacade } from '../services/WorkflowRunAsyncActivityFacade.service.js';
23
+ import { WorkflowRunEventsService } from '../services/WorkflowRunEvents.service.js';
19
24
  import { WorkflowRunFacade } from '../services/WorkflowRunFacade.service.js';
25
+ import { WorkflowRunLockService } from '../services/WorkflowRunLock.service.js';
20
26
  import { WorkflowRunSyncActivityFacade } from '../services/WorkflowRunSyncActivityFacade.service.js';
27
+ import { findWorkflowById } from '../tools/find-workflow-by-id.js';
21
28
  import { hydrateInput } from '../tools/hydrate-input.js';
29
+ import { toRejectedReason, } from '../tools/to-rejected-reason.js';
22
30
  import { app, env } from '../workers/app-process.js';
23
31
  let NextTickWorkflowRun = class NextTickWorkflowRun {
24
32
  workflowRunRepository;
25
33
  workflowRunActivityRepository;
34
+ workflowRunAsyncActivityPendingRepository;
26
35
  workflowRun;
27
36
  workflowRunSyncActivity;
28
37
  workflowRunAsyncActivity;
38
+ enqueueNextTick;
39
+ activityRegistry;
40
+ lock;
29
41
  context;
30
- constructor(workflowRunRepository, workflowRunActivityRepository, workflowRun, workflowRunSyncActivity, workflowRunAsyncActivity, context) {
42
+ events;
43
+ constructor(workflowRunRepository, workflowRunActivityRepository, workflowRunAsyncActivityPendingRepository, workflowRun, workflowRunSyncActivity, workflowRunAsyncActivity, enqueueNextTick, activityRegistry, lock, context, events) {
31
44
  this.workflowRunRepository = workflowRunRepository;
32
45
  this.workflowRunActivityRepository = workflowRunActivityRepository;
46
+ this.workflowRunAsyncActivityPendingRepository = workflowRunAsyncActivityPendingRepository;
33
47
  this.workflowRun = workflowRun;
34
48
  this.workflowRunSyncActivity = workflowRunSyncActivity;
35
49
  this.workflowRunAsyncActivity = workflowRunAsyncActivity;
50
+ this.enqueueNextTick = enqueueNextTick;
51
+ this.activityRegistry = activityRegistry;
52
+ this.lock = lock;
36
53
  this.context = context;
54
+ this.events = events;
37
55
  }
38
- async nextTick(runId) {
39
- await Claim.run(claims, async () => {
40
- const run = this.workflowRunRepository.findById(runId);
41
- if (!run)
42
- throw new Error(`Unknown workflow run: ${runId}`);
43
- if (run.status !== 'running')
44
- return;
45
- const activityId = randomUUID();
46
- await this.context.run({ runId, workflowId: run.workflow, activityId }, () => this.run(run, activityId));
47
- });
56
+ nextTick(runId) {
57
+ return this.lock.run(runId, () => Claim.run(claims, async () => {
58
+ while ((await this.tick(runId)) === 'continue')
59
+ ;
60
+ }));
48
61
  }
49
- async run(run, activityId) {
50
- if (!app)
51
- throw new Error('App not initialized');
52
- const workflow = this.findWorkflow(app, run.workflow);
53
- if (!workflow) {
54
- const reason = { message: `Workflow not found: ${run.workflow}` };
55
- Object.assign(run, { status: 'rejected', rejectedReason: reason });
56
- await this.notifyParentWorkflowRun(run, 'rejected', reason);
62
+ async onWorkflowRunFinished(childRunId) {
63
+ const child = await this.workflowRunRepository.findById(childRunId);
64
+ if (!child?.parentWorkflowRunId || !child.parentWorkflowRunActivityId)
57
65
  return;
58
- }
59
- const history = this.workflowRun.getHistory(run);
66
+ const { parentWorkflowRunId, parentWorkflowRunActivityId } = child;
60
67
  try {
61
- const output = await Internals.runWorkflow(workflow, {
62
- claims,
63
- env,
64
- history,
65
- input: await hydrateInput(run.input),
66
- logs: run.logs,
67
- });
68
- Object.assign(run, { status: 'fulfilled', output });
69
- await this.notifyParentWorkflowRun(run, 'fulfilled', output);
70
- return output;
71
- }
72
- catch (pushActivityOrError) {
73
- if (pushActivityOrError instanceof PushWaitAsyncActivity)
74
- return;
75
- if (pushActivityOrError instanceof PushActivity) {
76
- const activity = new WorkflowRunActivity(run, pushActivityOrError.activity.constructor, activityId);
77
- this.workflowRunActivityRepository.save(activity);
78
- this.linkChildRunsToParentActivity(activity);
79
- if (pushActivityOrError.activity instanceof SyncActivity) {
80
- await this.workflowRunSyncActivity.run(activity, pushActivityOrError.input);
81
- await this.startPendingChildWorkflows(activityId);
82
- await this.nextTick(run.id);
68
+ await this.lock.run(parentWorkflowRunId, async () => {
69
+ const parentActivity = await this.workflowRunActivityRepository.findById(parentWorkflowRunActivityId);
70
+ if (!parentActivity || parentActivity.kind !== 'async')
83
71
  return;
84
- }
85
- if (pushActivityOrError.activity instanceof AsyncActivity) {
86
- const output = await this.workflowRunAsyncActivity.create(activity, pushActivityOrError.input);
87
- await this.startPendingChildWorkflows(activityId);
88
- if (!output)
89
- return;
90
- await this.nextTick(run.id);
72
+ const lastPending = await this.workflowRunAsyncActivityPendingRepository.findLastByActivityId(parentActivity.id);
73
+ if (!lastPending || lastPending.status !== 'pending')
74
+ return;
75
+ if (child.batchSize == null) {
76
+ await this.workflowRunAsyncActivity.advance(parentActivity.id, {
77
+ status: child.status,
78
+ output: child.output,
79
+ });
91
80
  return;
92
81
  }
93
- }
94
- const reason = pushActivityOrError instanceof Error
95
- ? {
96
- message: pushActivityOrError.message,
97
- stack: pushActivityOrError.stack,
98
- }
99
- : { message: String(pushActivityOrError) };
100
- Object.assign(run, { status: 'rejected', rejectedReason: reason });
101
- console.error(pushActivityOrError);
102
- await this.notifyParentWorkflowRun(run, 'rejected', reason);
82
+ const runningSiblings = this.workflowRunRepository.countRunningByParentActivityId(parentActivity.id);
83
+ if (runningSiblings > 0)
84
+ return;
85
+ const siblings = await this.workflowRunRepository.findBatchSiblings(parentActivity.id);
86
+ await this.workflowRunAsyncActivity.advance(parentActivity.id, {
87
+ batch: parentActivity.id,
88
+ count: siblings.length,
89
+ });
90
+ });
103
91
  }
104
- }
105
- findWorkflow(app, workflowId) {
106
- const workflow = app.workflows.find(workflow => workflow.id === workflowId);
107
- if (workflow)
108
- return workflow;
109
- if (!workflowId.startsWith(':'))
110
- return;
111
- const index = parseInt(workflowId.slice(1));
112
- return app.workflows[index];
113
- }
114
- linkChildRunsToParentActivity(parentActivity) {
115
- for (const run of this.workflowRunRepository.findBy(child => child.parentWorkflowRunActivityId === parentActivity.id &&
116
- !child.parentActivity)) {
117
- run.parentActivity = parentActivity;
92
+ catch (error) {
93
+ console.error(styleText('red', `[Runtime] failed to settle parent of run ${childRunId}:`, { stream: process.stderr }), error);
118
94
  }
119
95
  }
120
- resolveParentActivity(child) {
121
- if (child.parentActivity)
122
- return child.parentActivity;
123
- if (!child.parentWorkflowRunActivityId)
124
- return undefined;
125
- return this.workflowRunActivityRepository.findById(child.parentWorkflowRunActivityId);
126
- }
127
- async startPendingChildWorkflows(parentActivityId) {
128
- const runs = this.workflowRunRepository.findBy(run => {
129
- if (run.parentActivity?.id !== parentActivityId &&
130
- run.parentWorkflowRunActivityId !== parentActivityId)
131
- return false;
132
- if (run.status !== 'running')
133
- return false;
134
- const activities = this.workflowRunActivityRepository.findByRunId(run.id);
135
- if (activities.length > 0)
136
- return false;
137
- return true;
138
- });
139
- for (const run of runs) {
140
- await this.nextTick(run.id);
96
+ async tick(runId) {
97
+ const run = await this.workflowRunRepository.findById(runId);
98
+ if (!run)
99
+ throw new Error(`Unknown workflow run: ${runId}`);
100
+ if (run.status !== 'running')
101
+ return 'stop';
102
+ if (!app)
103
+ throw new Error('App not initialized');
104
+ const workflow = findWorkflowById(app, run.workflow);
105
+ if (!workflow) {
106
+ await this.reject(run, { message: `Workflow not found: ${run.workflow}` });
107
+ return 'stop';
141
108
  }
109
+ const history = await this.workflowRun.getHistory(run.id);
110
+ const activityId = uuidv7();
111
+ const logs = [];
112
+ return this.context.run({ runId, workflowId: run.workflow, activityId }, async () => {
113
+ try {
114
+ const output = await Internals.runWorkflow(workflow, {
115
+ claims,
116
+ env,
117
+ history,
118
+ input: await hydrateInput(run.input),
119
+ logs,
120
+ });
121
+ await this.workflowRunRepository.finish(run.id, output);
122
+ await this.onWorkflowRunFinished(run.id);
123
+ return 'stop';
124
+ }
125
+ catch (pushOrError) {
126
+ if (pushOrError instanceof PushWaitAsyncActivity)
127
+ return 'stop';
128
+ if (pushOrError instanceof PushActivity)
129
+ return await this.pushActivity(run, history.length, activityId, pushOrError);
130
+ await this.reject(run, toRejectedReason(pushOrError));
131
+ return 'stop';
132
+ }
133
+ finally {
134
+ if (logs.length)
135
+ await this.workflowRunRepository.createLogs(run.id, logs);
136
+ this.events.runUpdated(run.id);
137
+ }
138
+ });
142
139
  }
143
- async notifyParentWorkflowRun(child, status, output) {
144
- if (!child.parent)
145
- return;
146
- const parentActivity = this.resolveParentActivity(child);
147
- if (!parentActivity)
148
- return;
149
- const parentAsyncActivity = parentActivity.asyncActivity;
150
- if (!parentAsyncActivity)
151
- return;
152
- const lastPending = parentAsyncActivity.lastPendingAsyncActivity;
153
- if (!lastPending)
154
- return;
155
- if (lastPending.status !== 'pending')
156
- return;
157
- if (child.batchSize == null) {
158
- await this.workflowRunAsyncActivity.advance(parentActivity.id, {
159
- status,
160
- output,
161
- });
162
- return;
140
+ async pushActivity(run, position, activityId, push) {
141
+ const Activity = push.activity
142
+ .constructor;
143
+ this.activityRegistry.add(Activity);
144
+ const activity = WorkflowRunActivity.fromConstructor(run.id, position, Activity, { id: activityId, input: push.input });
145
+ await this.workflowRunActivityRepository.create(activity);
146
+ this.events.runUpdated(run.id);
147
+ try {
148
+ if (push.activity instanceof SyncActivity) {
149
+ await this.workflowRunSyncActivity.execute(activity, push.input);
150
+ this.enqueueChildWorkflowRuns(activity.id);
151
+ return 'continue';
152
+ }
153
+ if (push.activity instanceof AsyncActivity) {
154
+ const pending = await this.workflowRunAsyncActivity.create(activity, push.input);
155
+ this.enqueueChildWorkflowRuns(activity.id);
156
+ return pending.status === 'pending' ? 'stop' : 'continue';
157
+ }
158
+ throw new Error(`Unsupported activity: ${Activity.name}`);
163
159
  }
164
- const siblings = this.workflowRunRepository.findBy(run => run.parentWorkflowRunActivityId === child.parentWorkflowRunActivityId &&
165
- run.batchSize != null);
166
- const batchHasRunningRuns = siblings.some(run => run.status === 'running');
167
- if (batchHasRunningRuns)
168
- return;
169
- await this.workflowRunAsyncActivity.advance(parentActivity.id, {
170
- batch: child.parentWorkflowRunActivityId,
171
- count: siblings.length,
172
- });
160
+ catch (error) {
161
+ await this.reject(run, toRejectedReason(error), activity.id);
162
+ return 'stop';
163
+ }
164
+ }
165
+ enqueueChildWorkflowRuns(parentActivityId) {
166
+ this.enqueueNextTick.enqueueMany(this.workflowRunRepository.findStartableIdsByParentActivityId(parentActivityId));
167
+ }
168
+ async reject(run, reason, activityId) {
169
+ const header = [
170
+ `[server] run ${run.id} of workflow "${run.workflow}" rejected`,
171
+ ...(activityId ? [` activity: ${activityId}`] : []),
172
+ ].join('\n');
173
+ console.error(styleText('red', header, { stream: process.stderr }), `\n${reason.stack ?? reason.message}`);
174
+ await this.workflowRunRepository.reject(run.id, reason);
175
+ this.events.runUpdated(run.id);
176
+ await this.onWorkflowRunFinished(run.id);
173
177
  }
174
178
  };
175
179
  NextTickWorkflowRun = __decorate([
176
180
  Injectable(),
177
181
  __param(0, Inject(() => WorkflowRunRepository)),
178
182
  __param(1, Inject(() => WorkflowRunActivityRepository)),
179
- __param(2, Inject(() => WorkflowRunFacade)),
180
- __param(3, Inject(() => WorkflowRunSyncActivityFacade)),
181
- __param(4, Inject(() => WorkflowRunAsyncActivityFacade)),
182
- __param(5, Inject(() => RuntimeContextService))
183
+ __param(2, Inject(() => WorkflowRunAsyncActivityPendingRepository)),
184
+ __param(3, Inject(() => WorkflowRunFacade)),
185
+ __param(4, Inject(() => WorkflowRunSyncActivityFacade)),
186
+ __param(5, Inject(() => WorkflowRunAsyncActivityFacade)),
187
+ __param(6, Inject(() => EnqueueWorkflowRunNextTick)),
188
+ __param(7, Inject(() => ActivityRegistryService)),
189
+ __param(8, Inject(() => WorkflowRunLockService)),
190
+ __param(9, Inject(() => RuntimeContextService)),
191
+ __param(10, Inject(() => WorkflowRunEventsService))
183
192
  ], NextTickWorkflowRun);
184
193
  export { NextTickWorkflowRun };
185
194
  //# sourceMappingURL=NextTickWorkflowRun.usecase.js.map