@contember/engine-actions 2.1.0-alpha.3 → 2.1.0-alpha.35

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 (506) hide show
  1. package/graphql.codegen.yml +2 -2
  2. package/package.json +27 -22
  3. package/src/ActionsExecutionContainerHookFactory.ts +23 -11
  4. package/src/authorization/ActionsAuthorizationActions.ts +2 -0
  5. package/src/dispatch/DispatchWorkerSupervisor.ts +17 -16
  6. package/src/dispatch/EventDispatcher.ts +0 -2
  7. package/src/dispatch/EventsRepository.ts +63 -43
  8. package/src/dispatch/ProjectDispatcher.ts +6 -11
  9. package/src/dispatch/WebhookTargetHandler.ts +18 -9
  10. package/src/dispatch/types.ts +1 -2
  11. package/src/graphql/http/ActionsApiMiddlewareFactory.ts +7 -5
  12. package/src/graphql/http/ActionsContextResolver.ts +1 -2
  13. package/src/graphql/http/ActionsGraphQLHandlerFactory.ts +0 -1
  14. package/src/graphql/http/ActionsWebsocketControllerFactory.ts +7 -5
  15. package/src/graphql/resolvers/ActionsContext.ts +1 -0
  16. package/src/graphql/resolvers/ResolversFactory.ts +9 -2
  17. package/src/graphql/resolvers/mutation/RetryEventMutationResolver.ts +22 -0
  18. package/src/graphql/resolvers/mutation/SetVariablesMutationResolver.ts +0 -1
  19. package/src/graphql/resolvers/mutation/StopEventMutationResolver.ts +19 -0
  20. package/src/graphql/resolvers/mutation/index.ts +2 -0
  21. package/src/graphql/resolvers/query/EventsQueryResolver.ts +15 -8
  22. package/src/graphql/resolvers/query/VariablesQueryResolver.ts +0 -1
  23. package/src/graphql/schema/actions.graphql.ts +18 -4
  24. package/src/graphql/schema/index.ts +84 -30
  25. package/src/index.ts +55 -30
  26. package/src/migrations/2023-03-10-145000-actions-variables.ts +1 -1
  27. package/src/migrations/2025-05-28-160000-action-event-user.ts +16 -0
  28. package/src/migrations/index.ts +2 -0
  29. package/src/migrations/snapshot.ts +6 -3
  30. package/src/model/EventByIdQuery.ts +21 -0
  31. package/src/model/EventsToProcessSpecification.ts +9 -8
  32. package/src/model/SetVariableCommand.ts +0 -1
  33. package/src/model/types.ts +3 -0
  34. package/src/triggers/TriggerHandler.ts +16 -15
  35. package/src/triggers/TriggerIndirectChangesFetcher.ts +62 -3
  36. package/src/triggers/TriggerListeners.ts +1 -8
  37. package/src/triggers/TriggerListenersBuilder.ts +3 -6
  38. package/src/triggers/TriggerListenersStore.ts +2 -2
  39. package/src/triggers/TriggerPayloadBuilder.ts +43 -13
  40. package/src/triggers/TriggerPayloadManager.ts +2 -4
  41. package/src/triggers/TriggerPayloadPersister.ts +8 -3
  42. package/src/utils/notifyChannel.ts +6 -0
  43. package/tests/cases/unit/generator.test.ts +133 -136
  44. package/tests/cases/unit/webhookHandler.test.ts +47 -35
  45. package/dist/development/index.cjs +0 -94
  46. package/dist/development/index.cjs.map +0 -1
  47. package/dist/development/index.js +0 -94
  48. package/dist/development/index.js.map +0 -1
  49. package/dist/development/src/ActionsExecutionContainerHookFactory.cjs +0 -30
  50. package/dist/development/src/ActionsExecutionContainerHookFactory.cjs.map +0 -1
  51. package/dist/development/src/ActionsExecutionContainerHookFactory.js +0 -30
  52. package/dist/development/src/ActionsExecutionContainerHookFactory.js.map +0 -1
  53. package/dist/development/src/ImplementationException.cjs +0 -6
  54. package/dist/development/src/ImplementationException.cjs.map +0 -1
  55. package/dist/development/src/ImplementationException.js +0 -6
  56. package/dist/development/src/ImplementationException.js.map +0 -1
  57. package/dist/development/src/ListenerStoreProvider.cjs +0 -25
  58. package/dist/development/src/ListenerStoreProvider.cjs.map +0 -1
  59. package/dist/development/src/ListenerStoreProvider.js +0 -25
  60. package/dist/development/src/ListenerStoreProvider.js.map +0 -1
  61. package/dist/development/src/authorization/ActionsAuthorizationActions.cjs +0 -15
  62. package/dist/development/src/authorization/ActionsAuthorizationActions.cjs.map +0 -1
  63. package/dist/development/src/authorization/ActionsAuthorizationActions.js +0 -16
  64. package/dist/development/src/authorization/ActionsAuthorizationActions.js.map +0 -1
  65. package/dist/development/src/authorization/ActionsPermissionsFactory.cjs +0 -16
  66. package/dist/development/src/authorization/ActionsPermissionsFactory.cjs.map +0 -1
  67. package/dist/development/src/authorization/ActionsPermissionsFactory.js +0 -16
  68. package/dist/development/src/authorization/ActionsPermissionsFactory.js.map +0 -1
  69. package/dist/development/src/dispatch/DispatchWorkerSupervisor.cjs +0 -125
  70. package/dist/development/src/dispatch/DispatchWorkerSupervisor.cjs.map +0 -1
  71. package/dist/development/src/dispatch/DispatchWorkerSupervisor.js +0 -125
  72. package/dist/development/src/dispatch/DispatchWorkerSupervisor.js.map +0 -1
  73. package/dist/development/src/dispatch/EventDispatcher.cjs +0 -43
  74. package/dist/development/src/dispatch/EventDispatcher.cjs.map +0 -1
  75. package/dist/development/src/dispatch/EventDispatcher.js +0 -43
  76. package/dist/development/src/dispatch/EventDispatcher.js.map +0 -1
  77. package/dist/development/src/dispatch/EventsRepository.cjs +0 -104
  78. package/dist/development/src/dispatch/EventsRepository.cjs.map +0 -1
  79. package/dist/development/src/dispatch/EventsRepository.js +0 -104
  80. package/dist/development/src/dispatch/EventsRepository.js.map +0 -1
  81. package/dist/development/src/dispatch/ProjectDispatcher.cjs +0 -99
  82. package/dist/development/src/dispatch/ProjectDispatcher.cjs.map +0 -1
  83. package/dist/development/src/dispatch/ProjectDispatcher.js +0 -99
  84. package/dist/development/src/dispatch/ProjectDispatcher.js.map +0 -1
  85. package/dist/development/src/dispatch/TargetHandlerResolver.cjs +0 -16
  86. package/dist/development/src/dispatch/TargetHandlerResolver.cjs.map +0 -1
  87. package/dist/development/src/dispatch/TargetHandlerResolver.js +0 -16
  88. package/dist/development/src/dispatch/TargetHandlerResolver.js.map +0 -1
  89. package/dist/development/src/dispatch/WebhookFetcher.cjs +0 -16
  90. package/dist/development/src/dispatch/WebhookFetcher.cjs.map +0 -1
  91. package/dist/development/src/dispatch/WebhookFetcher.js +0 -16
  92. package/dist/development/src/dispatch/WebhookFetcher.js.map +0 -1
  93. package/dist/development/src/dispatch/WebhookTargetHandler.cjs +0 -193
  94. package/dist/development/src/dispatch/WebhookTargetHandler.cjs.map +0 -1
  95. package/dist/development/src/dispatch/WebhookTargetHandler.js +0 -176
  96. package/dist/development/src/dispatch/WebhookTargetHandler.js.map +0 -1
  97. package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.cjs +0 -38
  98. package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.cjs.map +0 -1
  99. package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.js +0 -38
  100. package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.js.map +0 -1
  101. package/dist/development/src/graphql/http/ActionsContextResolver.cjs +0 -39
  102. package/dist/development/src/graphql/http/ActionsContextResolver.cjs.map +0 -1
  103. package/dist/development/src/graphql/http/ActionsContextResolver.js +0 -39
  104. package/dist/development/src/graphql/http/ActionsContextResolver.js.map +0 -1
  105. package/dist/development/src/graphql/http/ActionsGraphQLHandlerFactory.cjs +0 -20
  106. package/dist/development/src/graphql/http/ActionsGraphQLHandlerFactory.cjs.map +0 -1
  107. package/dist/development/src/graphql/http/ActionsGraphQLHandlerFactory.js +0 -20
  108. package/dist/development/src/graphql/http/ActionsGraphQLHandlerFactory.js.map +0 -1
  109. package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.cjs +0 -149
  110. package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.cjs.map +0 -1
  111. package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.js +0 -132
  112. package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.js.map +0 -1
  113. package/dist/development/src/graphql/resolvers/ResolversFactory.cjs +0 -31
  114. package/dist/development/src/graphql/resolvers/ResolversFactory.cjs.map +0 -1
  115. package/dist/development/src/graphql/resolvers/ResolversFactory.js +0 -31
  116. package/dist/development/src/graphql/resolvers/ResolversFactory.js.map +0 -1
  117. package/dist/development/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.cjs +0 -19
  118. package/dist/development/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.cjs.map +0 -1
  119. package/dist/development/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js +0 -19
  120. package/dist/development/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js.map +0 -1
  121. package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.cjs +0 -19
  122. package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.cjs.map +0 -1
  123. package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js +0 -19
  124. package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js.map +0 -1
  125. package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.cjs +0 -48
  126. package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +0 -1
  127. package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.js +0 -48
  128. package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.js.map +0 -1
  129. package/dist/development/src/graphql/resolvers/query/VariablesQueryResolver.cjs +0 -19
  130. package/dist/development/src/graphql/resolvers/query/VariablesQueryResolver.cjs.map +0 -1
  131. package/dist/development/src/graphql/resolvers/query/VariablesQueryResolver.js +0 -19
  132. package/dist/development/src/graphql/resolvers/query/VariablesQueryResolver.js.map +0 -1
  133. package/dist/development/src/graphql/schema/actions.graphql.cjs +0 -93
  134. package/dist/development/src/graphql/schema/actions.graphql.cjs.map +0 -1
  135. package/dist/development/src/graphql/schema/actions.graphql.js +0 -93
  136. package/dist/development/src/graphql/schema/actions.graphql.js.map +0 -1
  137. package/dist/development/src/migrations/2023-03-10-145000-actions-variables.cjs +0 -16
  138. package/dist/development/src/migrations/2023-03-10-145000-actions-variables.cjs.map +0 -1
  139. package/dist/development/src/migrations/2023-03-10-145000-actions-variables.js +0 -17
  140. package/dist/development/src/migrations/2023-03-10-145000-actions-variables.js.map +0 -1
  141. package/dist/development/src/migrations/index.cjs +0 -10
  142. package/dist/development/src/migrations/index.cjs.map +0 -1
  143. package/dist/development/src/migrations/index.js +0 -10
  144. package/dist/development/src/migrations/index.js.map +0 -1
  145. package/dist/development/src/migrations/snapshot.cjs +0 -48
  146. package/dist/development/src/migrations/snapshot.cjs.map +0 -1
  147. package/dist/development/src/migrations/snapshot.js +0 -49
  148. package/dist/development/src/migrations/snapshot.js.map +0 -1
  149. package/dist/development/src/model/EventsInProcessingQuery.cjs +0 -14
  150. package/dist/development/src/model/EventsInProcessingQuery.cjs.map +0 -1
  151. package/dist/development/src/model/EventsInProcessingQuery.js +0 -14
  152. package/dist/development/src/model/EventsInProcessingQuery.js.map +0 -1
  153. package/dist/development/src/model/EventsToProcessQuery.cjs +0 -15
  154. package/dist/development/src/model/EventsToProcessQuery.cjs.map +0 -1
  155. package/dist/development/src/model/EventsToProcessQuery.js +0 -15
  156. package/dist/development/src/model/EventsToProcessQuery.js.map +0 -1
  157. package/dist/development/src/model/EventsToProcessSpecification.cjs +0 -8
  158. package/dist/development/src/model/EventsToProcessSpecification.cjs.map +0 -1
  159. package/dist/development/src/model/EventsToProcessSpecification.js +0 -8
  160. package/dist/development/src/model/EventsToProcessSpecification.js.map +0 -1
  161. package/dist/development/src/model/FailedEventsQuery.cjs +0 -14
  162. package/dist/development/src/model/FailedEventsQuery.cjs.map +0 -1
  163. package/dist/development/src/model/FailedEventsQuery.js +0 -14
  164. package/dist/development/src/model/FailedEventsQuery.js.map +0 -1
  165. package/dist/development/src/model/SetVariableCommand.cjs +0 -21
  166. package/dist/development/src/model/SetVariableCommand.cjs.map +0 -1
  167. package/dist/development/src/model/SetVariableCommand.js +0 -21
  168. package/dist/development/src/model/SetVariableCommand.js.map +0 -1
  169. package/dist/development/src/model/VariablesManager.cjs +0 -41
  170. package/dist/development/src/model/VariablesManager.cjs.map +0 -1
  171. package/dist/development/src/model/VariablesManager.js +0 -41
  172. package/dist/development/src/model/VariablesManager.js.map +0 -1
  173. package/dist/development/src/model/VariablesQuery.cjs +0 -10
  174. package/dist/development/src/model/VariablesQuery.cjs.map +0 -1
  175. package/dist/development/src/model/VariablesQuery.js +0 -10
  176. package/dist/development/src/model/VariablesQuery.js.map +0 -1
  177. package/dist/development/src/triggers/TriggerHandler.cjs +0 -126
  178. package/dist/development/src/triggers/TriggerHandler.cjs.map +0 -1
  179. package/dist/development/src/triggers/TriggerHandler.js +0 -126
  180. package/dist/development/src/triggers/TriggerHandler.js.map +0 -1
  181. package/dist/development/src/triggers/TriggerIndirectChangesFetcher.cjs +0 -21
  182. package/dist/development/src/triggers/TriggerIndirectChangesFetcher.cjs.map +0 -1
  183. package/dist/development/src/triggers/TriggerIndirectChangesFetcher.js +0 -21
  184. package/dist/development/src/triggers/TriggerIndirectChangesFetcher.js.map +0 -1
  185. package/dist/development/src/triggers/TriggerListenersBuilder.cjs +0 -169
  186. package/dist/development/src/triggers/TriggerListenersBuilder.cjs.map +0 -1
  187. package/dist/development/src/triggers/TriggerListenersBuilder.js +0 -169
  188. package/dist/development/src/triggers/TriggerListenersBuilder.js.map +0 -1
  189. package/dist/development/src/triggers/TriggerListenersFactory.cjs +0 -17
  190. package/dist/development/src/triggers/TriggerListenersFactory.cjs.map +0 -1
  191. package/dist/development/src/triggers/TriggerListenersFactory.js +0 -17
  192. package/dist/development/src/triggers/TriggerListenersFactory.js.map +0 -1
  193. package/dist/development/src/triggers/TriggerListenersStore.cjs +0 -24
  194. package/dist/development/src/triggers/TriggerListenersStore.cjs.map +0 -1
  195. package/dist/development/src/triggers/TriggerListenersStore.js +0 -24
  196. package/dist/development/src/triggers/TriggerListenersStore.js.map +0 -1
  197. package/dist/development/src/triggers/TriggerPayloadBuilder.cjs +0 -134
  198. package/dist/development/src/triggers/TriggerPayloadBuilder.cjs.map +0 -1
  199. package/dist/development/src/triggers/TriggerPayloadBuilder.js +0 -134
  200. package/dist/development/src/triggers/TriggerPayloadBuilder.js.map +0 -1
  201. package/dist/development/src/triggers/TriggerPayloadManager.cjs +0 -27
  202. package/dist/development/src/triggers/TriggerPayloadManager.cjs.map +0 -1
  203. package/dist/development/src/triggers/TriggerPayloadManager.js +0 -27
  204. package/dist/development/src/triggers/TriggerPayloadManager.js.map +0 -1
  205. package/dist/development/src/triggers/TriggerPayloadPersister.cjs +0 -43
  206. package/dist/development/src/triggers/TriggerPayloadPersister.cjs.map +0 -1
  207. package/dist/development/src/triggers/TriggerPayloadPersister.js +0 -43
  208. package/dist/development/src/triggers/TriggerPayloadPersister.js.map +0 -1
  209. package/dist/development/src/utils/assertNever.cjs +0 -7
  210. package/dist/development/src/utils/assertNever.cjs.map +0 -1
  211. package/dist/development/src/utils/assertNever.js +0 -7
  212. package/dist/development/src/utils/assertNever.js.map +0 -1
  213. package/dist/development/src/utils/map.cjs +0 -13
  214. package/dist/development/src/utils/map.cjs.map +0 -1
  215. package/dist/development/src/utils/map.js +0 -13
  216. package/dist/development/src/utils/map.js.map +0 -1
  217. package/dist/production/index.cjs +0 -94
  218. package/dist/production/index.cjs.map +0 -1
  219. package/dist/production/index.js +0 -94
  220. package/dist/production/index.js.map +0 -1
  221. package/dist/production/src/ActionsExecutionContainerHookFactory.cjs +0 -30
  222. package/dist/production/src/ActionsExecutionContainerHookFactory.cjs.map +0 -1
  223. package/dist/production/src/ActionsExecutionContainerHookFactory.js +0 -30
  224. package/dist/production/src/ActionsExecutionContainerHookFactory.js.map +0 -1
  225. package/dist/production/src/ImplementationException.cjs +0 -6
  226. package/dist/production/src/ImplementationException.cjs.map +0 -1
  227. package/dist/production/src/ImplementationException.js +0 -6
  228. package/dist/production/src/ImplementationException.js.map +0 -1
  229. package/dist/production/src/ListenerStoreProvider.cjs +0 -25
  230. package/dist/production/src/ListenerStoreProvider.cjs.map +0 -1
  231. package/dist/production/src/ListenerStoreProvider.js +0 -25
  232. package/dist/production/src/ListenerStoreProvider.js.map +0 -1
  233. package/dist/production/src/authorization/ActionsAuthorizationActions.cjs +0 -15
  234. package/dist/production/src/authorization/ActionsAuthorizationActions.cjs.map +0 -1
  235. package/dist/production/src/authorization/ActionsAuthorizationActions.js +0 -16
  236. package/dist/production/src/authorization/ActionsAuthorizationActions.js.map +0 -1
  237. package/dist/production/src/authorization/ActionsPermissionsFactory.cjs +0 -16
  238. package/dist/production/src/authorization/ActionsPermissionsFactory.cjs.map +0 -1
  239. package/dist/production/src/authorization/ActionsPermissionsFactory.js +0 -16
  240. package/dist/production/src/authorization/ActionsPermissionsFactory.js.map +0 -1
  241. package/dist/production/src/dispatch/DispatchWorkerSupervisor.cjs +0 -125
  242. package/dist/production/src/dispatch/DispatchWorkerSupervisor.cjs.map +0 -1
  243. package/dist/production/src/dispatch/DispatchWorkerSupervisor.js +0 -125
  244. package/dist/production/src/dispatch/DispatchWorkerSupervisor.js.map +0 -1
  245. package/dist/production/src/dispatch/EventDispatcher.cjs +0 -43
  246. package/dist/production/src/dispatch/EventDispatcher.cjs.map +0 -1
  247. package/dist/production/src/dispatch/EventDispatcher.js +0 -43
  248. package/dist/production/src/dispatch/EventDispatcher.js.map +0 -1
  249. package/dist/production/src/dispatch/EventsRepository.cjs +0 -104
  250. package/dist/production/src/dispatch/EventsRepository.cjs.map +0 -1
  251. package/dist/production/src/dispatch/EventsRepository.js +0 -104
  252. package/dist/production/src/dispatch/EventsRepository.js.map +0 -1
  253. package/dist/production/src/dispatch/ProjectDispatcher.cjs +0 -99
  254. package/dist/production/src/dispatch/ProjectDispatcher.cjs.map +0 -1
  255. package/dist/production/src/dispatch/ProjectDispatcher.js +0 -99
  256. package/dist/production/src/dispatch/ProjectDispatcher.js.map +0 -1
  257. package/dist/production/src/dispatch/TargetHandlerResolver.cjs +0 -16
  258. package/dist/production/src/dispatch/TargetHandlerResolver.cjs.map +0 -1
  259. package/dist/production/src/dispatch/TargetHandlerResolver.js +0 -16
  260. package/dist/production/src/dispatch/TargetHandlerResolver.js.map +0 -1
  261. package/dist/production/src/dispatch/WebhookFetcher.cjs +0 -16
  262. package/dist/production/src/dispatch/WebhookFetcher.cjs.map +0 -1
  263. package/dist/production/src/dispatch/WebhookFetcher.js +0 -16
  264. package/dist/production/src/dispatch/WebhookFetcher.js.map +0 -1
  265. package/dist/production/src/dispatch/WebhookTargetHandler.cjs +0 -193
  266. package/dist/production/src/dispatch/WebhookTargetHandler.cjs.map +0 -1
  267. package/dist/production/src/dispatch/WebhookTargetHandler.js +0 -176
  268. package/dist/production/src/dispatch/WebhookTargetHandler.js.map +0 -1
  269. package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.cjs +0 -38
  270. package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.cjs.map +0 -1
  271. package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.js +0 -38
  272. package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.js.map +0 -1
  273. package/dist/production/src/graphql/http/ActionsContextResolver.cjs +0 -39
  274. package/dist/production/src/graphql/http/ActionsContextResolver.cjs.map +0 -1
  275. package/dist/production/src/graphql/http/ActionsContextResolver.js +0 -39
  276. package/dist/production/src/graphql/http/ActionsContextResolver.js.map +0 -1
  277. package/dist/production/src/graphql/http/ActionsGraphQLHandlerFactory.cjs +0 -20
  278. package/dist/production/src/graphql/http/ActionsGraphQLHandlerFactory.cjs.map +0 -1
  279. package/dist/production/src/graphql/http/ActionsGraphQLHandlerFactory.js +0 -20
  280. package/dist/production/src/graphql/http/ActionsGraphQLHandlerFactory.js.map +0 -1
  281. package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.cjs +0 -149
  282. package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.cjs.map +0 -1
  283. package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.js +0 -132
  284. package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.js.map +0 -1
  285. package/dist/production/src/graphql/resolvers/ResolversFactory.cjs +0 -31
  286. package/dist/production/src/graphql/resolvers/ResolversFactory.cjs.map +0 -1
  287. package/dist/production/src/graphql/resolvers/ResolversFactory.js +0 -31
  288. package/dist/production/src/graphql/resolvers/ResolversFactory.js.map +0 -1
  289. package/dist/production/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.cjs +0 -19
  290. package/dist/production/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.cjs.map +0 -1
  291. package/dist/production/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js +0 -19
  292. package/dist/production/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js.map +0 -1
  293. package/dist/production/src/graphql/resolvers/mutation/SetVariablesMutationResolver.cjs +0 -19
  294. package/dist/production/src/graphql/resolvers/mutation/SetVariablesMutationResolver.cjs.map +0 -1
  295. package/dist/production/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js +0 -19
  296. package/dist/production/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js.map +0 -1
  297. package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.cjs +0 -48
  298. package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +0 -1
  299. package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.js +0 -48
  300. package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.js.map +0 -1
  301. package/dist/production/src/graphql/resolvers/query/VariablesQueryResolver.cjs +0 -19
  302. package/dist/production/src/graphql/resolvers/query/VariablesQueryResolver.cjs.map +0 -1
  303. package/dist/production/src/graphql/resolvers/query/VariablesQueryResolver.js +0 -19
  304. package/dist/production/src/graphql/resolvers/query/VariablesQueryResolver.js.map +0 -1
  305. package/dist/production/src/graphql/schema/actions.graphql.cjs +0 -93
  306. package/dist/production/src/graphql/schema/actions.graphql.cjs.map +0 -1
  307. package/dist/production/src/graphql/schema/actions.graphql.js +0 -93
  308. package/dist/production/src/graphql/schema/actions.graphql.js.map +0 -1
  309. package/dist/production/src/migrations/2023-03-10-145000-actions-variables.cjs +0 -16
  310. package/dist/production/src/migrations/2023-03-10-145000-actions-variables.cjs.map +0 -1
  311. package/dist/production/src/migrations/2023-03-10-145000-actions-variables.js +0 -17
  312. package/dist/production/src/migrations/2023-03-10-145000-actions-variables.js.map +0 -1
  313. package/dist/production/src/migrations/index.cjs +0 -10
  314. package/dist/production/src/migrations/index.cjs.map +0 -1
  315. package/dist/production/src/migrations/index.js +0 -10
  316. package/dist/production/src/migrations/index.js.map +0 -1
  317. package/dist/production/src/migrations/snapshot.cjs +0 -48
  318. package/dist/production/src/migrations/snapshot.cjs.map +0 -1
  319. package/dist/production/src/migrations/snapshot.js +0 -49
  320. package/dist/production/src/migrations/snapshot.js.map +0 -1
  321. package/dist/production/src/model/EventsInProcessingQuery.cjs +0 -14
  322. package/dist/production/src/model/EventsInProcessingQuery.cjs.map +0 -1
  323. package/dist/production/src/model/EventsInProcessingQuery.js +0 -14
  324. package/dist/production/src/model/EventsInProcessingQuery.js.map +0 -1
  325. package/dist/production/src/model/EventsToProcessQuery.cjs +0 -15
  326. package/dist/production/src/model/EventsToProcessQuery.cjs.map +0 -1
  327. package/dist/production/src/model/EventsToProcessQuery.js +0 -15
  328. package/dist/production/src/model/EventsToProcessQuery.js.map +0 -1
  329. package/dist/production/src/model/EventsToProcessSpecification.cjs +0 -8
  330. package/dist/production/src/model/EventsToProcessSpecification.cjs.map +0 -1
  331. package/dist/production/src/model/EventsToProcessSpecification.js +0 -8
  332. package/dist/production/src/model/EventsToProcessSpecification.js.map +0 -1
  333. package/dist/production/src/model/FailedEventsQuery.cjs +0 -14
  334. package/dist/production/src/model/FailedEventsQuery.cjs.map +0 -1
  335. package/dist/production/src/model/FailedEventsQuery.js +0 -14
  336. package/dist/production/src/model/FailedEventsQuery.js.map +0 -1
  337. package/dist/production/src/model/SetVariableCommand.cjs +0 -21
  338. package/dist/production/src/model/SetVariableCommand.cjs.map +0 -1
  339. package/dist/production/src/model/SetVariableCommand.js +0 -21
  340. package/dist/production/src/model/SetVariableCommand.js.map +0 -1
  341. package/dist/production/src/model/VariablesManager.cjs +0 -41
  342. package/dist/production/src/model/VariablesManager.cjs.map +0 -1
  343. package/dist/production/src/model/VariablesManager.js +0 -41
  344. package/dist/production/src/model/VariablesManager.js.map +0 -1
  345. package/dist/production/src/model/VariablesQuery.cjs +0 -10
  346. package/dist/production/src/model/VariablesQuery.cjs.map +0 -1
  347. package/dist/production/src/model/VariablesQuery.js +0 -10
  348. package/dist/production/src/model/VariablesQuery.js.map +0 -1
  349. package/dist/production/src/triggers/TriggerHandler.cjs +0 -126
  350. package/dist/production/src/triggers/TriggerHandler.cjs.map +0 -1
  351. package/dist/production/src/triggers/TriggerHandler.js +0 -126
  352. package/dist/production/src/triggers/TriggerHandler.js.map +0 -1
  353. package/dist/production/src/triggers/TriggerIndirectChangesFetcher.cjs +0 -21
  354. package/dist/production/src/triggers/TriggerIndirectChangesFetcher.cjs.map +0 -1
  355. package/dist/production/src/triggers/TriggerIndirectChangesFetcher.js +0 -21
  356. package/dist/production/src/triggers/TriggerIndirectChangesFetcher.js.map +0 -1
  357. package/dist/production/src/triggers/TriggerListenersBuilder.cjs +0 -169
  358. package/dist/production/src/triggers/TriggerListenersBuilder.cjs.map +0 -1
  359. package/dist/production/src/triggers/TriggerListenersBuilder.js +0 -169
  360. package/dist/production/src/triggers/TriggerListenersBuilder.js.map +0 -1
  361. package/dist/production/src/triggers/TriggerListenersFactory.cjs +0 -17
  362. package/dist/production/src/triggers/TriggerListenersFactory.cjs.map +0 -1
  363. package/dist/production/src/triggers/TriggerListenersFactory.js +0 -17
  364. package/dist/production/src/triggers/TriggerListenersFactory.js.map +0 -1
  365. package/dist/production/src/triggers/TriggerListenersStore.cjs +0 -24
  366. package/dist/production/src/triggers/TriggerListenersStore.cjs.map +0 -1
  367. package/dist/production/src/triggers/TriggerListenersStore.js +0 -24
  368. package/dist/production/src/triggers/TriggerListenersStore.js.map +0 -1
  369. package/dist/production/src/triggers/TriggerPayloadBuilder.cjs +0 -134
  370. package/dist/production/src/triggers/TriggerPayloadBuilder.cjs.map +0 -1
  371. package/dist/production/src/triggers/TriggerPayloadBuilder.js +0 -134
  372. package/dist/production/src/triggers/TriggerPayloadBuilder.js.map +0 -1
  373. package/dist/production/src/triggers/TriggerPayloadManager.cjs +0 -27
  374. package/dist/production/src/triggers/TriggerPayloadManager.cjs.map +0 -1
  375. package/dist/production/src/triggers/TriggerPayloadManager.js +0 -27
  376. package/dist/production/src/triggers/TriggerPayloadManager.js.map +0 -1
  377. package/dist/production/src/triggers/TriggerPayloadPersister.cjs +0 -43
  378. package/dist/production/src/triggers/TriggerPayloadPersister.cjs.map +0 -1
  379. package/dist/production/src/triggers/TriggerPayloadPersister.js +0 -43
  380. package/dist/production/src/triggers/TriggerPayloadPersister.js.map +0 -1
  381. package/dist/production/src/utils/assertNever.cjs +0 -7
  382. package/dist/production/src/utils/assertNever.cjs.map +0 -1
  383. package/dist/production/src/utils/assertNever.js +0 -7
  384. package/dist/production/src/utils/assertNever.js.map +0 -1
  385. package/dist/production/src/utils/map.cjs +0 -13
  386. package/dist/production/src/utils/map.cjs.map +0 -1
  387. package/dist/production/src/utils/map.js +0 -13
  388. package/dist/production/src/utils/map.js.map +0 -1
  389. package/dist/tests/cases/unit/generator.test.d.ts +0 -2
  390. package/dist/tests/cases/unit/generator.test.d.ts.map +0 -1
  391. package/dist/tests/cases/unit/webhookHandler.test.d.ts +0 -2
  392. package/dist/tests/cases/unit/webhookHandler.test.d.ts.map +0 -1
  393. package/dist/tests/src/gql.d.ts +0 -2
  394. package/dist/tests/src/gql.d.ts.map +0 -1
  395. package/dist/tests/src/uuid.d.ts +0 -3
  396. package/dist/tests/src/uuid.d.ts.map +0 -1
  397. package/dist/tests/tsconfig.tsbuildinfo +0 -1
  398. package/dist/types/ActionsExecutionContainerHookFactory.d.ts +0 -8
  399. package/dist/types/ActionsExecutionContainerHookFactory.d.ts.map +0 -1
  400. package/dist/types/ImplementationException.d.ts +0 -3
  401. package/dist/types/ImplementationException.d.ts.map +0 -1
  402. package/dist/types/ListenerStoreProvider.d.ts +0 -7
  403. package/dist/types/ListenerStoreProvider.d.ts.map +0 -1
  404. package/dist/types/authorization/ActionsAuthorizationActions.d.ts +0 -28
  405. package/dist/types/authorization/ActionsAuthorizationActions.d.ts.map +0 -1
  406. package/dist/types/authorization/ActionsPermissionsFactory.d.ts +0 -5
  407. package/dist/types/authorization/ActionsPermissionsFactory.d.ts.map +0 -1
  408. package/dist/types/authorization/Identity.d.ts +0 -5
  409. package/dist/types/authorization/Identity.d.ts.map +0 -1
  410. package/dist/types/authorization/index.d.ts +0 -4
  411. package/dist/types/authorization/index.d.ts.map +0 -1
  412. package/dist/types/dispatch/DispatchWorkerSupervisor.d.ts +0 -17
  413. package/dist/types/dispatch/DispatchWorkerSupervisor.d.ts.map +0 -1
  414. package/dist/types/dispatch/EventDispatcher.d.ts +0 -25
  415. package/dist/types/dispatch/EventDispatcher.d.ts.map +0 -1
  416. package/dist/types/dispatch/EventsRepository.d.ts +0 -22
  417. package/dist/types/dispatch/EventsRepository.d.ts.map +0 -1
  418. package/dist/types/dispatch/ProjectDispatcher.d.ts +0 -22
  419. package/dist/types/dispatch/ProjectDispatcher.d.ts.map +0 -1
  420. package/dist/types/dispatch/TargetHandlerResolver.d.ts +0 -9
  421. package/dist/types/dispatch/TargetHandlerResolver.d.ts.map +0 -1
  422. package/dist/types/dispatch/WebhookFetcher.d.ts +0 -14
  423. package/dist/types/dispatch/WebhookFetcher.d.ts.map +0 -1
  424. package/dist/types/dispatch/WebhookTargetHandler.d.ts +0 -16
  425. package/dist/types/dispatch/WebhookTargetHandler.d.ts.map +0 -1
  426. package/dist/types/dispatch/types.d.ts +0 -27
  427. package/dist/types/dispatch/types.d.ts.map +0 -1
  428. package/dist/types/graphql/http/ActionsApiMiddlewareFactory.d.ts +0 -13
  429. package/dist/types/graphql/http/ActionsApiMiddlewareFactory.d.ts.map +0 -1
  430. package/dist/types/graphql/http/ActionsContextResolver.d.ts +0 -14
  431. package/dist/types/graphql/http/ActionsContextResolver.d.ts.map +0 -1
  432. package/dist/types/graphql/http/ActionsGraphQLHandlerFactory.d.ts +0 -8
  433. package/dist/types/graphql/http/ActionsGraphQLHandlerFactory.d.ts.map +0 -1
  434. package/dist/types/graphql/http/ActionsWebsocketControllerFactory.d.ts +0 -11
  435. package/dist/types/graphql/http/ActionsWebsocketControllerFactory.d.ts.map +0 -1
  436. package/dist/types/graphql/resolvers/ActionsContext.d.ts +0 -11
  437. package/dist/types/graphql/resolvers/ActionsContext.d.ts.map +0 -1
  438. package/dist/types/graphql/resolvers/ResolversFactory.d.ts +0 -13
  439. package/dist/types/graphql/resolvers/ResolversFactory.d.ts.map +0 -1
  440. package/dist/types/graphql/resolvers/index.d.ts +0 -3
  441. package/dist/types/graphql/resolvers/index.d.ts.map +0 -1
  442. package/dist/types/graphql/resolvers/mutation/ProcessBatchMutationResolver.d.ts +0 -11
  443. package/dist/types/graphql/resolvers/mutation/ProcessBatchMutationResolver.d.ts.map +0 -1
  444. package/dist/types/graphql/resolvers/mutation/SetVariablesMutationResolver.d.ts +0 -11
  445. package/dist/types/graphql/resolvers/mutation/SetVariablesMutationResolver.d.ts.map +0 -1
  446. package/dist/types/graphql/resolvers/mutation/index.d.ts +0 -3
  447. package/dist/types/graphql/resolvers/mutation/index.d.ts.map +0 -1
  448. package/dist/types/graphql/resolvers/query/EventsQueryResolver.d.ts +0 -11
  449. package/dist/types/graphql/resolvers/query/EventsQueryResolver.d.ts.map +0 -1
  450. package/dist/types/graphql/resolvers/query/VariablesQueryResolver.d.ts +0 -12
  451. package/dist/types/graphql/resolvers/query/VariablesQueryResolver.d.ts.map +0 -1
  452. package/dist/types/graphql/resolvers/query/index.d.ts +0 -2
  453. package/dist/types/graphql/resolvers/query/index.d.ts.map +0 -1
  454. package/dist/types/graphql/schema/actions.graphql.d.ts +0 -3
  455. package/dist/types/graphql/schema/actions.graphql.d.ts.map +0 -1
  456. package/dist/types/graphql/schema/index.d.ts +0 -256
  457. package/dist/types/graphql/schema/index.d.ts.map +0 -1
  458. package/dist/types/index.d.ts +0 -13
  459. package/dist/types/index.d.ts.map +0 -1
  460. package/dist/types/migrations/2023-03-10-145000-actions-variables.d.ts +0 -3
  461. package/dist/types/migrations/2023-03-10-145000-actions-variables.d.ts.map +0 -1
  462. package/dist/types/migrations/index.d.ts +0 -3
  463. package/dist/types/migrations/index.d.ts.map +0 -1
  464. package/dist/types/migrations/snapshot.d.ts +0 -3
  465. package/dist/types/migrations/snapshot.d.ts.map +0 -1
  466. package/dist/types/model/EventsInProcessingQuery.d.ts +0 -9
  467. package/dist/types/model/EventsInProcessingQuery.d.ts.map +0 -1
  468. package/dist/types/model/EventsToProcessQuery.d.ts +0 -9
  469. package/dist/types/model/EventsToProcessQuery.d.ts.map +0 -1
  470. package/dist/types/model/EventsToProcessSpecification.d.ts +0 -4
  471. package/dist/types/model/EventsToProcessSpecification.d.ts.map +0 -1
  472. package/dist/types/model/FailedEventsQuery.d.ts +0 -9
  473. package/dist/types/model/FailedEventsQuery.d.ts.map +0 -1
  474. package/dist/types/model/SetVariableCommand.d.ts +0 -8
  475. package/dist/types/model/SetVariableCommand.d.ts.map +0 -1
  476. package/dist/types/model/VariablesManager.d.ts +0 -8
  477. package/dist/types/model/VariablesManager.d.ts.map +0 -1
  478. package/dist/types/model/VariablesQuery.d.ts +0 -12
  479. package/dist/types/model/VariablesQuery.d.ts.map +0 -1
  480. package/dist/types/model/types.d.ts +0 -19
  481. package/dist/types/model/types.d.ts.map +0 -1
  482. package/dist/types/triggers/TriggerHandler.d.ts +0 -26
  483. package/dist/types/triggers/TriggerHandler.d.ts.map +0 -1
  484. package/dist/types/triggers/TriggerIndirectChangesFetcher.d.ts +0 -11
  485. package/dist/types/triggers/TriggerIndirectChangesFetcher.d.ts.map +0 -1
  486. package/dist/types/triggers/TriggerListeners.d.ts +0 -9
  487. package/dist/types/triggers/TriggerListeners.d.ts.map +0 -1
  488. package/dist/types/triggers/TriggerListenersBuilder.d.ts +0 -15
  489. package/dist/types/triggers/TriggerListenersBuilder.d.ts.map +0 -1
  490. package/dist/types/triggers/TriggerListenersFactory.d.ts +0 -8
  491. package/dist/types/triggers/TriggerListenersFactory.d.ts.map +0 -1
  492. package/dist/types/triggers/TriggerListenersStore.d.ts +0 -48
  493. package/dist/types/triggers/TriggerListenersStore.d.ts.map +0 -1
  494. package/dist/types/triggers/TriggerPayloadBuilder.d.ts +0 -14
  495. package/dist/types/triggers/TriggerPayloadBuilder.d.ts.map +0 -1
  496. package/dist/types/triggers/TriggerPayloadManager.d.ts +0 -21
  497. package/dist/types/triggers/TriggerPayloadManager.d.ts.map +0 -1
  498. package/dist/types/triggers/TriggerPayloadPersister.d.ts +0 -17
  499. package/dist/types/triggers/TriggerPayloadPersister.d.ts.map +0 -1
  500. package/dist/types/triggers/index.d.ts +0 -8
  501. package/dist/types/triggers/index.d.ts.map +0 -1
  502. package/dist/types/tsconfig.tsbuildinfo +0 -1
  503. package/dist/types/utils/assertNever.d.ts +0 -2
  504. package/dist/types/utils/assertNever.d.ts.map +0 -1
  505. package/dist/types/utils/map.d.ts +0 -2
  506. package/dist/types/utils/map.d.ts.map +0 -1
