@contember/engine-actions 2.1.0-alpha.9 → 2.1.0-beta.2

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 (405) hide show
  1. package/CLAUDE.md +47 -0
  2. package/dist/development/index.cjs +54 -24
  3. package/dist/development/index.cjs.map +1 -1
  4. package/dist/development/index.js +54 -24
  5. package/dist/development/index.js.map +1 -1
  6. package/dist/development/src/ActionsExecutionContainerHookFactory.cjs +24 -11
  7. package/dist/development/src/ActionsExecutionContainerHookFactory.cjs.map +1 -1
  8. package/dist/development/src/ActionsExecutionContainerHookFactory.js +24 -11
  9. package/dist/development/src/ActionsExecutionContainerHookFactory.js.map +1 -1
  10. package/dist/development/src/ListenerStoreProvider.cjs.map +1 -1
  11. package/dist/development/src/ListenerStoreProvider.js.map +1 -1
  12. package/dist/development/src/authorization/ActionsAuthorizationActions.cjs +2 -0
  13. package/dist/development/src/authorization/ActionsAuthorizationActions.cjs.map +1 -1
  14. package/dist/development/src/authorization/ActionsAuthorizationActions.js +2 -0
  15. package/dist/development/src/authorization/ActionsAuthorizationActions.js.map +1 -1
  16. package/dist/development/src/authorization/ActionsPermissionsFactory.cjs.map +1 -1
  17. package/dist/development/src/authorization/ActionsPermissionsFactory.js.map +1 -1
  18. package/dist/development/src/dispatch/DispatchWorkerSupervisor.cjs +16 -14
  19. package/dist/development/src/dispatch/DispatchWorkerSupervisor.cjs.map +1 -1
  20. package/dist/development/src/dispatch/DispatchWorkerSupervisor.js +16 -14
  21. package/dist/development/src/dispatch/DispatchWorkerSupervisor.js.map +1 -1
  22. package/dist/development/src/dispatch/EventDispatcher.cjs.map +1 -1
  23. package/dist/development/src/dispatch/EventDispatcher.js.map +1 -1
  24. package/dist/development/src/dispatch/EventsRepository.cjs +33 -15
  25. package/dist/development/src/dispatch/EventsRepository.cjs.map +1 -1
  26. package/dist/development/src/dispatch/EventsRepository.js +33 -15
  27. package/dist/development/src/dispatch/EventsRepository.js.map +1 -1
  28. package/dist/development/src/dispatch/LazyDispatchWorker.cjs +67 -0
  29. package/dist/development/src/dispatch/LazyDispatchWorker.cjs.map +1 -0
  30. package/dist/development/src/dispatch/LazyDispatchWorker.js +67 -0
  31. package/dist/development/src/dispatch/LazyDispatchWorker.js.map +1 -0
  32. package/dist/development/src/dispatch/ProjectDispatcher.cjs +3 -3
  33. package/dist/development/src/dispatch/ProjectDispatcher.cjs.map +1 -1
  34. package/dist/development/src/dispatch/ProjectDispatcher.js +2 -2
  35. package/dist/development/src/dispatch/ProjectDispatcher.js.map +1 -1
  36. package/dist/development/src/dispatch/TargetHandlerResolver.cjs.map +1 -1
  37. package/dist/development/src/dispatch/TargetHandlerResolver.js.map +1 -1
  38. package/dist/development/src/dispatch/WebhookFetcher.cjs.map +1 -1
  39. package/dist/development/src/dispatch/WebhookFetcher.js.map +1 -1
  40. package/dist/development/src/dispatch/WebhookTargetHandler.cjs +6 -1
  41. package/dist/development/src/dispatch/WebhookTargetHandler.cjs.map +1 -1
  42. package/dist/development/src/dispatch/WebhookTargetHandler.js +6 -1
  43. package/dist/development/src/dispatch/WebhookTargetHandler.js.map +1 -1
  44. package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.cjs +1 -0
  45. package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.cjs.map +1 -1
  46. package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.js +1 -0
  47. package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.js.map +1 -1
  48. package/dist/development/src/graphql/http/ActionsContextResolver.cjs +8 -11
  49. package/dist/development/src/graphql/http/ActionsContextResolver.cjs.map +1 -1
  50. package/dist/development/src/graphql/http/ActionsContextResolver.js +8 -11
  51. package/dist/development/src/graphql/http/ActionsContextResolver.js.map +1 -1
  52. package/dist/development/src/graphql/http/ActionsGraphQLHandlerFactory.cjs.map +1 -1
  53. package/dist/development/src/graphql/http/ActionsGraphQLHandlerFactory.js.map +1 -1
  54. package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.cjs +6 -3
  55. package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.cjs.map +1 -1
  56. package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.js +6 -3
  57. package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.js.map +1 -1
  58. package/dist/development/src/graphql/resolvers/ResolversFactory.cjs +7 -2
  59. package/dist/development/src/graphql/resolvers/ResolversFactory.cjs.map +1 -1
  60. package/dist/development/src/graphql/resolvers/ResolversFactory.js +8 -3
  61. package/dist/development/src/graphql/resolvers/ResolversFactory.js.map +1 -1
  62. package/dist/development/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.cjs.map +1 -1
  63. package/dist/development/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js.map +1 -1
  64. package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs +21 -0
  65. package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs.map +1 -0
  66. package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.js +21 -0
  67. package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.js.map +1 -0
  68. package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.cjs.map +1 -1
  69. package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js.map +1 -1
  70. package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs +19 -0
  71. package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs.map +1 -0
  72. package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.js +19 -0
  73. package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.js.map +1 -0
  74. package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.cjs +14 -1
  75. package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +1 -1
  76. package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.js +14 -1
  77. package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -1
  78. package/dist/development/src/graphql/resolvers/query/VariablesQueryResolver.cjs.map +1 -1
  79. package/dist/development/src/graphql/resolvers/query/VariablesQueryResolver.js.map +1 -1
  80. package/dist/development/src/graphql/schema/actions.graphql.cjs +18 -4
  81. package/dist/development/src/graphql/schema/actions.graphql.cjs.map +1 -1
  82. package/dist/development/src/graphql/schema/actions.graphql.js +18 -4
  83. package/dist/development/src/graphql/schema/actions.graphql.js.map +1 -1
  84. package/dist/development/src/migrations/2023-03-10-145000-actions-variables.cjs.map +1 -1
  85. package/dist/development/src/migrations/2023-03-10-145000-actions-variables.js.map +1 -1
  86. package/dist/development/src/migrations/2025-05-28-160000-action-event-user.cjs +16 -0
  87. package/dist/development/src/migrations/2025-05-28-160000-action-event-user.cjs.map +1 -0
  88. package/dist/development/src/migrations/2025-05-28-160000-action-event-user.js +17 -0
  89. package/dist/development/src/migrations/2025-05-28-160000-action-event-user.js.map +1 -0
  90. package/dist/development/src/migrations/index.cjs +3 -1
  91. package/dist/development/src/migrations/index.cjs.map +1 -1
  92. package/dist/development/src/migrations/index.js +3 -1
  93. package/dist/development/src/migrations/index.js.map +1 -1
  94. package/dist/development/src/migrations/snapshot.cjs +5 -2
  95. package/dist/development/src/migrations/snapshot.cjs.map +1 -1
  96. package/dist/development/src/migrations/snapshot.js +5 -2
  97. package/dist/development/src/migrations/snapshot.js.map +1 -1
  98. package/dist/development/src/model/EventByIdQuery.cjs +17 -0
  99. package/dist/development/src/model/EventByIdQuery.cjs.map +1 -0
  100. package/dist/development/src/model/EventByIdQuery.js +17 -0
  101. package/dist/development/src/model/EventByIdQuery.js.map +1 -0
  102. package/dist/development/src/model/EventsInProcessingQuery.cjs.map +1 -1
  103. package/dist/development/src/model/EventsInProcessingQuery.js.map +1 -1
  104. package/dist/development/src/model/EventsToProcessQuery.cjs.map +1 -1
  105. package/dist/development/src/model/EventsToProcessQuery.js.map +1 -1
  106. package/dist/development/src/model/EventsToProcessSpecification.cjs.map +1 -1
  107. package/dist/development/src/model/EventsToProcessSpecification.js.map +1 -1
  108. package/dist/development/src/model/FailedEventsQuery.cjs.map +1 -1
  109. package/dist/development/src/model/FailedEventsQuery.js.map +1 -1
  110. package/dist/development/src/model/SetVariableCommand.cjs.map +1 -1
  111. package/dist/development/src/model/SetVariableCommand.js.map +1 -1
  112. package/dist/development/src/model/VariablesManager.cjs.map +1 -1
  113. package/dist/development/src/model/VariablesManager.js.map +1 -1
  114. package/dist/development/src/model/VariablesQuery.cjs.map +1 -1
  115. package/dist/development/src/model/VariablesQuery.js.map +1 -1
  116. package/dist/development/src/triggers/TriggerHandler.cjs +17 -14
  117. package/dist/development/src/triggers/TriggerHandler.cjs.map +1 -1
  118. package/dist/development/src/triggers/TriggerHandler.js +17 -14
  119. package/dist/development/src/triggers/TriggerHandler.js.map +1 -1
  120. package/dist/development/src/triggers/TriggerIndirectChangesFetcher.cjs +44 -2
  121. package/dist/development/src/triggers/TriggerIndirectChangesFetcher.cjs.map +1 -1
  122. package/dist/development/src/triggers/TriggerIndirectChangesFetcher.js +44 -2
  123. package/dist/development/src/triggers/TriggerIndirectChangesFetcher.js.map +1 -1
  124. package/dist/development/src/triggers/TriggerListenersBuilder.cjs.map +1 -1
  125. package/dist/development/src/triggers/TriggerListenersBuilder.js.map +1 -1
  126. package/dist/development/src/triggers/TriggerListenersFactory.cjs.map +1 -1
  127. package/dist/development/src/triggers/TriggerListenersFactory.js.map +1 -1
  128. package/dist/development/src/triggers/TriggerListenersStore.cjs.map +1 -1
  129. package/dist/development/src/triggers/TriggerListenersStore.js.map +1 -1
  130. package/dist/development/src/triggers/TriggerPayloadBuilder.cjs +45 -16
  131. package/dist/development/src/triggers/TriggerPayloadBuilder.cjs.map +1 -1
  132. package/dist/development/src/triggers/TriggerPayloadBuilder.js +45 -16
  133. package/dist/development/src/triggers/TriggerPayloadBuilder.js.map +1 -1
  134. package/dist/development/src/triggers/TriggerPayloadManager.cjs.map +1 -1
  135. package/dist/development/src/triggers/TriggerPayloadManager.js.map +1 -1
  136. package/dist/development/src/triggers/TriggerPayloadPersister.cjs +36 -20
  137. package/dist/development/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
  138. package/dist/development/src/triggers/TriggerPayloadPersister.js +36 -20
  139. package/dist/development/src/triggers/TriggerPayloadPersister.js.map +1 -1
  140. package/dist/development/src/utils/assertNever.cjs.map +1 -1
  141. package/dist/development/src/utils/assertNever.js.map +1 -1
  142. package/dist/development/src/utils/map.cjs.map +1 -1
  143. package/dist/development/src/utils/map.js.map +1 -1
  144. package/dist/development/src/utils/notifyChannel.cjs +9 -0
  145. package/dist/development/src/utils/notifyChannel.cjs.map +1 -0
  146. package/dist/development/src/utils/notifyChannel.js +9 -0
  147. package/dist/development/src/utils/notifyChannel.js.map +1 -0
  148. package/dist/production/index.cjs +54 -24
  149. package/dist/production/index.cjs.map +1 -1
  150. package/dist/production/index.js +54 -24
  151. package/dist/production/index.js.map +1 -1
  152. package/dist/production/src/ActionsExecutionContainerHookFactory.cjs +24 -11
  153. package/dist/production/src/ActionsExecutionContainerHookFactory.cjs.map +1 -1
  154. package/dist/production/src/ActionsExecutionContainerHookFactory.js +24 -11
  155. package/dist/production/src/ActionsExecutionContainerHookFactory.js.map +1 -1
  156. package/dist/production/src/ListenerStoreProvider.cjs.map +1 -1
  157. package/dist/production/src/ListenerStoreProvider.js.map +1 -1
  158. package/dist/production/src/authorization/ActionsAuthorizationActions.cjs +2 -0
  159. package/dist/production/src/authorization/ActionsAuthorizationActions.cjs.map +1 -1
  160. package/dist/production/src/authorization/ActionsAuthorizationActions.js +2 -0
  161. package/dist/production/src/authorization/ActionsAuthorizationActions.js.map +1 -1
  162. package/dist/production/src/authorization/ActionsPermissionsFactory.cjs.map +1 -1
  163. package/dist/production/src/authorization/ActionsPermissionsFactory.js.map +1 -1
  164. package/dist/production/src/dispatch/DispatchWorkerSupervisor.cjs +16 -14
  165. package/dist/production/src/dispatch/DispatchWorkerSupervisor.cjs.map +1 -1
  166. package/dist/production/src/dispatch/DispatchWorkerSupervisor.js +16 -14
  167. package/dist/production/src/dispatch/DispatchWorkerSupervisor.js.map +1 -1
  168. package/dist/production/src/dispatch/EventDispatcher.cjs.map +1 -1
  169. package/dist/production/src/dispatch/EventDispatcher.js.map +1 -1
  170. package/dist/production/src/dispatch/EventsRepository.cjs +33 -15
  171. package/dist/production/src/dispatch/EventsRepository.cjs.map +1 -1
  172. package/dist/production/src/dispatch/EventsRepository.js +33 -15
  173. package/dist/production/src/dispatch/EventsRepository.js.map +1 -1
  174. package/dist/production/src/dispatch/LazyDispatchWorker.cjs +67 -0
  175. package/dist/production/src/dispatch/LazyDispatchWorker.cjs.map +1 -0
  176. package/dist/production/src/dispatch/LazyDispatchWorker.js +67 -0
  177. package/dist/production/src/dispatch/LazyDispatchWorker.js.map +1 -0
  178. package/dist/production/src/dispatch/ProjectDispatcher.cjs +3 -3
  179. package/dist/production/src/dispatch/ProjectDispatcher.cjs.map +1 -1
  180. package/dist/production/src/dispatch/ProjectDispatcher.js +2 -2
  181. package/dist/production/src/dispatch/ProjectDispatcher.js.map +1 -1
  182. package/dist/production/src/dispatch/TargetHandlerResolver.cjs.map +1 -1
  183. package/dist/production/src/dispatch/TargetHandlerResolver.js.map +1 -1
  184. package/dist/production/src/dispatch/WebhookFetcher.cjs.map +1 -1
  185. package/dist/production/src/dispatch/WebhookFetcher.js.map +1 -1
  186. package/dist/production/src/dispatch/WebhookTargetHandler.cjs +6 -1
  187. package/dist/production/src/dispatch/WebhookTargetHandler.cjs.map +1 -1
  188. package/dist/production/src/dispatch/WebhookTargetHandler.js +6 -1
  189. package/dist/production/src/dispatch/WebhookTargetHandler.js.map +1 -1
  190. package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.cjs +1 -0
  191. package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.cjs.map +1 -1
  192. package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.js +1 -0
  193. package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.js.map +1 -1
  194. package/dist/production/src/graphql/http/ActionsContextResolver.cjs +8 -11
  195. package/dist/production/src/graphql/http/ActionsContextResolver.cjs.map +1 -1
  196. package/dist/production/src/graphql/http/ActionsContextResolver.js +8 -11
  197. package/dist/production/src/graphql/http/ActionsContextResolver.js.map +1 -1
  198. package/dist/production/src/graphql/http/ActionsGraphQLHandlerFactory.cjs.map +1 -1
  199. package/dist/production/src/graphql/http/ActionsGraphQLHandlerFactory.js.map +1 -1
  200. package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.cjs +6 -3
  201. package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.cjs.map +1 -1
  202. package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.js +6 -3
  203. package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.js.map +1 -1
  204. package/dist/production/src/graphql/resolvers/ResolversFactory.cjs +7 -2
  205. package/dist/production/src/graphql/resolvers/ResolversFactory.cjs.map +1 -1
  206. package/dist/production/src/graphql/resolvers/ResolversFactory.js +8 -3
  207. package/dist/production/src/graphql/resolvers/ResolversFactory.js.map +1 -1
  208. package/dist/production/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.cjs.map +1 -1
  209. package/dist/production/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js.map +1 -1
  210. package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs +21 -0
  211. package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs.map +1 -0
  212. package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.js +21 -0
  213. package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.js.map +1 -0
  214. package/dist/production/src/graphql/resolvers/mutation/SetVariablesMutationResolver.cjs.map +1 -1
  215. package/dist/production/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js.map +1 -1
  216. package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs +19 -0
  217. package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs.map +1 -0
  218. package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.js +19 -0
  219. package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.js.map +1 -0
  220. package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.cjs +14 -1
  221. package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +1 -1
  222. package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.js +14 -1
  223. package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -1
  224. package/dist/production/src/graphql/resolvers/query/VariablesQueryResolver.cjs.map +1 -1
  225. package/dist/production/src/graphql/resolvers/query/VariablesQueryResolver.js.map +1 -1
  226. package/dist/production/src/graphql/schema/actions.graphql.cjs +18 -4
  227. package/dist/production/src/graphql/schema/actions.graphql.cjs.map +1 -1
  228. package/dist/production/src/graphql/schema/actions.graphql.js +18 -4
  229. package/dist/production/src/graphql/schema/actions.graphql.js.map +1 -1
  230. package/dist/production/src/migrations/2023-03-10-145000-actions-variables.cjs.map +1 -1
  231. package/dist/production/src/migrations/2023-03-10-145000-actions-variables.js.map +1 -1
  232. package/dist/production/src/migrations/2025-05-28-160000-action-event-user.cjs +16 -0
  233. package/dist/production/src/migrations/2025-05-28-160000-action-event-user.cjs.map +1 -0
  234. package/dist/production/src/migrations/2025-05-28-160000-action-event-user.js +17 -0
  235. package/dist/production/src/migrations/2025-05-28-160000-action-event-user.js.map +1 -0
  236. package/dist/production/src/migrations/index.cjs +3 -1
  237. package/dist/production/src/migrations/index.cjs.map +1 -1
  238. package/dist/production/src/migrations/index.js +3 -1
  239. package/dist/production/src/migrations/index.js.map +1 -1
  240. package/dist/production/src/migrations/snapshot.cjs +5 -2
  241. package/dist/production/src/migrations/snapshot.cjs.map +1 -1
  242. package/dist/production/src/migrations/snapshot.js +5 -2
  243. package/dist/production/src/migrations/snapshot.js.map +1 -1
  244. package/dist/production/src/model/EventByIdQuery.cjs +17 -0
  245. package/dist/production/src/model/EventByIdQuery.cjs.map +1 -0
  246. package/dist/production/src/model/EventByIdQuery.js +17 -0
  247. package/dist/production/src/model/EventByIdQuery.js.map +1 -0
  248. package/dist/production/src/model/EventsInProcessingQuery.cjs.map +1 -1
  249. package/dist/production/src/model/EventsInProcessingQuery.js.map +1 -1
  250. package/dist/production/src/model/EventsToProcessQuery.cjs.map +1 -1
  251. package/dist/production/src/model/EventsToProcessQuery.js.map +1 -1
  252. package/dist/production/src/model/EventsToProcessSpecification.cjs.map +1 -1
  253. package/dist/production/src/model/EventsToProcessSpecification.js.map +1 -1
  254. package/dist/production/src/model/FailedEventsQuery.cjs.map +1 -1
  255. package/dist/production/src/model/FailedEventsQuery.js.map +1 -1
  256. package/dist/production/src/model/SetVariableCommand.cjs.map +1 -1
  257. package/dist/production/src/model/SetVariableCommand.js.map +1 -1
  258. package/dist/production/src/model/VariablesManager.cjs.map +1 -1
  259. package/dist/production/src/model/VariablesManager.js.map +1 -1
  260. package/dist/production/src/model/VariablesQuery.cjs.map +1 -1
  261. package/dist/production/src/model/VariablesQuery.js.map +1 -1
  262. package/dist/production/src/triggers/TriggerHandler.cjs +17 -14
  263. package/dist/production/src/triggers/TriggerHandler.cjs.map +1 -1
  264. package/dist/production/src/triggers/TriggerHandler.js +17 -14
  265. package/dist/production/src/triggers/TriggerHandler.js.map +1 -1
  266. package/dist/production/src/triggers/TriggerIndirectChangesFetcher.cjs +44 -2
  267. package/dist/production/src/triggers/TriggerIndirectChangesFetcher.cjs.map +1 -1
  268. package/dist/production/src/triggers/TriggerIndirectChangesFetcher.js +44 -2
  269. package/dist/production/src/triggers/TriggerIndirectChangesFetcher.js.map +1 -1
  270. package/dist/production/src/triggers/TriggerListenersBuilder.cjs.map +1 -1
  271. package/dist/production/src/triggers/TriggerListenersBuilder.js.map +1 -1
  272. package/dist/production/src/triggers/TriggerListenersFactory.cjs.map +1 -1
  273. package/dist/production/src/triggers/TriggerListenersFactory.js.map +1 -1
  274. package/dist/production/src/triggers/TriggerListenersStore.cjs.map +1 -1
  275. package/dist/production/src/triggers/TriggerListenersStore.js.map +1 -1
  276. package/dist/production/src/triggers/TriggerPayloadBuilder.cjs +45 -16
  277. package/dist/production/src/triggers/TriggerPayloadBuilder.cjs.map +1 -1
  278. package/dist/production/src/triggers/TriggerPayloadBuilder.js +45 -16
  279. package/dist/production/src/triggers/TriggerPayloadBuilder.js.map +1 -1
  280. package/dist/production/src/triggers/TriggerPayloadManager.cjs.map +1 -1
  281. package/dist/production/src/triggers/TriggerPayloadManager.js.map +1 -1
  282. package/dist/production/src/triggers/TriggerPayloadPersister.cjs +36 -20
  283. package/dist/production/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
  284. package/dist/production/src/triggers/TriggerPayloadPersister.js +36 -20
  285. package/dist/production/src/triggers/TriggerPayloadPersister.js.map +1 -1
  286. package/dist/production/src/utils/assertNever.cjs.map +1 -1
  287. package/dist/production/src/utils/assertNever.js.map +1 -1
  288. package/dist/production/src/utils/map.cjs.map +1 -1
  289. package/dist/production/src/utils/map.js.map +1 -1
  290. package/dist/production/src/utils/notifyChannel.cjs +9 -0
  291. package/dist/production/src/utils/notifyChannel.cjs.map +1 -0
  292. package/dist/production/src/utils/notifyChannel.js +9 -0
  293. package/dist/production/src/utils/notifyChannel.js.map +1 -0
  294. package/dist/tests/cases/unit/lazyDispatchWorker.test.d.ts +2 -0
  295. package/dist/tests/cases/unit/lazyDispatchWorker.test.d.ts.map +1 -0
  296. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  297. package/dist/types/ActionsExecutionContainerHookFactory.d.ts.map +1 -1
  298. package/dist/types/authorization/ActionsAuthorizationActions.d.ts +10 -0
  299. package/dist/types/authorization/ActionsAuthorizationActions.d.ts.map +1 -1
  300. package/dist/types/dispatch/DispatchWorkerSupervisor.d.ts.map +1 -1
  301. package/dist/types/dispatch/EventDispatcher.d.ts.map +1 -1
  302. package/dist/types/dispatch/EventsRepository.d.ts +2 -1
  303. package/dist/types/dispatch/EventsRepository.d.ts.map +1 -1
  304. package/dist/types/dispatch/LazyDispatchWorker.d.ts +11 -0
  305. package/dist/types/dispatch/LazyDispatchWorker.d.ts.map +1 -0
  306. package/dist/types/dispatch/ProjectDispatcher.d.ts.map +1 -1
  307. package/dist/types/dispatch/WebhookTargetHandler.d.ts.map +1 -1
  308. package/dist/types/dispatch/types.d.ts +1 -1
  309. package/dist/types/dispatch/types.d.ts.map +1 -1
  310. package/dist/types/graphql/http/ActionsApiMiddlewareFactory.d.ts.map +1 -1
  311. package/dist/types/graphql/http/ActionsContextResolver.d.ts.map +1 -1
  312. package/dist/types/graphql/http/ActionsGraphQLHandlerFactory.d.ts.map +1 -1
  313. package/dist/types/graphql/http/ActionsWebsocketControllerFactory.d.ts.map +1 -1
  314. package/dist/types/graphql/resolvers/ActionsContext.d.ts +3 -0
  315. package/dist/types/graphql/resolvers/ActionsContext.d.ts.map +1 -1
  316. package/dist/types/graphql/resolvers/ResolversFactory.d.ts +4 -2
  317. package/dist/types/graphql/resolvers/ResolversFactory.d.ts.map +1 -1
  318. package/dist/types/graphql/resolvers/mutation/RetryEventMutationResolver.d.ts +11 -0
  319. package/dist/types/graphql/resolvers/mutation/RetryEventMutationResolver.d.ts.map +1 -0
  320. package/dist/types/graphql/resolvers/mutation/SetVariablesMutationResolver.d.ts.map +1 -1
  321. package/dist/types/graphql/resolvers/mutation/StopEventMutationResolver.d.ts +11 -0
  322. package/dist/types/graphql/resolvers/mutation/StopEventMutationResolver.d.ts.map +1 -0
  323. package/dist/types/graphql/resolvers/mutation/index.d.ts +2 -0
  324. package/dist/types/graphql/resolvers/mutation/index.d.ts.map +1 -1
  325. package/dist/types/graphql/resolvers/query/EventsQueryResolver.d.ts +3 -0
  326. package/dist/types/graphql/resolvers/query/EventsQueryResolver.d.ts.map +1 -1
  327. package/dist/types/graphql/resolvers/query/VariablesQueryResolver.d.ts.map +1 -1
  328. package/dist/types/graphql/schema/actions.graphql.d.ts.map +1 -1
  329. package/dist/types/graphql/schema/index.d.ts +45 -2
  330. package/dist/types/graphql/schema/index.d.ts.map +1 -1
  331. package/dist/types/index.d.ts +1 -1
  332. package/dist/types/index.d.ts.map +1 -1
  333. package/dist/types/migrations/2023-03-10-145000-actions-variables.d.ts.map +1 -1
  334. package/dist/types/migrations/2025-05-28-160000-action-event-user.d.ts +3 -0
  335. package/dist/types/migrations/2025-05-28-160000-action-event-user.d.ts.map +1 -0
  336. package/dist/types/migrations/index.d.ts.map +1 -1
  337. package/dist/types/migrations/snapshot.d.ts.map +1 -1
  338. package/dist/types/model/EventByIdQuery.d.ts +8 -0
  339. package/dist/types/model/EventByIdQuery.d.ts.map +1 -0
  340. package/dist/types/model/EventsToProcessSpecification.d.ts.map +1 -1
  341. package/dist/types/model/SetVariableCommand.d.ts.map +1 -1
  342. package/dist/types/model/types.d.ts +3 -0
  343. package/dist/types/model/types.d.ts.map +1 -1
  344. package/dist/types/triggers/TriggerHandler.d.ts.map +1 -1
  345. package/dist/types/triggers/TriggerIndirectChangesFetcher.d.ts +11 -3
  346. package/dist/types/triggers/TriggerIndirectChangesFetcher.d.ts.map +1 -1
  347. package/dist/types/triggers/TriggerListeners.d.ts.map +1 -1
  348. package/dist/types/triggers/TriggerListenersBuilder.d.ts.map +1 -1
  349. package/dist/types/triggers/TriggerListenersStore.d.ts +2 -2
  350. package/dist/types/triggers/TriggerListenersStore.d.ts.map +1 -1
  351. package/dist/types/triggers/TriggerPayloadBuilder.d.ts.map +1 -1
  352. package/dist/types/triggers/TriggerPayloadManager.d.ts +2 -1
  353. package/dist/types/triggers/TriggerPayloadManager.d.ts.map +1 -1
  354. package/dist/types/triggers/TriggerPayloadPersister.d.ts +9 -4
  355. package/dist/types/triggers/TriggerPayloadPersister.d.ts.map +1 -1
  356. package/dist/types/tsconfig.tsbuildinfo +1 -1
  357. package/dist/types/utils/notifyChannel.d.ts +4 -0
  358. package/dist/types/utils/notifyChannel.d.ts.map +1 -0
  359. package/graphql.codegen.yml +2 -2
  360. package/package.json +26 -21
  361. package/src/ActionsExecutionContainerHookFactory.ts +27 -11
  362. package/src/authorization/ActionsAuthorizationActions.ts +2 -0
  363. package/src/dispatch/DispatchWorkerSupervisor.ts +17 -16
  364. package/src/dispatch/EventDispatcher.ts +0 -2
  365. package/src/dispatch/EventsRepository.ts +63 -43
  366. package/src/dispatch/LazyDispatchWorker.ts +72 -0
  367. package/src/dispatch/ProjectDispatcher.ts +6 -11
  368. package/src/dispatch/WebhookTargetHandler.ts +18 -9
  369. package/src/dispatch/types.ts +1 -2
  370. package/src/graphql/http/ActionsApiMiddlewareFactory.ts +7 -5
  371. package/src/graphql/http/ActionsContextResolver.ts +1 -2
  372. package/src/graphql/http/ActionsGraphQLHandlerFactory.ts +0 -1
  373. package/src/graphql/http/ActionsWebsocketControllerFactory.ts +7 -5
  374. package/src/graphql/resolvers/ActionsContext.ts +1 -0
  375. package/src/graphql/resolvers/ResolversFactory.ts +9 -2
  376. package/src/graphql/resolvers/mutation/RetryEventMutationResolver.ts +22 -0
  377. package/src/graphql/resolvers/mutation/SetVariablesMutationResolver.ts +0 -1
  378. package/src/graphql/resolvers/mutation/StopEventMutationResolver.ts +19 -0
  379. package/src/graphql/resolvers/mutation/index.ts +2 -0
  380. package/src/graphql/resolvers/query/EventsQueryResolver.ts +15 -8
  381. package/src/graphql/resolvers/query/VariablesQueryResolver.ts +0 -1
  382. package/src/graphql/schema/actions.graphql.ts +18 -4
  383. package/src/graphql/schema/index.ts +84 -30
  384. package/src/index.ts +66 -35
  385. package/src/migrations/2023-03-10-145000-actions-variables.ts +1 -1
  386. package/src/migrations/2025-05-28-160000-action-event-user.ts +16 -0
  387. package/src/migrations/index.ts +2 -0
  388. package/src/migrations/snapshot.ts +6 -3
  389. package/src/model/EventByIdQuery.ts +21 -0
  390. package/src/model/EventsToProcessSpecification.ts +9 -8
  391. package/src/model/SetVariableCommand.ts +0 -1
  392. package/src/model/types.ts +3 -0
  393. package/src/triggers/TriggerHandler.ts +16 -15
  394. package/src/triggers/TriggerIndirectChangesFetcher.ts +62 -3
  395. package/src/triggers/TriggerListeners.ts +1 -8
  396. package/src/triggers/TriggerListenersBuilder.ts +3 -6
  397. package/src/triggers/TriggerListenersStore.ts +2 -2
  398. package/src/triggers/TriggerPayloadBuilder.ts +43 -13
  399. package/src/triggers/TriggerPayloadManager.ts +2 -4
  400. package/src/triggers/TriggerPayloadPersister.ts +28 -10
  401. package/src/utils/notifyChannel.ts +6 -0
  402. package/tests/cases/unit/generator.test.ts +133 -136
  403. package/tests/cases/unit/lazyDispatchWorker.test.ts +226 -0
  404. package/tests/cases/unit/webhookHandler.test.ts +47 -35
  405. package/vitest.config.ts +0 -3
@@ -0,0 +1,4 @@
1
+ import { Client } from '@contember/database';
2
+ export declare const NOTIFY_CHANNEL_NAME = "actions_event";
3
+ export declare const notify: (db: Client, projectSlug: string) => Promise<void>;
4
+ //# sourceMappingURL=notifyChannel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifyChannel.d.ts","sourceRoot":"","sources":["../../../src/utils/notifyChannel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE5C,eAAO,MAAM,mBAAmB,kBAAkB,CAAA;AAClD,eAAO,MAAM,MAAM,GAAU,IAAI,MAAM,EAAE,aAAa,MAAM,kBAE3D,CAAA"}
@@ -10,7 +10,7 @@ generates:
10
10
  enumsAsTypes: "1"
11
11
  scalars:
12
12
  DateTime: Date
13
- Uuid: String
13
+ Uuid: string
14
14
  Json: any
15
15
  plugins:
16
16
  - "typescript"
@@ -18,4 +18,4 @@ generates:
18
18
  - "typescript-resolvers"
19
19
  hooks:
20
20
  afterAllFileWrite:
21
- - yarn run -T eslint --fix
21
+ - bunx biome lint --write
package/package.json CHANGED
@@ -22,32 +22,37 @@
22
22
  }
23
23
  },
24
24
  "dependencies": {
25
- "@contember/authorization": "2.1.0-alpha.9",
26
- "@contember/database": "2.1.0-alpha.9",
27
- "@contember/database-migrations": "2.1.0-alpha.9",
28
- "@contember/engine-common": "2.1.0-alpha.9",
29
- "@contember/engine-content-api": "2.1.0-alpha.9",
30
- "@contember/engine-http": "2.1.0-alpha.9",
31
- "@contember/engine-plugins": "2.1.0-alpha.9",
32
- "@contember/engine-system-api": "2.1.0-alpha.9",
33
- "@contember/engine-tenant-api": "2.1.0-alpha.9",
34
- "@contember/graphql-utils": "2.1.0-alpha.9",
35
- "@contember/logger": "2.1.0-alpha.9",
36
- "@contember/schema": "2.1.0-alpha.9",
37
- "@contember/schema-utils": "2.1.0-alpha.9",
38
- "@contember/typesafe": "2.1.0-alpha.9",
39
- "@graphql-tools/schema": "^10.0.7",
25
+ "@contember/authorization": "2.1.0-beta.1",
26
+ "@contember/database": "2.1.0-beta.1",
27
+ "@contember/database-migrations": "2.1.0-beta.1",
28
+ "@contember/engine-common": "2.1.0-beta.1",
29
+ "@contember/engine-content-api": "2.1.0-beta.1",
30
+ "@contember/engine-http": "2.1.0-beta.1",
31
+ "@contember/engine-plugins": "2.1.0-beta.1",
32
+ "@contember/engine-system-api": "2.1.0-beta.1",
33
+ "@contember/engine-tenant-api": "2.1.0-beta.1",
34
+ "@contember/graphql-utils": "2.1.0-beta.1",
35
+ "@contember/logger": "2.1.0-beta.1",
36
+ "@contember/schema": "2.1.0-beta.1",
37
+ "@contember/schema-utils": "2.1.0-beta.1",
38
+ "@contember/typesafe": "2.1.0-beta.1",
39
+ "@graphql-tools/schema": "^10.0.31",
40
40
  "graphql-tag": "^2.12.6"
41
41
  },