@@ -1,125 +0,0 @@
1
- import { AcquiringListener } from "@contember/database";
2
- import { Supervisor } from "@contember/engine-common";
3
- import { ImplementationException } from "../ImplementationException.js";
4
- class DispatchWorkerSupervisorFactory {
5
- constructor(projectDispatcherFactory) {
6
- this.projectDispatcherFactory = projectDispatcherFactory;
7
- }
8
- create(projectGroup) {
9
- return new DispatchWorkerSupervisor(this.projectDispatcherFactory, projectGroup);
10
- }
11
- }
12
- class DispatchWorkerSupervisor {
13
- constructor(projectDispatcherFactory, projectGroup) {
14
- this.projectDispatcherFactory = projectDispatcherFactory;
15
- this.projectGroup = projectGroup;
16
- }
17
- async run({ logger, onError }) {
18
- const projectGroup = this.projectGroup;
19
- const tenantContainer = projectGroup.tenantContainer;
20
- const projectContainerResolver = projectGroup.projectContainerResolver;
21
- const running = /* @__PURE__ */ new Map();
22
- const cleanupListener = projectContainerResolver.on("destroy", async ({ container }) => {
23
- const runningForProject = running.get(container.project.slug);
24
- if (!runningForProject) {
25
- return;
26
- }
27
- running.delete(container.project.slug);
28
- await (await runningForProject.worker).end();
29
- });
30
- const refreshProjectWorker = async (container, isReloading) => {
31
- const db = container.systemDatabaseContext;
32
- const current = running.get(container.project.slug);
33
- if (current && current.container === container) {
34
- return;
35
- }
36
- const dispatcher = this.projectDispatcherFactory.create({
37
- db,
38
- contentSchemaResolver: container.contentSchemaResolver,
39
- projectSlug: container.project.slug
40
- });
41
- const supervisedDispatcher = new Supervisor(
42
- dispatcher,
43
- { startupMax: isReloading ? Number.MAX_VALUE : 10 }
44
- );
45
- const worker = supervisedDispatcher.run({
46
- logger,
47
- onError: () => {
48
- throw new ImplementationException("supervised project dispatcher crashed");
49
- }
50
- });
51
- running.set(container.project.slug, { worker, container });
52
- try {
53
- if (current) {
54
- await (await current.worker).end();
55
- }
56
- await worker;
57
- logger.debug("Project dispatch worker started", { project: container.project.slug });
58
- } catch (e) {
59
- logger.error(e, { message: "Project dispatch worker start failed", project: container.project.slug });
60
- running.delete(container.project.slug);
61
- throw e;
62
- }
63
- };
64
- const projectTracker = new Supervisor(new AcquiringListener(
65
- tenantContainer.databaseContext.client,
66
- "project_updated",
67
- async () => {
68
- logger.debug("Project config change detected, reloading dispatch workers");
69
- await endProjectWorkers();
70
- try {
71
- await startWorkers(true);
72
- } catch (e) {
73
- logger.error(e, { message: "Dispatch workers reload failed, terminating" });
74
- await endAll();
75
- onError(e);
76
- }
77
- }
78
- ));
79
- const runningProjectTracker = await projectTracker.run({
80
- logger,
81
- onError: () => {
82
- throw new ImplementationException("supervised project tracker crashed");
83
- }
84
- });
85
- const fetchProjects = async () => await tenantContainer.projectManager.getProjects(tenantContainer.databaseContext);
86
- const startWorkers = async (isReloading) => {
87
- try {
88
- const projects = await fetchProjects();
89
- for (const project of projects) {
90
- const container = await projectGroup.projectContainerResolver.getProjectContainer(project.slug);
91
- if (container) {
92
- await refreshProjectWorker(container, isReloading);
93
- }
94
- }
95
- } catch (e) {
96
- await endAll();
97
- throw e;
98
- }
99
- };
100
- const endProjectWorkers = async () => {
101
- const workers = [...running.values()];
102
- running.clear();
103
- await Promise.allSettled(workers.map(async ({ worker }) => await (await worker).end()));
104
- };
105
- const endAll = async () => {
106
- logger.debug("Terminating project dispatch workers...");
107
- cleanupListener();
108
- try {
109
- await runningProjectTracker.end();
110
- } catch {
111
- }
112
- await endProjectWorkers();
113
- logger.debug("Project dispatch workers terminated");
114
- };
115
- await startWorkers(false);
116
- return {
117
- end: endAll
118
- };
119
- }
120
- }
121
- export {
122
- DispatchWorkerSupervisor,
123
- DispatchWorkerSupervisorFactory
124
- };
125
- //# sourceMappingURL=DispatchWorkerSupervisor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DispatchWorkerSupervisor.js","sources":["../../../../../packages/engine-actions/src/dispatch/DispatchWorkerSupervisor.ts"],"sourcesContent":["import { ProjectContainer, ProjectGroupContainer } from '@contember/engine-http'\nimport { AcquiringListener } from '@contember/database'\nimport { Runnable, RunnableArgs, Running, Supervisor } from '@contember/engine-common'\nimport { ProjectDispatcherFactory } from './ProjectDispatcher'\nimport { Logger } from '@contember/logger'\nimport { ImplementationException } from '../ImplementationException'\n\nexport class DispatchWorkerSupervisorFactory {\n\n\tconstructor(\n\t\tprivate projectDispatcherFactory: ProjectDispatcherFactory,\n\t) {\n\t}\n\n\tpublic create(projectGroup: ProjectGroupContainer): DispatchWorkerSupervisor {\n\t\treturn new DispatchWorkerSupervisor(this.projectDispatcherFactory, projectGroup)\n\t}\n}\n\nexport class DispatchWorkerSupervisor implements Runnable {\n\tconstructor(\n\t\tprivate projectDispatcherFactory: ProjectDispatcherFactory,\n\t\tprivate projectGroup: ProjectGroupContainer,\n\t) {\n\t}\n\n\tpublic async run({ logger, onError }: RunnableArgs) {\n\t\tconst projectGroup = this.projectGroup\n\t\tconst tenantContainer = projectGroup.tenantContainer\n\t\tconst projectContainerResolver = projectGroup.projectContainerResolver\n\n\t\tconst running = new Map<string, { worker: Promise<Running>; container: ProjectContainer }>()\n\n\t\tconst cleanupListener = projectContainerResolver.on('destroy', async ({ container }) => {\n\t\t\tconst runningForProject = running.get(container.project.slug)\n\t\t\tif (!runningForProject) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\trunning.delete(container.project.slug)\n\t\t\tawait (await runningForProject.worker).end()\n\t\t})\n\n\t\tconst refreshProjectWorker = async (container: ProjectContainer, isReloading: boolean) => {\n\t\t\tconst db = container.systemDatabaseContext\n\t\t\tconst current = running.get(container.project.slug)\n\t\t\tif (current && current.container === container) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst dispatcher = this.projectDispatcherFactory.create({\n\t\t\t\tdb,\n\t\t\t\tcontentSchemaResolver: container.contentSchemaResolver,\n\t\t\t\tprojectSlug: container.project.slug,\n\t\t\t})\n\t\t\tconst supervisedDispatcher = new Supervisor(\n\t\t\t\tdispatcher,\n\t\t\t\t{ startupMax: isReloading ? Number.MAX_VALUE : 10 },\n\t\t\t)\n\t\t\tconst worker = supervisedDispatcher.run({\n\t\t\t\tlogger,\n\t\t\t\tonError: () => {\n\t\t\t\t\tthrow new ImplementationException('supervised project dispatcher crashed')\n\t\t\t\t},\n\t\t\t})\n\t\t\trunning.set(container.project.slug, { worker, container })\n\t\t\ttry {\n\t\t\t\tif (current) {\n\t\t\t\t\tawait (await current.worker).end()\n\t\t\t\t}\n\t\t\t\tawait worker\n\t\t\t\tlogger.debug('Project dispatch worker started', { project: container.project.slug })\n\t\t\t} catch (e) {\n\t\t\t\tlogger.error(e, { message: 'Project dispatch worker start failed', project: container.project.slug })\n\t\t\t\trunning.delete(container.project.slug)\n\t\t\t\tthrow e\n\t\t\t}\n\t\t}\n\t\tconst projectTracker = new Supervisor(new AcquiringListener(\n\t\t\ttenantContainer.databaseContext.client,\n\t\t\t'project_updated',\n\t\t\tasync () => {\n\t\t\t\tlogger.debug('Project config change detected, reloading dispatch workers')\n\t\t\t\tawait endProjectWorkers()\n\t\t\t\ttry {\n\t\t\t\t\tawait startWorkers(true)\n\t\t\t\t} catch (e) {\n\t\t\t\t\tlogger.error(e, { message: 'Dispatch workers reload failed, terminating' })\n\t\t\t\t\tawait endAll()\n\t\t\t\t\tonError(e)\n\t\t\t\t}\n\t\t\t},\n\t\t))\n\n\t\tconst runningProjectTracker = await projectTracker.run({\n\t\t\tlogger,\n\t\t\tonError: () => {\n\t\t\t\tthrow new ImplementationException('supervised project tracker crashed')\n\t\t\t},\n\t\t})\n\t\tconst fetchProjects = async () => await tenantContainer.projectManager.getProjects(tenantContainer.databaseContext)\n\n\t\tconst startWorkers = async (isReloading: boolean) => {\n\t\t\ttry {\n\t\t\t\tconst projects = await fetchProjects()\n\t\t\t\tfor (const project of projects) {\n\t\t\t\t\tconst container = await projectGroup.projectContainerResolver.getProjectContainer(project.slug)\n\t\t\t\t\tif (container) {\n\t\t\t\t\t\tawait refreshProjectWorker(container, isReloading)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tawait endAll()\n\t\t\t\tthrow e\n\t\t\t}\n\t\t}\n\t\tconst endProjectWorkers = async () => {\n\t\t\tconst workers = [...running.values()]\n\t\t\trunning.clear()\n\t\t\tawait Promise.allSettled(workers.map(async ({ worker }) => await (await worker).end()))\n\t\t}\n\t\tconst endAll = async () => {\n\t\t\tlogger.debug('Terminating project dispatch workers...')\n\t\t\tcleanupListener()\n\t\t\ttry {\n\t\t\t\tawait runningProjectTracker.end()\n\t\t\t} catch {\n\t\t\t}\n\t\t\tawait endProjectWorkers()\n\t\t\tlogger.debug('Project dispatch workers terminated')\n\t\t}\n\n\t\tawait startWorkers(false)\n\n\t\treturn {\n\t\t\tend: endAll,\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -1,43 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- class EventDispatcher {
4
- constructor(eventsRepository, variablesManager, invokeResolver) {
5
- this.eventsRepository = eventsRepository;
6
- this.variablesManager = variablesManager;
7
- this.invokeResolver = invokeResolver;
8
- }
9
- async processBatch({ db, contentSchemaResolver, logger }) {
10
- const schema = (await contentSchemaResolver.getSchema({ db, normalize: true })).schema;
11
- const batch = await this.eventsRepository.fetchBatch(schema.actions, db.client);
12
- const batchId = Math.random().toString().substring(2);
13
- const batchLogger = logger.child({ loc: "Actions.EventDispatcher", batchId });
14
- if (!batch.ok) {
15
- batchLogger.debug("Nothing to process", {
16
- backoffMs: batch.backoffMs ?? "undefined"
17
- });
18
- return { failed: 0, succeed: 0, backoffMs: batch.backoffMs };
19
- }
20
- const { target, events } = batch;
21
- try {
22
- const handler = this.invokeResolver.resolveHandler(target);
23
- batchLogger.debug("Processing started", {
24
- events: batch.events.map((it) => it.id)
25
- });
26
- const variables = await this.variablesManager.fetchVariables(db);
27
- const handledEvents = await handler.handle({ target, events, logger: batchLogger, variables });
28
- const [succeed, failed] = await this.eventsRepository.persistProcessed(db.client, handledEvents);
29
- batchLogger.debug("Processing done", { succeed, failed });
30
- return { succeed, failed, backoffMs: 0 };
31
- } catch (e) {
32
- logger.error(e, { loc: "EventDispatcher", batchId });
33
- const failedEvents = events.map((it) => ({
34
- row: it,
35
- result: { ok: false, errorMessage: `Internal error` }
36
- }));
37
- await this.eventsRepository.persistProcessed(db.client, failedEvents);
38
- return { succeed: 0, failed: batch.events.length, backoffMs: 0 };
39
- }
40
- }
41
- }
42
- exports.EventDispatcher = EventDispatcher;
43
- //# sourceMappingURL=EventDispatcher.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EventDispatcher.cjs","sources":["../../../../../packages/engine-actions/src/dispatch/EventDispatcher.ts"],"sourcesContent":["import { EventsRepository } from './EventsRepository'\nimport { TargetHandlerResolver } from './TargetHandlerResolver'\nimport { HandledEvent } from './types'\nimport { Logger } from '@contember/logger'\nimport { ContentSchemaResolver } from '@contember/engine-http'\nimport { DatabaseContext } from '@contember/engine-system-api'\nimport { VariablesManager } from '../model/VariablesManager'\n\n\ntype ProcessBatchArgs = {\n\tdb: DatabaseContext\n\tcontentSchemaResolver: ContentSchemaResolver\n\tlogger: Logger\n}\n\ntype ProcessBatchResult = {\n\tsucceed: number\n\tfailed: number\n\tbackoffMs: number | undefined\n}\n\nexport class EventDispatcher {\n\n\tconstructor(\n\t\tprivate readonly eventsRepository: EventsRepository,\n\t\tprivate readonly variablesManager: VariablesManager,\n\t\tprivate readonly invokeResolver: TargetHandlerResolver,\n\t) {\n\t}\n\n\tasync processBatch({ db, contentSchemaResolver, logger }: ProcessBatchArgs): Promise<ProcessBatchResult> {\n\t\tconst schema = (await contentSchemaResolver.getSchema({ db, normalize: true })).schema\n\t\tconst batch = await this.eventsRepository.fetchBatch(schema.actions, db.client)\n\t\tconst batchId = Math.random().toString().substring(2)\n\t\tconst batchLogger = logger.child({ loc: 'Actions.EventDispatcher', batchId })\n\t\tif (!batch.ok) {\n\t\t\tbatchLogger.debug('Nothing to process', {\n\t\t\t\tbackoffMs: batch.backoffMs ?? 'undefined',\n\t\t\t})\n\t\t\treturn { failed: 0, succeed: 0, backoffMs: batch.backoffMs }\n\t\t}\n\t\tconst { target, events } = batch\n\t\ttry {\n\t\t\tconst handler = this.invokeResolver.resolveHandler(target)\n\t\t\tbatchLogger.debug('Processing started', {\n\t\t\t\tevents: batch.events.map(it => it.id),\n\t\t\t})\n\t\t\tconst variables = await this.variablesManager.fetchVariables(db)\n\t\t\tconst handledEvents = await handler.handle({ target, events, logger: batchLogger, variables })\n\t\t\tconst [succeed, failed] = await this.eventsRepository.persistProcessed(db.client, handledEvents)\n\t\t\tbatchLogger.debug('Processing done', { succeed, failed })\n\t\t\treturn { succeed, failed, backoffMs: 0 }\n\t\t} catch (e) {\n\t\t\tlogger.error(e, { loc: 'EventDispatcher', batchId })\n\t\t\tconst failedEvents = events.map((it): HandledEvent => ({\n\t\t\t\trow: it,\n\t\t\t\tresult: { ok: false, errorMessage: `Internal error` },\n\t\t\t}))\n\t\t\tawait this.eventsRepository.persistProcessed(db.client, failedEvents)\n\n\t\t\treturn { succeed: 0, failed: batch.events.length, backoffMs: 0 }\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;AAqBO,MAAM,gBAAgB;AAAA,EAE5B,YACkB,kBACA,kBACA,gBAChB;AAHgB,SAAA,mBAAA;AACA,SAAA,mBAAA;AACA,SAAA,iBAAA;AAAA,EAAA;AAAA,EAIlB,MAAM,aAAa,EAAE,IAAI,uBAAuB,UAAyD;AAClG,UAAA,UAAU,MAAM,sBAAsB,UAAU,EAAE,IAAI,WAAW,KAAM,CAAA,GAAG;AAC1E,UAAA,QAAQ,MAAM,KAAK,iBAAiB,WAAW,OAAO,SAAS,GAAG,MAAM;AAC9E,UAAM,UAAU,KAAK,OAAA,EAAS,SAAS,EAAE,UAAU,CAAC;AACpD,UAAM,cAAc,OAAO,MAAM,EAAE,KAAK,2BAA2B,SAAS;AACxE,QAAA,CAAC,MAAM,IAAI;AACd,kBAAY,MAAM,sBAAsB;AAAA,QACvC,WAAW,MAAM,aAAa;AAAA,MAAA,CAC9B;AACD,aAAO,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,MAAM,UAAU;AAAA,IAAA;AAEtD,UAAA,EAAE,QAAQ,OAAA,IAAW;AACvB,QAAA;AACH,YAAM,UAAU,KAAK,eAAe,eAAe,MAAM;AACzD,kBAAY,MAAM,sBAAsB;AAAA,QACvC,QAAQ,MAAM,OAAO,IAAI,CAAA,OAAM,GAAG,EAAE;AAAA,MAAA,CACpC;AACD,YAAM,YAAY,MAAM,KAAK,iBAAiB,eAAe,EAAE;AACzD,YAAA,gBAAgB,MAAM,QAAQ,OAAO,EAAE,QAAQ,QAAQ,QAAQ,aAAa,WAAW;AACvF,YAAA,CAAC,SAAS,MAAM,IAAI,MAAM,KAAK,iBAAiB,iBAAiB,GAAG,QAAQ,aAAa;AAC/F,kBAAY,MAAM,mBAAmB,EAAE,SAAS,QAAQ;AACxD,aAAO,EAAE,SAAS,QAAQ,WAAW,EAAE;AAAA,aAC/B,GAAG;AACX,aAAO,MAAM,GAAG,EAAE,KAAK,mBAAmB,SAAS;AACnD,YAAM,eAAe,OAAO,IAAI,CAAC,QAAsB;AAAA,QACtD,KAAK;AAAA,QACL,QAAQ,EAAE,IAAI,OAAO,cAAc,iBAAiB;AAAA,MAAA,EACnD;AACF,YAAM,KAAK,iBAAiB,iBAAiB,GAAG,QAAQ,YAAY;AAE7D,aAAA,EAAE,SAAS,GAAG,QAAQ,MAAM,OAAO,QAAQ,WAAW,EAAE;AAAA,IAAA;AAAA,EAChE;AAEF;;"}
@@ -1,43 +0,0 @@
1
- class EventDispatcher {
2
- constructor(eventsRepository, variablesManager, invokeResolver) {
3
- this.eventsRepository = eventsRepository;
4
- this.variablesManager = variablesManager;
5
- this.invokeResolver = invokeResolver;
6
- }
7
- async processBatch({ db, contentSchemaResolver, logger }) {
8
- const schema = (await contentSchemaResolver.getSchema({ db, normalize: true })).schema;
9
- const batch = await this.eventsRepository.fetchBatch(schema.actions, db.client);
10
- const batchId = Math.random().toString().substring(2);
11
- const batchLogger = logger.child({ loc: "Actions.EventDispatcher", batchId });
12
- if (!batch.ok) {
13
- batchLogger.debug("Nothing to process", {
14
- backoffMs: batch.backoffMs ?? "undefined"
15
- });
16
- return { failed: 0, succeed: 0, backoffMs: batch.backoffMs };
17
- }
18
- const { target, events } = batch;
19
- try {
20
- const handler = this.invokeResolver.resolveHandler(target);
21
- batchLogger.debug("Processing started", {
22
- events: batch.events.map((it) => it.id)
23
- });
24
- const variables = await this.variablesManager.fetchVariables(db);
25
- const handledEvents = await handler.handle({ target, events, logger: batchLogger, variables });
26
- const [succeed, failed] = await this.eventsRepository.persistProcessed(db.client, handledEvents);
27
- batchLogger.debug("Processing done", { succeed, failed });
28
- return { succeed, failed, backoffMs: 0 };
29
- } catch (e) {
30
- logger.error(e, { loc: "EventDispatcher", batchId });
31
- const failedEvents = events.map((it) => ({
32
- row: it,
33
- result: { ok: false, errorMessage: `Internal error` }
34
- }));
35
- await this.eventsRepository.persistProcessed(db.client, failedEvents);
36
- return { succeed: 0, failed: batch.events.length, backoffMs: 0 };
37
- }
38
- }
39
- }
40
- export {
41
- EventDispatcher
42
- };
43
- //# sourceMappingURL=EventDispatcher.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EventDispatcher.js","sources":["../../../../../packages/engine-actions/src/dispatch/EventDispatcher.ts"],"sourcesContent":["import { EventsRepository } from './EventsRepository'\nimport { TargetHandlerResolver } from './TargetHandlerResolver'\nimport { HandledEvent } from './types'\nimport { Logger } from '@contember/logger'\nimport { ContentSchemaResolver } from '@contember/engine-http'\nimport { DatabaseContext } from '@contember/engine-system-api'\nimport { VariablesManager } from '../model/VariablesManager'\n\n\ntype ProcessBatchArgs = {\n\tdb: DatabaseContext\n\tcontentSchemaResolver: ContentSchemaResolver\n\tlogger: Logger\n}\n\ntype ProcessBatchResult = {\n\tsucceed: number\n\tfailed: number\n\tbackoffMs: number | undefined\n}\n\nexport class EventDispatcher {\n\n\tconstructor(\n\t\tprivate readonly eventsRepository: EventsRepository,\n\t\tprivate readonly variablesManager: VariablesManager,\n\t\tprivate readonly invokeResolver: TargetHandlerResolver,\n\t) {\n\t}\n\n\tasync processBatch({ db, contentSchemaResolver, logger }: ProcessBatchArgs): Promise<ProcessBatchResult> {\n\t\tconst schema = (await contentSchemaResolver.getSchema({ db, normalize: true })).schema\n\t\tconst batch = await this.eventsRepository.fetchBatch(schema.actions, db.client)\n\t\tconst batchId = Math.random().toString().substring(2)\n\t\tconst batchLogger = logger.child({ loc: 'Actions.EventDispatcher', batchId })\n\t\tif (!batch.ok) {\n\t\t\tbatchLogger.debug('Nothing to process', {\n\t\t\t\tbackoffMs: batch.backoffMs ?? 'undefined',\n\t\t\t})\n\t\t\treturn { failed: 0, succeed: 0, backoffMs: batch.backoffMs }\n\t\t}\n\t\tconst { target, events } = batch\n\t\ttry {\n\t\t\tconst handler = this.invokeResolver.resolveHandler(target)\n\t\t\tbatchLogger.debug('Processing started', {\n\t\t\t\tevents: batch.events.map(it => it.id),\n\t\t\t})\n\t\t\tconst variables = await this.variablesManager.fetchVariables(db)\n\t\t\tconst handledEvents = await handler.handle({ target, events, logger: batchLogger, variables })\n\t\t\tconst [succeed, failed] = await this.eventsRepository.persistProcessed(db.client, handledEvents)\n\t\t\tbatchLogger.debug('Processing done', { succeed, failed })\n\t\t\treturn { succeed, failed, backoffMs: 0 }\n\t\t} catch (e) {\n\t\t\tlogger.error(e, { loc: 'EventDispatcher', batchId })\n\t\t\tconst failedEvents = events.map((it): HandledEvent => ({\n\t\t\t\trow: it,\n\t\t\t\tresult: { ok: false, errorMessage: `Internal error` },\n\t\t\t}))\n\t\t\tawait this.eventsRepository.persistProcessed(db.client, failedEvents)\n\n\t\t\treturn { succeed: 0, failed: batch.events.length, backoffMs: 0 }\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"AAqBO,MAAM,gBAAgB;AAAA,EAE5B,YACkB,kBACA,kBACA,gBAChB;AAHgB,SAAA,mBAAA;AACA,SAAA,mBAAA;AACA,SAAA,iBAAA;AAAA,EAAA;AAAA,EAIlB,MAAM,aAAa,EAAE,IAAI,uBAAuB,UAAyD;AAClG,UAAA,UAAU,MAAM,sBAAsB,UAAU,EAAE,IAAI,WAAW,KAAM,CAAA,GAAG;AAC1E,UAAA,QAAQ,MAAM,KAAK,iBAAiB,WAAW,OAAO,SAAS,GAAG,MAAM;AAC9E,UAAM,UAAU,KAAK,OAAA,EAAS,SAAS,EAAE,UAAU,CAAC;AACpD,UAAM,cAAc,OAAO,MAAM,EAAE,KAAK,2BAA2B,SAAS;AACxE,QAAA,CAAC,MAAM,IAAI;AACd,kBAAY,MAAM,sBAAsB;AAAA,QACvC,WAAW,MAAM,aAAa;AAAA,MAAA,CAC9B;AACD,aAAO,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,MAAM,UAAU;AAAA,IAAA;AAEtD,UAAA,EAAE,QAAQ,OAAA,IAAW;AACvB,QAAA;AACH,YAAM,UAAU,KAAK,eAAe,eAAe,MAAM;AACzD,kBAAY,MAAM,sBAAsB;AAAA,QACvC,QAAQ,MAAM,OAAO,IAAI,CAAA,OAAM,GAAG,EAAE;AAAA,MAAA,CACpC;AACD,YAAM,YAAY,MAAM,KAAK,iBAAiB,eAAe,EAAE;AACzD,YAAA,gBAAgB,MAAM,QAAQ,OAAO,EAAE,QAAQ,QAAQ,QAAQ,aAAa,WAAW;AACvF,YAAA,CAAC,SAAS,MAAM,IAAI,MAAM,KAAK,iBAAiB,iBAAiB,GAAG,QAAQ,aAAa;AAC/F,kBAAY,MAAM,mBAAmB,EAAE,SAAS,QAAQ;AACxD,aAAO,EAAE,SAAS,QAAQ,WAAW,EAAE;AAAA,aAC/B,GAAG;AACX,aAAO,MAAM,GAAG,EAAE,KAAK,mBAAmB,SAAS;AACnD,YAAM,eAAe,OAAO,IAAI,CAAC,QAAsB;AAAA,QACtD,KAAK;AAAA,QACL,QAAQ,EAAE,IAAI,OAAO,cAAc,iBAAiB;AAAA,MAAA,EACnD;AACF,YAAM,KAAK,iBAAiB,iBAAiB,GAAG,QAAQ,YAAY;AAE7D,aAAA,EAAE,SAAS,GAAG,QAAQ,MAAM,OAAO,QAAQ,WAAW,EAAE;AAAA,IAAA;AAAA,EAChE;AAEF;"}
@@ -1,104 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const Database = require("@contember/database");
4
- const EventsToProcessSpecification = require("../model/EventsToProcessSpecification.cjs");
5
- const ACK_TIMEOUT_MS = 1e3 * 60 * 10;
6
- const DEFAULT_REPEAT_INTERVAL_MS = 5e3;
7
- const DEFAULT_MAX_ATTEMPTS = 10;
8
- const DEFAULT_BATCH_SIZE = 1;
9
- class EventsRepository {
10
- async fetchBatch(actions, db) {
11
- const primaryEvent = (await this.fetchInternal(db, 1))[0];
12
- if (!primaryEvent) {
13
- return { ok: false, backoffMs: await this.fetchBackOff(db) };
14
- }
15
- const target = actions.targets[primaryEvent.target];
16
- if (!target) {
17
- await this.markFailedOnUnknownTarget(db, primaryEvent.target, primaryEvent.id);
18
- return await this.fetchBatch(actions, db);
19
- }
20
- const batchSize = (target.batchSize ?? DEFAULT_BATCH_SIZE) - 1;
21
- const batch = batchSize > 0 ? await this.fetchInternal(db, batchSize) : [];
22
- return { ok: true, events: [primaryEvent, ...batch], target };
23
- }
24
- async fetchBackOff(db) {
25
- const result = await Database.SelectBuilder.create().from("actions_event").match(EventsToProcessSpecification.eventsToProcessStateSpecification).select((it) => it.raw("ceil(extract(epoch from visible_at - now()) * 1000)"), "ms").orderBy("visible_at", "asc").limit(1).getResult(db);
26
- return result.length ? Math.max(0, result[0].ms) : void 0;
27
- }
28
- async fetchInternal(db, limit, targetName) {
29
- const visibleAt = /* @__PURE__ */ new Date();
30
- visibleAt.setTime(visibleAt.getTime() + ACK_TIMEOUT_MS);
31
- return await Database.UpdateBuilder.create().table("actions_event").with(
32
- "events",
33
- (qb) => qb.select((it) => it.raw("*")).from("actions_event").match(EventsToProcessSpecification.eventsToProcessSpecification).where(targetName ? { target: targetName } : {}).limit(limit).lock(Database.LockType.forNoKeyUpdate, Database.LockModifier.skipLocked)
34
- ).values({
35
- state: "processing",
36
- last_state_change: /* @__PURE__ */ new Date(),
37
- visible_at: visibleAt
38
- }).from((it) => it.from("events").where((it2) => it2.columnsEq(["events", "id"], ["actions_event", "id"]))).returning(new Database.Literal("*")).execute(db);
39
- }
40
- async persistProcessed(db, events) {
41
- return await db.transaction(async (trx) => {
42
- await trx.query(Database.Connection.REPEATABLE_READ);
43
- const succeed = events.filter((it) => it.result.ok);
44
- await this.markSucceed(trx, succeed.map((it) => it.row));
45
- for (const event of events) {
46
- if (!event.result.ok) {
47
- await this.markFailed(trx, event);
48
- }
49
- }
50
- return [succeed.length, events.length - succeed.length];
51
- });
52
- }
53
- async requeue(db, events) {
54
- await Database.UpdateBuilder.create().table("actions_event").values({
55
- state: (it) => it.raw("CASE WHEN num_retries = 0 THEN ? ELSE ? END", "created", "retrying"),
56
- last_state_change: /* @__PURE__ */ new Date(),
57
- visible_at: /* @__PURE__ */ new Date()
58
- }).where((it) => it.in("id", events.map((it2) => it2.id))).execute(db);
59
- }
60
- async markSucceed(db, rows) {
61
- const now = /* @__PURE__ */ new Date();
62
- await Database.UpdateBuilder.create().table("actions_event").values({
63
- state: "succeed",
64
- num_retries: (it) => it.raw("num_retries + 1"),
65
- resolved_at: now,
66
- last_state_change: now
67
- }).where((it) => it.in("id", rows.map((it2) => it2.id))).execute(db);
68
- }
69
- async markFailed(db, event) {
70
- const numRetries = event.row.num_retries;
71
- const now = /* @__PURE__ */ new Date();
72
- const nextAttempt = /* @__PURE__ */ new Date();
73
- nextAttempt.setTime(nextAttempt.getTime() + (event.target?.initialRepeatIntervalMs ?? DEFAULT_REPEAT_INTERVAL_MS) * Math.pow(2, event.row.num_retries));
74
- await Database.UpdateBuilder.create().table("actions_event").values({
75
- last_state_change: now,
76
- num_retries: event.row.num_retries + 1,
77
- log: JSON.stringify([...event.row.log, event.result]),
78
- ...numRetries < (event.target?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS) ? {
79
- state: "retrying",
80
- visible_at: nextAttempt
81
- } : {
82
- state: "failed"
83
- }
84
- }).where({ id: event.row.id }).execute(db);
85
- }
86
- async markFailedOnUnknownTarget(db, targetName, primaryEventId) {
87
- await Database.UpdateBuilder.create().table("actions_event").where((it) => it.or(
88
- (it2) => it2.and(
89
- (it3) => it3.in("state", ["retrying", "created", "processing"]).compare("visible_at", Database.Operator.lte, "now").compare("target", Database.Operator.eq, targetName)
90
- ).and(
91
- (it3) => it3.compare("id", Database.Operator.eq, primaryEventId)
92
- )
93
- )).values({
94
- // intentionally not retrying
95
- last_state_change: /* @__PURE__ */ new Date(),
96
- num_retries: (it) => it.raw("num_retries + 1"),
97
- log: (it) => it.raw("log || ?::jsonb", { ok: false, errorMessage: `Event target ${targetName} not found, stopping.` }),
98
- state: "failed",
99
- resolved_at: /* @__PURE__ */ new Date()
100
- }).execute(db);
101
- }
102
- }
103
- exports.EventsRepository = EventsRepository;
104
- //# sourceMappingURL=EventsRepository.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EventsRepository.cjs","sources":["../../../../../packages/engine-actions/src/dispatch/EventsRepository.ts"],"sourcesContent":["import {\n\tClient,\n\tConnection,\n\tLiteral,\n\tLockModifier,\n\tLockType,\n\tOperator,\n\tSelectBuilder,\n\tUpdateBuilder,\n} from '@contember/database'\nimport { EventRow, HandledEvent } from './types'\nimport { Actions } from '@contember/schema'\nimport { eventsToProcessSpecification, eventsToProcessStateSpecification } from '../model/EventsToProcessSpecification'\n\n\nconst ACK_TIMEOUT_MS = 1_000 * 60 * 10 // 10 minutes\nconst DEFAULT_REPEAT_INTERVAL_MS = 5_000 // 5 seconds\nconst DEFAULT_MAX_ATTEMPTS = 10\nconst DEFAULT_BATCH_SIZE = 1\n\nexport class EventsRepository {\n\n\tpublic async fetchBatch(actions: Actions.Schema, db: Client): Promise<FetchBatchResult> {\n\t\tconst primaryEvent = (await this.fetchInternal(db, 1))[0]\n\t\tif (!primaryEvent) {\n\t\t\treturn { ok: false, backoffMs: await this.fetchBackOff(db) }\n\t\t}\n\t\tconst target = actions.targets[primaryEvent.target]\n\t\tif (!target) {\n\t\t\tawait this.markFailedOnUnknownTarget(db, primaryEvent.target, primaryEvent.id)\n\t\t\treturn await this.fetchBatch(actions, db)\n\t\t}\n\t\tconst batchSize = (target.batchSize ?? DEFAULT_BATCH_SIZE) - 1\n\t\tconst batch = batchSize > 0 ? await this.fetchInternal(db, batchSize) : []\n\t\treturn { ok: true, events: [primaryEvent, ...batch], target }\n\t}\n\n\n\tprivate async fetchBackOff(db: Client): Promise<number | undefined> {\n\t\tconst result = await SelectBuilder.create<{ ms: number }>()\n\t\t\t.from('actions_event')\n\t\t\t.match(eventsToProcessStateSpecification)\n\t\t\t.select(it => it.raw('ceil(extract(epoch from visible_at - now()) * 1000)'), 'ms')\n\t\t\t.orderBy('visible_at', 'asc')\n\t\t\t.limit(1)\n\t\t\t.getResult(db)\n\n\t\treturn result.length ? Math.max(0, result[0].ms) : undefined\n\t}\n\n\n\tprivate async fetchInternal(db: Client, limit: number, targetName?: string): Promise<EventRow[]> {\n\t\tconst visibleAt = new Date()\n\t\tvisibleAt.setTime(visibleAt.getTime() + ACK_TIMEOUT_MS)\n\t\treturn await UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.with('events', qb => qb\n\t\t\t\t.select(it => it.raw('*'))\n\t\t\t\t.from('actions_event')\n\t\t\t\t.match(eventsToProcessSpecification)\n\t\t\t\t.where(targetName ? { target: targetName } : {})\n\t\t\t\t.limit(limit)\n\t\t\t\t.lock(LockType.forNoKeyUpdate, LockModifier.skipLocked),\n\t\t\t)\n\t\t\t.values<EventRow>({\n\t\t\t\tstate: 'processing',\n\t\t\t\tlast_state_change: new Date(),\n\t\t\t\tvisible_at: visibleAt,\n\t\t\t})\n\t\t\t.from(it => it.from('events').where(it => it.columnsEq(['events', 'id'], ['actions_event', 'id'])))\n\t\t\t.returning<EventRow>(new Literal('*'))\n\t\t\t.execute(db)\n\t}\n\n\tpublic async persistProcessed(db: Client, events: HandledEvent[]): Promise<[number, number]> {\n\t\treturn await db.transaction(async trx => {\n\t\t\tawait trx.query(Connection.REPEATABLE_READ)\n\t\t\tconst succeed = events.filter(it => it.result.ok)\n\t\t\tawait this.markSucceed(trx, succeed.map(it => it.row))\n\n\t\t\tfor (const event of events) {\n\t\t\t\tif (!event.result.ok) {\n\t\t\t\t\tawait this.markFailed(trx, event)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [succeed.length, events.length - succeed.length]\n\t\t})\n\t}\n\n\tpublic async requeue(db: Client, events: EventRow[]): Promise<void> {\n\t\tawait UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.values<EventRow>({\n\t\t\t\tstate: it => it.raw('CASE WHEN num_retries = 0 THEN ? ELSE ? END', 'created', 'retrying'),\n\t\t\t\tlast_state_change: new Date(),\n\t\t\t\tvisible_at: new Date(),\n\t\t\t})\n\t\t\t.where(it => it.in('id', events.map(it => it.id)))\n\t\t\t.execute(db)\n\t}\n\n\tprivate async markSucceed(db: Client, rows: EventRow[]): Promise<void> {\n\t\tconst now = new Date()\n\t\tawait UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.values<EventRow>({\n\t\t\t\tstate: 'succeed',\n\t\t\t\tnum_retries: it => it.raw('num_retries + 1'),\n\t\t\t\tresolved_at: now,\n\t\t\t\tlast_state_change: now,\n\t\t\t})\n\t\t\t.where(it => it.in('id', rows.map(it => it.id)))\n\t\t\t.execute(db)\n\t}\n\n\tprivate async markFailed(db: Client, event: HandledEvent): Promise<void> {\n\t\tconst numRetries = event.row.num_retries\n\t\tconst now = new Date()\n\t\tconst nextAttempt = new Date()\n\t\tnextAttempt.setTime(nextAttempt.getTime() + (event.target?.initialRepeatIntervalMs ?? DEFAULT_REPEAT_INTERVAL_MS) * Math.pow(2, event.row.num_retries))\n\t\tawait UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.values<EventRow>({\n\t\t\t\tlast_state_change: now,\n\t\t\t\tnum_retries: event.row.num_retries + 1,\n\t\t\t\tlog: JSON.stringify([...event.row.log, event.result]) as any,\n\t\t\t\t...(numRetries < (event.target?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS) ? {\n\t\t\t\t\tstate: 'retrying',\n\t\t\t\t\tvisible_at: nextAttempt,\n\t\t\t\t} : {\n\t\t\t\t\tstate: 'failed',\n\t\t\t\t}),\n\t\t\t})\n\t\t\t.where({ id: event.row.id })\n\t\t\t.execute(db)\n\t}\n\n\tprivate async markFailedOnUnknownTarget(db: Client, targetName: string, primaryEventId: string) {\n\t\tawait UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.where(it => it.or(it => it\n\t\t\t\t.and(it => it\n\t\t\t\t\t.in('state', ['retrying', 'created', 'processing'])\n\t\t\t\t\t.compare('visible_at', Operator.lte, 'now')\n\t\t\t\t\t.compare('target', Operator.eq, targetName),\n\t\t\t\t)\n\t\t\t\t.and(it => it\n\t\t\t\t\t.compare('id', Operator.eq, primaryEventId),\n\t\t\t\t),\n\t\t\t))\n\t\t\t.values<EventRow>({\n\t\t\t\t// intentionally not retrying\n\t\t\t\tlast_state_change: new Date(),\n\t\t\t\tnum_retries: it => it.raw('num_retries + 1'),\n\t\t\t\tlog: it => it.raw('log || ?::jsonb', { ok: false, errorMessage: `Event target ${targetName} not found, stopping.` }),\n\t\t\t\tstate: 'failed',\n\t\t\t\tresolved_at: new Date(),\n\t\t\t})\n\t\t\t.execute(db)\n\t}\n}\n\nexport type FetchBatchResult =\n\t| { ok: true; events: EventRow[]; target: Actions.AnyTarget }\n\t| { ok: false; backoffMs?: number }\n"],"names":["SelectBuilder","eventsToProcessStateSpecification","UpdateBuilder","eventsToProcessSpecification","LockType","LockModifier","it","Literal","Connection","Operator"],"mappings":"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"}
@@ -1,104 +0,0 @@
1
- import { SelectBuilder, UpdateBuilder as UpdateBuilder$1, LockType, LockModifier, Literal, Connection, Operator } from "@contember/database";
2
- import { eventsToProcessStateSpecification, eventsToProcessSpecification } from "../model/EventsToProcessSpecification.js";
3
- const ACK_TIMEOUT_MS = 1e3 * 60 * 10;
4
- const DEFAULT_REPEAT_INTERVAL_MS = 5e3;
5
- const DEFAULT_MAX_ATTEMPTS = 10;
6
- const DEFAULT_BATCH_SIZE = 1;
7
- class EventsRepository {
8
- async fetchBatch(actions, db) {
9
- const primaryEvent = (await this.fetchInternal(db, 1))[0];
10
- if (!primaryEvent) {
11
- return { ok: false, backoffMs: await this.fetchBackOff(db) };
12
- }
13
- const target = actions.targets[primaryEvent.target];
14
- if (!target) {
15
- await this.markFailedOnUnknownTarget(db, primaryEvent.target, primaryEvent.id);
16
- return await this.fetchBatch(actions, db);
17
- }
18
- const batchSize = (target.batchSize ?? DEFAULT_BATCH_SIZE) - 1;
19
- const batch = batchSize > 0 ? await this.fetchInternal(db, batchSize) : [];
20
- return { ok: true, events: [primaryEvent, ...batch], target };
21
- }
22
- async fetchBackOff(db) {
23
- const result = await SelectBuilder.create().from("actions_event").match(eventsToProcessStateSpecification).select((it) => it.raw("ceil(extract(epoch from visible_at - now()) * 1000)"), "ms").orderBy("visible_at", "asc").limit(1).getResult(db);
24
- return result.length ? Math.max(0, result[0].ms) : void 0;
25
- }
26
- async fetchInternal(db, limit, targetName) {
27
- const visibleAt = /* @__PURE__ */ new Date();
28
- visibleAt.setTime(visibleAt.getTime() + ACK_TIMEOUT_MS);
29
- return await UpdateBuilder$1.create().table("actions_event").with(
30
- "events",
31
- (qb) => qb.select((it) => it.raw("*")).from("actions_event").match(eventsToProcessSpecification).where(targetName ? { target: targetName } : {}).limit(limit).lock(LockType.forNoKeyUpdate, LockModifier.skipLocked)
32
- ).values({
33
- state: "processing",
34
- last_state_change: /* @__PURE__ */ new Date(),
35
- visible_at: visibleAt
36
- }).from((it) => it.from("events").where((it2) => it2.columnsEq(["events", "id"], ["actions_event", "id"]))).returning(new Literal("*")).execute(db);
37
- }
38
- async persistProcessed(db, events) {
39
- return await db.transaction(async (trx) => {
40
- await trx.query(Connection.REPEATABLE_READ);
41
- const succeed = events.filter((it) => it.result.ok);
42
- await this.markSucceed(trx, succeed.map((it) => it.row));
43
- for (const event of events) {
44
- if (!event.result.ok) {
45
- await this.markFailed(trx, event);
46
- }
47
- }
48
- return [succeed.length, events.length - succeed.length];
49
- });
50
- }
51
- async requeue(db, events) {
52
- await UpdateBuilder$1.create().table("actions_event").values({
53
- state: (it) => it.raw("CASE WHEN num_retries = 0 THEN ? ELSE ? END", "created", "retrying"),
54
- last_state_change: /* @__PURE__ */ new Date(),
55
- visible_at: /* @__PURE__ */ new Date()
56
- }).where((it) => it.in("id", events.map((it2) => it2.id))).execute(db);
57
- }
58
- async markSucceed(db, rows) {
59
- const now = /* @__PURE__ */ new Date();
60
- await UpdateBuilder$1.create().table("actions_event").values({
61
- state: "succeed",
62
- num_retries: (it) => it.raw("num_retries + 1"),
63
- resolved_at: now,
64
- last_state_change: now
65
- }).where((it) => it.in("id", rows.map((it2) => it2.id))).execute(db);
66
- }
67
- async markFailed(db, event) {
68
- const numRetries = event.row.num_retries;
69
- const now = /* @__PURE__ */ new Date();
70
- const nextAttempt = /* @__PURE__ */ new Date();
71
- nextAttempt.setTime(nextAttempt.getTime() + (event.target?.initialRepeatIntervalMs ?? DEFAULT_REPEAT_INTERVAL_MS) * Math.pow(2, event.row.num_retries));
72
- await UpdateBuilder$1.create().table("actions_event").values({
73
- last_state_change: now,
74
- num_retries: event.row.num_retries + 1,
75
- log: JSON.stringify([...event.row.log, event.result]),
76
- ...numRetries < (event.target?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS) ? {
77
- state: "retrying",
78
- visible_at: nextAttempt
79
- } : {
80
- state: "failed"
81
- }
82
- }).where({ id: event.row.id }).execute(db);
83
- }
84
- async markFailedOnUnknownTarget(db, targetName, primaryEventId) {
85
- await UpdateBuilder$1.create().table("actions_event").where((it) => it.or(
86
- (it2) => it2.and(
87
- (it3) => it3.in("state", ["retrying", "created", "processing"]).compare("visible_at", Operator.lte, "now").compare("target", Operator.eq, targetName)
88
- ).and(
89
- (it3) => it3.compare("id", Operator.eq, primaryEventId)
90
- )
91
- )).values({
92
- // intentionally not retrying
93
- last_state_change: /* @__PURE__ */ new Date(),
94
- num_retries: (it) => it.raw("num_retries + 1"),
95
- log: (it) => it.raw("log || ?::jsonb", { ok: false, errorMessage: `Event target ${targetName} not found, stopping.` }),
96
- state: "failed",
97
- resolved_at: /* @__PURE__ */ new Date()
98
- }).execute(db);
99
- }
100
- }
101
- export {
102
- EventsRepository
103
- };
104
- //# sourceMappingURL=EventsRepository.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EventsRepository.js","sources":["../../../../../packages/engine-actions/src/dispatch/EventsRepository.ts"],"sourcesContent":["import {\n\tClient,\n\tConnection,\n\tLiteral,\n\tLockModifier,\n\tLockType,\n\tOperator,\n\tSelectBuilder,\n\tUpdateBuilder,\n} from '@contember/database'\nimport { EventRow, HandledEvent } from './types'\nimport { Actions } from '@contember/schema'\nimport { eventsToProcessSpecification, eventsToProcessStateSpecification } from '../model/EventsToProcessSpecification'\n\n\nconst ACK_TIMEOUT_MS = 1_000 * 60 * 10 // 10 minutes\nconst DEFAULT_REPEAT_INTERVAL_MS = 5_000 // 5 seconds\nconst DEFAULT_MAX_ATTEMPTS = 10\nconst DEFAULT_BATCH_SIZE = 1\n\nexport class EventsRepository {\n\n\tpublic async fetchBatch(actions: Actions.Schema, db: Client): Promise<FetchBatchResult> {\n\t\tconst primaryEvent = (await this.fetchInternal(db, 1))[0]\n\t\tif (!primaryEvent) {\n\t\t\treturn { ok: false, backoffMs: await this.fetchBackOff(db) }\n\t\t}\n\t\tconst target = actions.targets[primaryEvent.target]\n\t\tif (!target) {\n\t\t\tawait this.markFailedOnUnknownTarget(db, primaryEvent.target, primaryEvent.id)\n\t\t\treturn await this.fetchBatch(actions, db)\n\t\t}\n\t\tconst batchSize = (target.batchSize ?? DEFAULT_BATCH_SIZE) - 1\n\t\tconst batch = batchSize > 0 ? await this.fetchInternal(db, batchSize) : []\n\t\treturn { ok: true, events: [primaryEvent, ...batch], target }\n\t}\n\n\n\tprivate async fetchBackOff(db: Client): Promise<number | undefined> {\n\t\tconst result = await SelectBuilder.create<{ ms: number }>()\n\t\t\t.from('actions_event')\n\t\t\t.match(eventsToProcessStateSpecification)\n\t\t\t.select(it => it.raw('ceil(extract(epoch from visible_at - now()) * 1000)'), 'ms')\n\t\t\t.orderBy('visible_at', 'asc')\n\t\t\t.limit(1)\n\t\t\t.getResult(db)\n\n\t\treturn result.length ? Math.max(0, result[0].ms) : undefined\n\t}\n\n\n\tprivate async fetchInternal(db: Client, limit: number, targetName?: string): Promise<EventRow[]> {\n\t\tconst visibleAt = new Date()\n\t\tvisibleAt.setTime(visibleAt.getTime() + ACK_TIMEOUT_MS)\n\t\treturn await UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.with('events', qb => qb\n\t\t\t\t.select(it => it.raw('*'))\n\t\t\t\t.from('actions_event')\n\t\t\t\t.match(eventsToProcessSpecification)\n\t\t\t\t.where(targetName ? { target: targetName } : {})\n\t\t\t\t.limit(limit)\n\t\t\t\t.lock(LockType.forNoKeyUpdate, LockModifier.skipLocked),\n\t\t\t)\n\t\t\t.values<EventRow>({\n\t\t\t\tstate: 'processing',\n\t\t\t\tlast_state_change: new Date(),\n\t\t\t\tvisible_at: visibleAt,\n\t\t\t})\n\t\t\t.from(it => it.from('events').where(it => it.columnsEq(['events', 'id'], ['actions_event', 'id'])))\n\t\t\t.returning<EventRow>(new Literal('*'))\n\t\t\t.execute(db)\n\t}\n\n\tpublic async persistProcessed(db: Client, events: HandledEvent[]): Promise<[number, number]> {\n\t\treturn await db.transaction(async trx => {\n\t\t\tawait trx.query(Connection.REPEATABLE_READ)\n\t\t\tconst succeed = events.filter(it => it.result.ok)\n\t\t\tawait this.markSucceed(trx, succeed.map(it => it.row))\n\n\t\t\tfor (const event of events) {\n\t\t\t\tif (!event.result.ok) {\n\t\t\t\t\tawait this.markFailed(trx, event)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [succeed.length, events.length - succeed.length]\n\t\t})\n\t}\n\n\tpublic async requeue(db: Client, events: EventRow[]): Promise<void> {\n\t\tawait UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.values<EventRow>({\n\t\t\t\tstate: it => it.raw('CASE WHEN num_retries = 0 THEN ? ELSE ? END', 'created', 'retrying'),\n\t\t\t\tlast_state_change: new Date(),\n\t\t\t\tvisible_at: new Date(),\n\t\t\t})\n\t\t\t.where(it => it.in('id', events.map(it => it.id)))\n\t\t\t.execute(db)\n\t}\n\n\tprivate async markSucceed(db: Client, rows: EventRow[]): Promise<void> {\n\t\tconst now = new Date()\n\t\tawait UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.values<EventRow>({\n\t\t\t\tstate: 'succeed',\n\t\t\t\tnum_retries: it => it.raw('num_retries + 1'),\n\t\t\t\tresolved_at: now,\n\t\t\t\tlast_state_change: now,\n\t\t\t})\n\t\t\t.where(it => it.in('id', rows.map(it => it.id)))\n\t\t\t.execute(db)\n\t}\n\n\tprivate async markFailed(db: Client, event: HandledEvent): Promise<void> {\n\t\tconst numRetries = event.row.num_retries\n\t\tconst now = new Date()\n\t\tconst nextAttempt = new Date()\n\t\tnextAttempt.setTime(nextAttempt.getTime() + (event.target?.initialRepeatIntervalMs ?? DEFAULT_REPEAT_INTERVAL_MS) * Math.pow(2, event.row.num_retries))\n\t\tawait UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.values<EventRow>({\n\t\t\t\tlast_state_change: now,\n\t\t\t\tnum_retries: event.row.num_retries + 1,\n\t\t\t\tlog: JSON.stringify([...event.row.log, event.result]) as any,\n\t\t\t\t...(numRetries < (event.target?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS) ? {\n\t\t\t\t\tstate: 'retrying',\n\t\t\t\t\tvisible_at: nextAttempt,\n\t\t\t\t} : {\n\t\t\t\t\tstate: 'failed',\n\t\t\t\t}),\n\t\t\t})\n\t\t\t.where({ id: event.row.id })\n\t\t\t.execute(db)\n\t}\n\n\tprivate async markFailedOnUnknownTarget(db: Client, targetName: string, primaryEventId: string) {\n\t\tawait UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.where(it => it.or(it => it\n\t\t\t\t.and(it => it\n\t\t\t\t\t.in('state', ['retrying', 'created', 'processing'])\n\t\t\t\t\t.compare('visible_at', Operator.lte, 'now')\n\t\t\t\t\t.compare('target', Operator.eq, targetName),\n\t\t\t\t)\n\t\t\t\t.and(it => it\n\t\t\t\t\t.compare('id', Operator.eq, primaryEventId),\n\t\t\t\t),\n\t\t\t))\n\t\t\t.values<EventRow>({\n\t\t\t\t// intentionally not retrying\n\t\t\t\tlast_state_change: new Date(),\n\t\t\t\tnum_retries: it => it.raw('num_retries + 1'),\n\t\t\t\tlog: it => it.raw('log || ?::jsonb', { ok: false, errorMessage: `Event target ${targetName} not found, stopping.` }),\n\t\t\t\tstate: 'failed',\n\t\t\t\tresolved_at: new Date(),\n\t\t\t})\n\t\t\t.execute(db)\n\t}\n}\n\nexport type FetchBatchResult =\n\t| { ok: true; events: EventRow[]; target: Actions.AnyTarget }\n\t| { ok: false; backoffMs?: number }\n"],"names":["UpdateBuilder","it"],"mappings":"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"}
@@ -1,99 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const Database = require("@contember/database");
4
- const TriggerPayloadPersister = require("../triggers/TriggerPayloadPersister.cjs");
5
- class ProjectDispatcherFactory {
6
- constructor(dispatcher) {
7
- this.dispatcher = dispatcher;
8
- }
9
- create({ db, contentSchemaResolver, projectSlug }) {
10
- return new ProjectDispatcher(this.dispatcher, db, contentSchemaResolver, projectSlug);
11
- }
12
- }
13
- class ProjectDispatcher {
14
- constructor(dispatcher, db, contentSchemaResolver, projectSlug) {
15
- this.dispatcher = dispatcher;
16
- this.db = db;
17
- this.contentSchemaResolver = contentSchemaResolver;
18
- this.projectSlug = projectSlug;
19
- }
20
- async run({ logger, onError, onClose }) {
21
- return await new Promise(async (resolve, reject) => {
22
- let resolvePending = () => {
23
- };
24
- let rejectPending = (e) => {
25
- };
26
- const resolvePendingRef = () => {
27
- resolvePending();
28
- };
29
- let pendingError = void 0;
30
- const rejectPendingRef = (e) => {
31
- pendingError = e;
32
- rejectPending(e);
33
- };
34
- let succeedTotal = 0;
35
- let failedTotal = 0;
36
- let aborted = false;
37
- try {
38
- await this.db.scope(async (db) => {
39
- const listener = await new Database.Listener(db.client, TriggerPayloadPersister.NOTIFY_CHANNEL_NAME, (project) => {
40
- if (project === this.projectSlug) {
41
- resolvePendingRef();
42
- }
43
- }).run({ onError: rejectPendingRef, onClose: resolvePendingRef });
44
- resolve({
45
- end: async () => {
46
- aborted = true;
47
- await listener.end();
48
- logger.info("Worker terminated", {
49
- succeed: succeedTotal,
50
- failed: failedTotal
51
- });
52
- }
53
- });
54
- try {
55
- while (!aborted) {
56
- const { succeed, failed, backoffMs } = await this.dispatcher.processBatch({
57
- db,
58
- contentSchemaResolver: this.contentSchemaResolver,
59
- logger
60
- });
61
- succeedTotal += succeed;
62
- failedTotal += failed;
63
- if (pendingError) {
64
- throw pendingError;
65
- }
66
- if (backoffMs !== 0) {
67
- await new Promise((resolve2, reject2) => {
68
- let cleanup = () => {
69
- };
70
- if (backoffMs !== void 0) {
71
- const timeoutHandle = setTimeout(resolve2, backoffMs);
72
- cleanup = () => clearTimeout(timeoutHandle);
73
- }
74
- resolvePending = () => {
75
- resolve2();
76
- cleanup();
77
- };
78
- rejectPending = (e) => {
79
- reject2(e);
80
- cleanup();
81
- };
82
- });
83
- }
84
- }
85
- onClose?.();
86
- } catch (e) {
87
- await listener.end();
88
- onError(e);
89
- }
90
- });
91
- } catch (e) {
92
- reject(e);
93
- }
94
- });
95
- }
96
- }
97
- exports.ProjectDispatcher = ProjectDispatcher;
98
- exports.ProjectDispatcherFactory = ProjectDispatcherFactory;
99
- //# sourceMappingURL=ProjectDispatcher.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProjectDispatcher.cjs","sources":["../../../../../packages/engine-actions/src/dispatch/ProjectDispatcher.ts"],"sourcesContent":["import { DatabaseContext } from '@contember/engine-system-api'\nimport { EventDispatcher } from './EventDispatcher'\nimport { ContentSchemaResolver } from '@contember/engine-http'\nimport { Runnable, RunnableArgs, Running } from '@contember/engine-common'\nimport { Listener } from '@contember/database'\nimport { NOTIFY_CHANNEL_NAME } from '../triggers/TriggerPayloadPersister'\n\n\nexport class ProjectDispatcherFactory {\n\tconstructor(\n\t\tprivate readonly dispatcher: EventDispatcher,\n\t) {\n\t}\n\n\tpublic create({ db, contentSchemaResolver, projectSlug }: { db: DatabaseContext; contentSchemaResolver: ContentSchemaResolver; projectSlug: string}): ProjectDispatcher {\n\t\treturn new ProjectDispatcher(this.dispatcher, db, contentSchemaResolver, projectSlug)\n\t}\n}\n\n\n\nexport class ProjectDispatcher implements Runnable {\n\tconstructor(\n\t\tprivate readonly dispatcher: EventDispatcher,\n\t\tprivate readonly db: DatabaseContext,\n\t\tprivate readonly contentSchemaResolver: ContentSchemaResolver,\n\t\tprivate readonly projectSlug: string,\n\t) {\n\t}\n\n\tpublic async run({ logger, onError, onClose }: RunnableArgs): Promise<Running> {\n\n\t\treturn await new Promise<Running>(async (resolve, reject) => {\n\n\t\t\tlet resolvePending = () => {}\n\t\t\tlet rejectPending = (e: any) => {}\n\n\t\t\tconst resolvePendingRef = () => {\n\t\t\t\tresolvePending()\n\t\t\t}\n\t\t\tlet pendingError: any = undefined\n\t\t\tconst rejectPendingRef = (e: any) => {\n\t\t\t\tpendingError = e\n\t\t\t\trejectPending(e)\n\t\t\t}\n\n\t\t\tlet succeedTotal = 0\n\t\t\tlet failedTotal = 0\n\t\t\tlet aborted = false\n\n\t\t\ttry {\n\t\t\t\tawait this.db.scope(async db => {\n\t\t\t\t\tconst listener = await new Listener<string>(db.client, NOTIFY_CHANNEL_NAME, project => {\n\t\t\t\t\t\tif (project === this.projectSlug) {\n\t\t\t\t\t\t\tresolvePendingRef()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\t.run({ onError: rejectPendingRef, onClose: resolvePendingRef })\n\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tend: async () => {\n\t\t\t\t\t\t\taborted = true\n\t\t\t\t\t\t\tawait listener.end()\n\t\t\t\t\t\t\tlogger.info('Worker terminated', {\n\t\t\t\t\t\t\t\tsucceed: succeedTotal,\n\t\t\t\t\t\t\t\tfailed: failedTotal,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\twhile (!aborted) {\n\t\t\t\t\t\t\tconst { succeed, failed, backoffMs } = await this.dispatcher.processBatch({\n\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\tcontentSchemaResolver: this.contentSchemaResolver,\n\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tsucceedTotal += succeed\n\t\t\t\t\t\t\tfailedTotal += failed\n\n\t\t\t\t\t\t\t// listener error occurred during batch processing, rethrow\n\t\t\t\t\t\t\tif (pendingError) {\n\t\t\t\t\t\t\t\tthrow pendingError\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// queue is empty, wait\n\t\t\t\t\t\t\tif (backoffMs !== 0) {\n\t\t\t\t\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\t\t\t\t\tlet cleanup = () => {\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (backoffMs !== undefined) {\n\t\t\t\t\t\t\t\t\t\tconst timeoutHandle = setTimeout(resolve, backoffMs)\n\t\t\t\t\t\t\t\t\t\tcleanup = () => clearTimeout(timeoutHandle)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tresolvePending = () => {\n\t\t\t\t\t\t\t\t\t\tresolve()\n\t\t\t\t\t\t\t\t\t\tcleanup()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\trejectPending = e => {\n\t\t\t\t\t\t\t\t\t\treject(e)\n\t\t\t\t\t\t\t\t\t\tcleanup()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonClose?.()\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tawait listener.end()\n\t\t\t\t\t\tonError(e)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t} catch (e) {\n\t\t\t\treject(e)\n\t\t\t}\n \t\t})\n\n\n\t}\n}\n"],"names":["Listener","NOTIFY_CHANNEL_NAME","resolve","reject"],"mappings":";;;;AAQO,MAAM,yBAAyB;AAAA,EACrC,YACkB,YAChB;AADgB,SAAA,aAAA;AAAA,EAAA;AAAA,EAIX,OAAO,EAAE,IAAI,uBAAuB,eAA6H;AACvK,WAAO,IAAI,kBAAkB,KAAK,YAAY,IAAI,uBAAuB,WAAW;AAAA,EAAA;AAEtF;AAIO,MAAM,kBAAsC;AAAA,EAClD,YACkB,YACA,IACA,uBACA,aAChB;AAJgB,SAAA,aAAA;AACA,SAAA,KAAA;AACA,SAAA,wBAAA;AACA,SAAA,cAAA;AAAA,EAAA;AAAA,EAIlB,MAAa,IAAI,EAAE,QAAQ,SAAS,WAA2C;AAE9E,WAAO,MAAM,IAAI,QAAiB,OAAO,SAAS,WAAW;AAE5D,UAAI,iBAAiB,MAAM;AAAA,MAAC;AACxB,UAAA,gBAAgB,CAAC,MAAW;AAAA,MAAC;AAEjC,YAAM,oBAAoB,MAAM;AAChB,uBAAA;AAAA,MAChB;AACA,UAAI,eAAoB;AAClB,YAAA,mBAAmB,CAAC,MAAW;AACrB,uBAAA;AACf,sBAAc,CAAC;AAAA,MAChB;AAEA,UAAI,eAAe;AACnB,UAAI,cAAc;AAClB,UAAI,UAAU;AAEV,UAAA;AACH,cAAM,KAAK,GAAG,MAAM,OAAM,OAAM;AAC/B,gBAAM,WAAW,MAAM,IAAIA,kBAAiB,GAAG,QAAQC,wBAAAA,qBAAqB,CAAW,YAAA;AAClF,gBAAA,YAAY,KAAK,aAAa;AACf,gCAAA;AAAA,YAAA;AAAA,UACnB,CACA,EACC,IAAI,EAAE,SAAS,kBAAkB,SAAS,mBAAmB;AAEvD,kBAAA;AAAA,YACP,KAAK,YAAY;AACN,wBAAA;AACV,oBAAM,SAAS,IAAI;AACnB,qBAAO,KAAK,qBAAqB;AAAA,gBAChC,SAAS;AAAA,gBACT,QAAQ;AAAA,cAAA,CACR;AAAA,YAAA;AAAA,UACF,CACA;AAEG,cAAA;AACH,mBAAO,CAAC,SAAS;AACV,oBAAA,EAAE,SAAS,QAAQ,cAAc,MAAM,KAAK,WAAW,aAAa;AAAA,gBACzE;AAAA,gBACA,uBAAuB,KAAK;AAAA,gBAC5B;AAAA,cAAA,CACA;AACe,8BAAA;AACD,6BAAA;AAGf,kBAAI,cAAc;AACX,sBAAA;AAAA,cAAA;AAIP,kBAAI,cAAc,GAAG;AACpB,sBAAM,IAAI,QAAc,CAACC,UAASC,YAAW;AAC5C,sBAAI,UAAU,MAAM;AAAA,kBACpB;AACA,sBAAI,cAAc,QAAW;AACtB,0BAAA,gBAAgB,WAAWD,UAAS,SAAS;AACzC,8BAAA,MAAM,aAAa,aAAa;AAAA,kBAAA;AAE3C,mCAAiB,MAAM;AACtBA,6BAAQ;AACA,4BAAA;AAAA,kBACT;AACA,kCAAgB,CAAK,MAAA;AACpBC,4BAAO,CAAC;AACA,4BAAA;AAAA,kBACT;AAAA,gBAAA,CACA;AAAA,cAAA;AAAA,YACF;AAES,sBAAA;AAAA,mBACF,GAAG;AACX,kBAAM,SAAS,IAAI;AACnB,oBAAQ,CAAC;AAAA,UAAA;AAAA,QACV,CACA;AAAA,eACO,GAAG;AACX,eAAO,CAAC;AAAA,MAAA;AAAA,IACT,CACC;AAAA,EAAA;AAIJ;;;"}