42
42
  "devDependencies": {
43
- "@types/bun": "^1.1.10",
44
- "@types/ws": "^8.5.12",
45
- "graphql": "^16.9.0"
43
+ "@types/bun": "^1.3.10",
44
+ "@types/ws": "^8.18.1",
45
+ "graphql": "^16.13.1"
46
46
  },
47
47
  "peerDependencies": {
48
- "graphql": ">= 14.6.0",
49
- "pg": "^8.5.0"
48
+ "graphql": "^16.13.1",
49
+ "pg": "^8.20.0"
50
50
  },
51
51
  "type": "module",
52
- "version": "2.1.0-alpha.9"
52
+ "version": "2.1.0-beta.2",
53
+ "repository": {
54
+ "type": "git",
55
+ "url": "git+https://github.com/contember/contember.git",
56
+ "directory": "packages/engine-actions"
57
+ }
53
58
  }
@@ -12,17 +12,33 @@ export class ActionsExecutionContainerHookFactory {
12
12
 
13
13
  create(): ExecutionContainerHook {
14
14
  return builder => {
15
- return builder.setupService('mapperFactory', (mapperFactory, { whereBuilder, schema, pathFactory, systemSchema, providers, stage, project, schemaMeta }) => {
16
- mapperFactory.hooks.push(mapper => {
17
- const triggerPayloadPersister = new TriggerPayloadPersister(mapper, mapper.db.forSchema(systemSchema), providers, project.slug, stage.id, schemaMeta.id)
18
- const triggerPayloadBuilder = new TriggerPayloadBuilder(mapper)
19
- const payloadManager = new TriggerPayloadManager(triggerPayloadBuilder, triggerPayloadPersister)
20
- const changesFetcher = new TriggerIndirectChangesFetcher(mapper, whereBuilder, pathFactory)
21
- const listenersStore = this.listenerStoreProvider.getListenerStore(schema)
22
- const triggerHandler = new TriggerHandler(payloadManager, listenersStore, changesFetcher)
23
- triggerHandler.attach(mapper.eventManager)
24
- })
25
- })
15
+ return builder.setupService(
16
+ 'mapperFactory',
17
+ (
18
+ mapperFactory,
19
+ { whereBuilder, schema, pathFactory, systemSchema, providers, stage, project, schemaMeta, joinBuilder, userInfo, triggeredActionsCollector },
20
+ ) => {
21
+ mapperFactory.hooks.push(mapper => {
22
+ const triggerPayloadPersister = new TriggerPayloadPersister(
23
+ mapper,
24
+ mapper.db.forSchema(systemSchema),
25
+ providers,
26
+ project.slug,
27
+ stage.id,
28
+ schemaMeta.id,
29
+ mapper.identityId,
30
+ userInfo,
31
+ triggeredActionsCollector,
32
+ )
33
+ const triggerPayloadBuilder = new TriggerPayloadBuilder(mapper)
34
+ const payloadManager = new TriggerPayloadManager(triggerPayloadBuilder, triggerPayloadPersister)
35
+ const changesFetcher = new TriggerIndirectChangesFetcher(schema.model, mapper, whereBuilder, joinBuilder, pathFactory)
36
+ const listenersStore = this.listenerStoreProvider.getListenerStore(schema)
37
+ const triggerHandler = new TriggerHandler(payloadManager, listenersStore, changesFetcher)
38
+ triggerHandler.attach(mapper.eventManager)
39
+ })
40
+ },
41
+ )
26
42
  }
27
43
  }
28
44
  }
@@ -11,4 +11,6 @@ export namespace ActionsAuthorizationActions {
11
11
 
12
12
  export const EVENTS_VIEW = Authorizator.createAction(Resources.events, 'view')
13
13
  export const EVENTS_PROCESS = Authorizator.createAction(Resources.events, 'process')
14
+ export const EVENTS_RETRY = Authorizator.createAction(Resources.events, 'retry')
15
+ export const EVENTS_STOP = Authorizator.createAction(Resources.events, 'stop')
14
16
  }
@@ -6,7 +6,6 @@ import { Logger } from '@contember/logger'
6
6
  import { ImplementationException } from '../ImplementationException'
7
7
 
8
8
  export class DispatchWorkerSupervisorFactory {
9
-
10
9
  constructor(
11
10
  private projectDispatcherFactory: ProjectDispatcherFactory,
12
11
  ) {
@@ -74,21 +73,23 @@ export class DispatchWorkerSupervisor implements Runnable {
74
73
  throw e
75
74
  }
76
75
  }
77
- const projectTracker = new Supervisor(new AcquiringListener(
78
- tenantContainer.databaseContext.client,
79
- 'project_updated',
80
- async () => {
81
- logger.debug('Project config change detected, reloading dispatch workers')
82
- await endProjectWorkers()
83
- try {
84
- await startWorkers(true)
85
- } catch (e) {
86
- logger.error(e, { message: 'Dispatch workers reload failed, terminating' })
87
- await endAll()
88
- onError(e)
89
- }
90
- },
91
- ))
76
+ const projectTracker = new Supervisor(
77
+ new AcquiringListener(
78
+ tenantContainer.databaseContext.client,
79
+ 'project_updated',
80
+ async () => {
81
+ logger.debug('Project config change detected, reloading dispatch workers')
82
+ await endProjectWorkers()
83
+ try {
84
+ await startWorkers(true)
85
+ } catch (e) {
86
+ logger.error(e, { message: 'Dispatch workers reload failed, terminating' })
87
+ await endAll()
88
+ onError(e)
89
+ }
90
+ },
91
+ ),
92
+ )
92
93
 
93
94
  const runningProjectTracker = await projectTracker.run({
94
95
  logger,
@@ -6,7 +6,6 @@ import { ContentSchemaResolver } from '@contember/engine-http'
6
6
  import { DatabaseContext } from '@contember/engine-system-api'
7
7
  import { VariablesManager } from '../model/VariablesManager'
8
8
 
9
-
10
9
  type ProcessBatchArgs = {
11
10
  db: DatabaseContext
12
11
  contentSchemaResolver: ContentSchemaResolver
@@ -20,7 +19,6 @@ type ProcessBatchResult = {
20
19
  }
21
20
 
22
21
  export class EventDispatcher {
23
-
24
22
  constructor(
25
23
  private readonly eventsRepository: EventsRepository,
26
24
  private readonly variablesManager: VariablesManager,
@@ -1,17 +1,8 @@
1
- import {
2
- Client,
3
- Connection,
4
- Literal,
5
- LockModifier,
6
- LockType,
7
- Operator,
8
- SelectBuilder,
9
- UpdateBuilder,
10
- } from '@contember/database'
1
+ import { Client, Connection, Literal, LockModifier, LockType, Operator, SelectBuilder, UpdateBuilder } from '@contember/database'
11
2
  import { EventRow, HandledEvent } from './types'
12
3
  import { Actions } from '@contember/schema'
13
4
  import { eventsToProcessSpecification, eventsToProcessStateSpecification } from '../model/EventsToProcessSpecification'
14
-
5
+ import { notify } from '../utils/notifyChannel'
15
6
 
16
7
  const ACK_TIMEOUT_MS = 1_000 * 60 * 10 // 10 minutes
17
8
  const DEFAULT_REPEAT_INTERVAL_MS = 5_000 // 5 seconds
@@ -19,7 +10,6 @@ const DEFAULT_MAX_ATTEMPTS = 10
19
10
  const DEFAULT_BATCH_SIZE = 1
20
11
 
21
12
  export class EventsRepository {
22
-
23
13
  public async fetchBatch(actions: Actions.Schema, db: Client): Promise<FetchBatchResult> {
24
14
  const primaryEvent = (await this.fetchInternal(db, 1))[0]
25
15
  if (!primaryEvent) {
@@ -35,7 +25,6 @@ export class EventsRepository {
35
25
  return { ok: true, events: [primaryEvent, ...batch], target }
36
26
  }
37
27
 
38
-
39
28
  private async fetchBackOff(db: Client): Promise<number | undefined> {
40
29
  const result = await SelectBuilder.create<{ ms: number }>()
41
30
  .from('actions_event')
@@ -48,20 +37,19 @@ export class EventsRepository {
48
37
  return result.length ? Math.max(0, result[0].ms) : undefined
49
38
  }
50
39
 
51
-
52
40
  private async fetchInternal(db: Client, limit: number, targetName?: string): Promise<EventRow[]> {
53
41
  const visibleAt = new Date()
54
42
  visibleAt.setTime(visibleAt.getTime() + ACK_TIMEOUT_MS)
55
43
  return await UpdateBuilder.create()
56
44
  .table('actions_event')
57
- .with('events', qb => qb
58
- .select(it => it.raw('*'))
59
- .from('actions_event')
60
- .match(eventsToProcessSpecification)
61
- .where(targetName ? { target: targetName } : {})
62
- .limit(limit)
63
- .lock(LockType.forNoKeyUpdate, LockModifier.skipLocked),
64
- )
45
+ .with('events', qb =>
46
+ qb
47
+ .select(it => it.raw('*'))
48
+ .from('actions_event')
49
+ .match(eventsToProcessSpecification)
50
+ .where(targetName ? { target: targetName } : {})
51
+ .limit(limit)
52
+ .lock(LockType.forNoKeyUpdate, LockModifier.skipLocked))
65
53
  .values<EventRow>({
66
54
  state: 'processing',
67
55
  last_state_change: new Date(),
@@ -87,15 +75,38 @@ export class EventsRepository {
87
75
  })
88
76
  }
89
77
 
90
- public async requeue(db: Client, events: EventRow[]): Promise<void> {
78
+ public async requeue(db: Client, events: string[]): Promise<void> {
91
79
  await UpdateBuilder.create()
92
80
  .table('actions_event')
93
81
  .values<EventRow>({
94
- state: it => it.raw('CASE WHEN num_retries = 0 THEN ? ELSE ? END', 'created', 'retrying'),
82
+ state: it =>
83
+ it.raw(
84
+ `
85
+ CASE
86
+ WHEN num_retries = 0 THEN
87
+ ?::__SCHEMA__.actions_trigger_state
88
+ ELSE
89
+ ?::__SCHEMA__.actions_trigger_state END
90
+ `,
91
+ 'created',
92
+ 'retrying',
93
+ ),
95
94
  last_state_change: new Date(),
96
95
  visible_at: new Date(),
97
96
  })
98
- .where(it => it.in('id', events.map(it => it.id)))
97
+ .where(it => it.in('id', events))
98
+ .execute(db)
99
+ }
100
+
101
+ public async markStopped(db: Client, events: string[]): Promise<void> {
102
+ await UpdateBuilder.create()
103
+ .table('actions_event')
104
+ .values<EventRow>({
105
+ state: 'stopped',
106
+ last_state_change: new Date(),
107
+ resolved_at: new Date(),
108
+ })
109
+ .where(it => it.in('id', events))
99
110
  .execute(db)
100
111
  }
101
112
 
@@ -114,22 +125,26 @@ export class EventsRepository {
114
125
  }
115
126
 
116
127
  private async markFailed(db: Client, event: HandledEvent): Promise<void> {
117
- const numRetries = event.row.num_retries
128
+ const numRetries = event.row.num_retries + 1
118
129
  const now = new Date()
119
130
  const nextAttempt = new Date()
120
- nextAttempt.setTime(nextAttempt.getTime() + (event.target?.initialRepeatIntervalMs ?? DEFAULT_REPEAT_INTERVAL_MS) * Math.pow(2, event.row.num_retries))
131
+ nextAttempt.setTime(
132
+ nextAttempt.getTime() + (event.target?.initialRepeatIntervalMs ?? DEFAULT_REPEAT_INTERVAL_MS) * Math.pow(2, event.row.num_retries),
133
+ )
121
134
  await UpdateBuilder.create()
122
135
  .table('actions_event')
123
136
  .values<EventRow>({
124
137
  last_state_change: now,
125
- num_retries: event.row.num_retries + 1,
138
+ num_retries: numRetries,
126
139
  log: JSON.stringify([...event.row.log, event.result]) as any,
127
- ...(numRetries < (event.target?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS) ? {
128
- state: 'retrying',
129
- visible_at: nextAttempt,
130
- } : {
131
- state: 'failed',
132
- }),
140
+ ...(numRetries < (event.target?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS)
141
+ ? {
142
+ state: 'retrying',
143
+ visible_at: nextAttempt,
144
+ }
145
+ : {
146
+ state: 'failed',
147
+ }),
133
148
  })
134
149
  .where({ id: event.row.id })
135
150
  .execute(db)
@@ -138,16 +153,21 @@ export class EventsRepository {
138
153
  private async markFailedOnUnknownTarget(db: Client, targetName: string, primaryEventId: string) {
139
154
  await UpdateBuilder.create()
140
155
  .table('actions_event')
141
- .where(it => it.or(it => it
142
- .and(it => it
143
- .in('state', ['retrying', 'created', 'processing'])
144
- .compare('visible_at', Operator.lte, 'now')
145
- .compare('target', Operator.eq, targetName),
156
+ .where(it =>
157
+ it.or(it =>
158
+ it
159
+ .and(it =>
160
+ it
161
+ .in('state', ['retrying', 'created', 'processing'])
162
+ .compare('visible_at', Operator.lte, 'now')
163
+ .compare('target', Operator.eq, targetName)
164
+ )
165
+ .and(it =>
166
+ it
167
+ .compare('id', Operator.eq, primaryEventId)
168
+ )
146
169
  )
147
- .and(it => it
148
- .compare('id', Operator.eq, primaryEventId),
149
- ),
150
- ))
170
+ )
151
171
  .values<EventRow>({
152
172
  // intentionally not retrying
153
173
  last_state_change: new Date(),
@@ -0,0 +1,72 @@
1
+ import { Runnable, RunnableArgs, Running, Supervisor, SupervisorOptions } from '@contember/engine-common'
2
+ import { ProjectGroupContainerResolver } from '@contember/engine-http'
3
+ import { DispatchWorkerSupervisorFactory } from './DispatchWorkerSupervisor'
4
+
5
+ export class LazyDispatchWorker implements Runnable {
6
+ constructor(
7
+ private readonly projectGroupContainerResolver: ProjectGroupContainerResolver,
8
+ private readonly supervisorFactory: DispatchWorkerSupervisorFactory,
9
+ private readonly supervisorOptions: SupervisorOptions = { startupMax: 10 },
10
+ ) {
11
+ }
12
+
13
+ public async run({ logger, onError }: RunnableArgs): Promise<Running> {
14
+ const running = new Map<string | undefined, Promise<Running | undefined>>()
15
+ let aborted = false
16
+
17
+ const unlisten = this.projectGroupContainerResolver.on('create', ({ container, slug }) => {
18
+ const groupLabel = slug ?? '<default>'
19
+ const childLogger = logger.child({ projectGroup: groupLabel })
20
+ childLogger.debug(`Starting dispatch worker for project group ${groupLabel}`)
21
+
22
+ const supervised = new Supervisor(
23
+ this.supervisorFactory.create(container),
24
+ this.supervisorOptions,
25
+ )
26
+ const runningPromise: Promise<Running | undefined> = supervised.run({
27
+ logger: childLogger,
28
+ onError: e => {
29
+ if (aborted) {
30
+ return
31
+ }
32
+ childLogger.error(e, { message: `Dispatch worker for project group ${groupLabel} crashed` })
33
+ onError(e)
34
+ },
35
+ }).catch(e => {
36
+ if (!aborted) {
37
+ childLogger.error(e, { message: `Failed to start dispatch worker for project group ${groupLabel}` })
38
+ onError(e)
39
+ }
40
+ return undefined
41
+ })
42
+ running.set(slug, runningPromise)
43
+
44
+ return () => {
45
+ running.delete(slug)
46
+ ;(async () => {
47
+ try {
48
+ const r = await runningPromise
49
+ await r?.end()
50
+ } catch {
51
+ }
52
+ })()
53
+ }
54
+ })
55
+
56
+ return {
57
+ end: async () => {
58
+ aborted = true
59
+ unlisten()
60
+ const all = [...running.values()]
61
+ running.clear()
62
+ await Promise.allSettled(all.map(async p => {
63
+ try {
64
+ const r = await p
65
+ await r?.end()
66
+ } catch {
67
+ }
68
+ }))
69
+ },
70
+ }
71
+ }
72
+ }
@@ -3,8 +3,7 @@ import { EventDispatcher } from './EventDispatcher'
3
3
  import { ContentSchemaResolver } from '@contember/engine-http'
4
4
  import { Runnable, RunnableArgs, Running } from '@contember/engine-common'
5
5
  import { Listener } from '@contember/database'
6
- import { NOTIFY_CHANNEL_NAME } from '../triggers/TriggerPayloadPersister'
7
-
6
+ import { NOTIFY_CHANNEL_NAME } from '../utils/notifyChannel'
8
7
 
9
8
  export class ProjectDispatcherFactory {
10
9
  constructor(
@@ -12,13 +11,13 @@ export class ProjectDispatcherFactory {
12
11
  ) {
13
12
  }
14
13
 
15
- public create({ db, contentSchemaResolver, projectSlug }: { db: DatabaseContext; contentSchemaResolver: ContentSchemaResolver; projectSlug: string}): ProjectDispatcher {
14
+ public create(
15
+ { db, contentSchemaResolver, projectSlug }: { db: DatabaseContext; contentSchemaResolver: ContentSchemaResolver; projectSlug: string },
16
+ ): ProjectDispatcher {
16
17
  return new ProjectDispatcher(this.dispatcher, db, contentSchemaResolver, projectSlug)
17
18
  }
18
19
  }
19
20
 
20
-
21
-
22
21
  export class ProjectDispatcher implements Runnable {
23
22
  constructor(
24
23
  private readonly dispatcher: EventDispatcher,
@@ -29,16 +28,14 @@ export class ProjectDispatcher implements Runnable {
29
28
  }
30
29
 
31
30
  public async run({ logger, onError, onClose }: RunnableArgs): Promise<Running> {
32
-
33
31
  return await new Promise<Running>(async (resolve, reject) => {
34
-
35
32
  let resolvePending = () => {}
36
33
  let rejectPending = (e: any) => {}
37
34
 
38
35
  const resolvePendingRef = () => {
39
36
  resolvePending()
40
37
  }
41
- let pendingError: any = undefined
38
+ let pendingError: any
42
39
  const rejectPendingRef = (e: any) => {
43
40
  pendingError = e
44
41
  rejectPending(e)
@@ -112,8 +109,6 @@ export class ProjectDispatcher implements Runnable {
112
109
  } catch (e) {
113
110
  reject(e)
114
111
  }
115
- })
116
-
117
-
112
+ })
118
113
  }
119
114
  }
@@ -1,5 +1,5 @@
1
1
  import { Actions, ActionsPayload } from '@contember/schema'
2
- import { EventRow, HandledEvent, InvokeHandler, InvokeHandlerArgs } from './types'
2
+ import { EventRow, HandledEvent, InvokeHandler, InvokeHandlerArgs } from './types'
3
3
  import { VariablesMap } from '../model/VariablesManager'
4
4
  import * as Typesafe from '@contember/typesafe'
5
5
  import { FetcherResponse, WebhookFetcher } from './WebhookFetcher'
@@ -19,7 +19,7 @@ const ResponseType = Typesafe.noExtraProps(Typesafe.object({
19
19
  ),
20
20
  }))
21
21
 
22
- type EventResponseFactory = (eventRow: EventRow) => ({ ok: boolean; code?: number; response?: string; errorMessage?: string; durationMs?: number })
22
+ type EventResponseFactory = (eventRow: EventRow) => { ok: boolean; code?: number; response?: string; errorMessage?: string; durationMs?: number }
23
23
 
24
24
  export class WebhookTargetHandler implements InvokeHandler<Actions.WebhookTarget> {
25
25
  constructor(
@@ -35,14 +35,12 @@ export class WebhookTargetHandler implements InvokeHandler<Actions.WebhookTarget
35
35
 
36
36
  let eventResponseFactory: EventResponseFactory
37
37
  try {
38
-
39
38
  const response = await this.fetch(timeoutMs ?? DEFAULT_TIMEOUT_MS, target, variables, events)
40
39
 
41
40
  eventResponseFactory = this.createResponseFactory({
42
41
  response: response,
43
42
  events,
44
43
  })
45
-
46
44
  } catch (e) {
47
45
  logger.warn(e)
48
46
  const errorMessages = this.extractErrorMessages(e)
@@ -73,7 +71,8 @@ export class WebhookTargetHandler implements InvokeHandler<Actions.WebhookTarget
73
71
  })
74
72
  }
75
73
 
76
- if (response.responseText.trim() === ''
74
+ if (
75
+ response.responseText.trim() === ''
77
76
  || !response.headers.get('content-type')?.toLowerCase().includes('json')
78
77
  ) {
79
78
  return () => ({
@@ -93,7 +92,7 @@ export class WebhookTargetHandler implements InvokeHandler<Actions.WebhookTarget
93
92
  const responseData = ResponseType(parsedJson)
94
93
  const eventsInBatch = new Set(events.map(it => it.id))
95
94
  const failedEvents = Object.fromEntries(responseData.failures?.map(it => [it.eventId, it]) ?? [])
96
- const missingEvents = Object.keys(failedEvents).filter(it => !eventsInBatch.has(it))
95
+ const missingEvents = Object.keys(failedEvents).filter(it => !eventsInBatch.has(it))
97
96
 
98
97
  if (missingEvents.length) {
99
98
  return () => ({
@@ -140,10 +139,17 @@ export class WebhookTargetHandler implements InvokeHandler<Actions.WebhookTarget
140
139
  })
141
140
  }
142
141
 
143
- private async doFetch(target: Actions.WebhookTarget, variables: VariablesMap, abortController: AbortController, events: EventRow[]): Promise<FetcherResponse> {
142
+ private async doFetch(
143
+ target: Actions.WebhookTarget,
144
+ variables: VariablesMap,
145
+ abortController: AbortController,
146
+ events: EventRow[],
147
+ ): Promise<FetcherResponse> {
144
148
  const resolvedUrl = this.resolveVariables(target.url, variables)
145
- const resolvedHeaders = Object.fromEntries(Object.entries(target.headers ?? {})
146
- .map(([key, value]) => [key, this.resolveVariables(value, variables)]))
149
+ const resolvedHeaders = Object.fromEntries(
150
+ Object.entries(target.headers ?? {})
151
+ .map(([key, value]) => [key, this.resolveVariables(value, variables)]),
152
+ )
147
153
 
148
154
  return await this.fetcher.fetch(resolvedUrl, {
149
155
  method: 'POST',
@@ -174,6 +180,9 @@ export class WebhookTargetHandler implements InvokeHandler<Actions.WebhookTarget
174
180
  meta: {
175
181
  eventId: it.id,
176
182
  transactionId: it.transaction_id,
183
+ identityId: it.identity_id ?? null,
184
+ ipAddress: it.ip_address ?? null,
185
+ userAgent: it.user_agent ?? null,
177
186
  createdAt: it.created_at.toISOString(),
178
187
  lastStateChange: it.last_state_change.toISOString(),
179
188
  numRetries: it.num_retries,
@@ -3,7 +3,7 @@ import { Actions } from '@contember/schema'
3
3
  import { EventRow } from '../model/types'
4
4
  import { VariablesMap } from '../model/VariablesManager'
5
5
 
6
- export { type EventRow }
6
+ export type { EventRow }
7
7
 
8
8
  export interface InvokeHandler<Target extends Actions.AnyTarget> {
9
9
  handle(args: InvokeHandlerArgs<Target>): Promise<HandledEvent[]>
@@ -29,4 +29,3 @@ export type InvocationResult = {
29
29
  code?: number
30
30
  response?: string
31
31
  }
32
-
@@ -25,6 +25,7 @@ export class ActionsApiMiddlewareFactory {
25
25
  const graphqlContext: ActionsContext = {
26
26
  db: systemDatabase,
27
27
  logger,
28
+ project: projectContainer.project,
28
29
  contentSchemaResolver: projectContainer.contentSchemaResolver,
29
30
  requireAccess: async (action, message) => {
30
31
  if (!(await this.authorizator.isAllowed(identity, new AuthorizationScope.Global(), action))) {
@@ -34,11 +35,12 @@ export class ActionsApiMiddlewareFactory {
34
35
  }
35
36
  const handler = this.actionsGraphQLHandler
36
37
 
37
- await timer('GraphQL', () => handler({
38
- request: koa.request,
39
- response: koa.response,
40
- createContext: () => graphqlContext,
41
- }))
38
+ await timer('GraphQL', () =>
39
+ handler({
40
+ request: koa.request,
41
+ response: koa.response,
42
+ createContext: () => graphqlContext,
43
+ }))
42
44
  logger.debug('Actions query finished')
43
45
  }
44
46
  }
@@ -29,8 +29,7 @@ export class ActionsContextResolver {
29
29
  id: authResult.identityId,
30
30
  roles: authResult.roles,
31
31
  },
32
- ),
33
- )
32
+ ))
34
33
  logger.debug('Memberships fetched', { memberships })
35
34
 
36
35
  if (memberships.length === 0) {
@@ -4,7 +4,6 @@ import { ResolversFactory } from '../resolvers/ResolversFactory'
4
4
  import { schema as graphqlDocument } from '../schema/actions.graphql'
5
5
  import { ActionsContext } from '../resolvers/ActionsContext'
6
6
 
7
-
8
7
  export type ActionsGraphQLHandler = GraphQLQueryHandler<ActionsContext>
9
8
 
10
9
  export class ActionsGraphQLHandlerFactory {