@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
package/src/index.ts CHANGED
@@ -7,7 +7,13 @@ import { MasterContainerBuilder, MasterContainerHook } from '@contember/engine-h
7
7
  import { ActionsApiMiddlewareFactory } from './graphql/http/ActionsApiMiddlewareFactory'
8
8
  import { ActionsGraphQLHandlerFactory } from './graphql/http/ActionsGraphQLHandlerFactory'
9
9
  import { ResolversFactory } from './graphql/resolvers/ResolversFactory'
10
- import { EventsQueryResolver, ProcessBatchMutationResolver, SetVariablesMutationResolver } from './graphql/resolvers'
10
+ import {
11
+ EventsQueryResolver,
12
+ ProcessBatchMutationResolver,
13
+ RetryEventMutationResolver,
14
+ SetVariablesMutationResolver,
15
+ StopEventMutationResolver,
16
+ } from './graphql/resolvers'
11
17
  import { EventDispatcher } from './dispatch/EventDispatcher'
12
18
  import { EventsRepository } from './dispatch/EventsRepository'
13
19
  import { TargetHandlerResolver } from './dispatch/TargetHandlerResolver'
@@ -15,6 +21,7 @@ import { WebhookTargetHandler } from './dispatch/WebhookTargetHandler'
15
21
  import { ActionsContextResolver } from './graphql/http/ActionsContextResolver'
16
22
  import { ActionsWebsocketControllerFactory } from './graphql/http/ActionsWebsocketControllerFactory'
17
23
  import { DispatchWorkerSupervisorFactory } from './dispatch/DispatchWorkerSupervisor'
24
+ import { LazyDispatchWorker } from './dispatch/LazyDispatchWorker'
18
25
  import { ProjectDispatcherFactory } from './dispatch/ProjectDispatcher'
19
26
  import { VariablesQueryResolver } from './graphql/resolvers/query/VariablesQueryResolver'
20
27
  import { VariablesManager } from './model/VariablesManager'
@@ -22,13 +29,7 @@ import { AccessEvaluator, Authorizator } from '@contember/authorization'
22
29
  import { ActionsPermissionsFactory } from './authorization'
23
30
  import { WebhookFetcherNative } from './dispatch/WebhookFetcher'
24
31
 
25
- export {
26
- TriggerListenersFactory,
27
- TriggerListenersStore,
28
- TriggerHandler,
29
- TriggerPayloadManager,
30
- TriggerIndirectChangesFetcher,
31
- } from './triggers'
32
+ export { TriggerHandler, TriggerIndirectChangesFetcher, TriggerListenersFactory, TriggerListenersStore, TriggerPayloadManager } from './triggers'
32
33
  export { ActionsExecutionContainerHookFactory } from './ActionsExecutionContainerHookFactory'
33
34
  export { ListenerStoreProvider } from './ListenerStoreProvider'
34
35
 
@@ -50,11 +51,13 @@ export default class ActionsPlugin implements Plugin {
50
51
  .addService('actions_variableManager', () => {
51
52
  return new VariablesManager()
52
53
  })
53
- .addService('actions_eventDispatcher', ({ actions_variableManager }) => {
54
- const eventsRepository = new EventsRepository()
54
+ .addService('actions_eventRepository', () => {
55
+ return new EventsRepository()
56
+ })
57
+ .addService('actions_eventDispatcher', ({ actions_eventRepository, actions_variableManager }) => {
55
58
  const webhookTargetHandler = new WebhookTargetHandler(new WebhookFetcherNative())
56
59
  const targetHandlerResolver = new TargetHandlerResolver(webhookTargetHandler)
57
- return new EventDispatcher(eventsRepository, actions_variableManager, targetHandlerResolver)
60
+ return new EventDispatcher(actions_eventRepository, actions_variableManager, targetHandlerResolver)
58
61
  })
59
62
  .addService('actions_dispatchWorkerSupervisorFactory', ({ actions_eventDispatcher }) => {
60
63
  const projectDispatcherFactory = new ProjectDispatcherFactory(actions_eventDispatcher)
@@ -63,31 +66,59 @@ export default class ActionsPlugin implements Plugin {
63
66
  .addService('actions_authorizator', () => {
64
67
  return new Authorizator.Default(new AccessEvaluator.PermissionEvaluator(new ActionsPermissionsFactory().create()))
65
68
  })
66
- .setupService('application', (it, { projectContextResolver, debugMode, actions_eventDispatcher, actions_dispatchWorkerSupervisorFactory, actions_variableManager, actions_authorizator }) => {
67
- const handlerFactory = new ActionsGraphQLHandlerFactory()
68
- const eventsQueryResolver = new EventsQueryResolver()
69
- const processBatchMutationResolver = new ProcessBatchMutationResolver(actions_eventDispatcher)
70
- const variablesQueryResolver = new VariablesQueryResolver(actions_variableManager)
71
- const setVariablesMutationResolver = new SetVariablesMutationResolver(actions_variableManager)
72
- const resolversFactory = new ResolversFactory(
73
- eventsQueryResolver,
74
- processBatchMutationResolver,
75
- variablesQueryResolver,
76
- setVariablesMutationResolver,
77
- )
78
-
79
- const actionsContextResolver = new ActionsContextResolver(debugMode, projectContextResolver)
80
- const actionsMiddlewareFactory = new ActionsApiMiddlewareFactory(actionsContextResolver, handlerFactory.create(resolversFactory), actions_authorizator)
81
- const actionsWebsocketMiddlewareFactory = new ActionsWebsocketControllerFactory(debugMode, actionsContextResolver, actions_dispatchWorkerSupervisorFactory)
82
- it.addRoute('actions', '/actions/:projectSlug', actionsMiddlewareFactory.create())
83
- it.addWebsocketRoute('actions', '/actions/_worker', actionsWebsocketMiddlewareFactory.create())
84
- })
85
- .setupService('applicationWorkers', (it, { actions_dispatchWorkerSupervisorFactory, projectGroupContainer, serverConfig }) => {
86
- if (!(serverConfig as any).projectGroup) {
87
- it.registerWorker(this.name, actions_dispatchWorkerSupervisorFactory.create(projectGroupContainer))
88
- }
89
- }) as unknown as MasterContainerBuilder
69
+ .setupService(
70
+ 'application',
71
+ (
72
+ it,
73
+ {
74
+ projectContextResolver,
75
+ debugMode,
76
+ actions_eventRepository,
77
+ actions_eventDispatcher,
78
+ actions_dispatchWorkerSupervisorFactory,
79
+ actions_variableManager,
80
+ actions_authorizator,
81
+ },
82
+ ) => {
83
+ const handlerFactory = new ActionsGraphQLHandlerFactory()
84
+ const eventsQueryResolver = new EventsQueryResolver()
85
+ const processBatchMutationResolver = new ProcessBatchMutationResolver(actions_eventDispatcher)
86
+ const variablesQueryResolver = new VariablesQueryResolver(actions_variableManager)
87
+ const setVariablesMutationResolver = new SetVariablesMutationResolver(actions_variableManager)
88
+ const resolversFactory = new ResolversFactory(
89
+ eventsQueryResolver,
90
+ processBatchMutationResolver,
91
+ variablesQueryResolver,
92
+ setVariablesMutationResolver,
93
+ new RetryEventMutationResolver(actions_eventRepository),
94
+ new StopEventMutationResolver(actions_eventRepository),
95
+ )
90
96
 
97
+ const actionsContextResolver = new ActionsContextResolver(debugMode, projectContextResolver)
98
+ const actionsMiddlewareFactory = new ActionsApiMiddlewareFactory(
99
+ actionsContextResolver,
100
+ handlerFactory.create(resolversFactory),
101
+ actions_authorizator,
102
+ )
103
+ const actionsWebsocketMiddlewareFactory = new ActionsWebsocketControllerFactory(
104
+ debugMode,
105
+ actionsContextResolver,
106
+ actions_dispatchWorkerSupervisorFactory,
107
+ )
108
+ it.addRoute('actions', '/actions/:projectSlug', actionsMiddlewareFactory.create())
109
+ it.addWebsocketRoute('actions', '/actions/_worker', actionsWebsocketMiddlewareFactory.create())
110
+ },
111
+ )
112
+ .setupService(
113
+ 'applicationWorkers',
114
+ (it, { actions_dispatchWorkerSupervisorFactory, projectGroupContainer, projectGroupContainerResolver, serverConfig }) => {
115
+ if (!(serverConfig as any).projectGroup) {
116
+ it.registerWorker(this.name, actions_dispatchWorkerSupervisorFactory.create(projectGroupContainer))
117
+ } else {
118
+ it.registerWorker(this.name, new LazyDispatchWorker(projectGroupContainerResolver, actions_dispatchWorkerSupervisorFactory))
119
+ }
120
+ },
121
+ ) as unknown as MasterContainerBuilder
91
122
  }
92
123
  return hook
93
124
  }
@@ -11,6 +11,6 @@ const sql = `
11
11
  )
12
12
  `
13
13
 
14
- export default async function (builder: MigrationBuilder) {
14
+ export default async function(builder: MigrationBuilder) {
15
15
  builder.sql(sql)
16
16
  }
@@ -0,0 +1,16 @@
1
+ import { MigrationBuilder } from '@contember/database-migrations'
2
+
3
+ const sql = `
4
+ ALTER TABLE actions_event
5
+ ADD COLUMN IF NOT EXISTS identity_id UUID DEFAULT NULL;
6
+
7
+ ALTER TABLE actions_event
8
+ ADD COLUMN IF NOT EXISTS ip_address INET DEFAULT NULL;
9
+
10
+ ALTER TABLE actions_event
11
+ ADD COLUMN IF NOT EXISTS user_agent TEXT DEFAULT NULL;
12
+ `
13
+
14
+ export default async function(builder: MigrationBuilder) {
15
+ builder.sql(sql)
16
+ }
@@ -1,7 +1,9 @@
1
1
  import snapshot from './snapshot'
2
2
  import { MigrationGroup } from '@contember/database-migrations'
3
3
  import _20230310145000actionsvariables from './2023-03-10-145000-actions-variables'
4
+ import _20250528160000actioneventuser from './2025-05-28-160000-action-event-user'
4
5
 
5
6
  export const migrationsGroup = new MigrationGroup(snapshot, {
6
7
  '2023-03-10-145000-actions-variables': _20230310145000actionsvariables,
8
+ '2025-05-28-160000-action-event-user': _20250528160000actioneventuser,
7
9
  })
@@ -1,6 +1,6 @@
1
1
  import { MigrationBuilder } from '@contember/database-migrations'
2
2
 
3
- export default async function (builder: MigrationBuilder) {
3
+ export default async function(builder: MigrationBuilder) {
4
4
  builder.sql(`
5
5
  CREATE TYPE ACTIONS_TRIGGER_STATE AS ENUM (
6
6
  'created' ,
@@ -30,11 +30,14 @@ export default async function (builder: MigrationBuilder) {
30
30
  trigger TEXT NOT NULL,
31
31
  priority INT NOT NULL DEFAULT 0,
32
32
  payload JSONB NOT NULL,
33
- log JSONB NOT NULL DEFAULT '[]'
33
+ log JSONB NOT NULL DEFAULT '[]',
34
+ identity_id UUID DEFAULT NULL,
35
+ ip_address INET DEFAULT NULL,
36
+ user_agent TEXT DEFAULT NULL
34
37
  );
35
38
 
36
39
  CREATE INDEX ON actions_event (priority DESC, visible_at) WHERE state IN ('created', 'retrying', 'processing');
37
-
40
+
38
41
  CREATE TABLE actions_variable
39
42
  (
40
43
  id UUID PRIMARY KEY NOT NULL,
@@ -0,0 +1,21 @@
1
+ import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'
2
+ import { EventRow } from './types'
3
+
4
+ export class EventByIdQuery extends DatabaseQuery<EventRow | null> {
5
+ constructor(
6
+ private readonly id: string,
7
+ ) {
8
+ super()
9
+ }
10
+
11
+ async fetch(queryable: DatabaseQueryable): Promise<EventRow | null> {
12
+ const result = await SelectBuilder.create<EventRow>()
13
+ .from('actions_event')
14
+ .select('*')
15
+ .where({
16
+ id: this.id,
17
+ })
18
+ .getResult(queryable.db)
19
+ return this.fetchOneOrNull(result)
20
+ }
21
+ }
@@ -1,11 +1,12 @@
1
1
  import { Operator, SelectBuilderSpecification } from '@contember/database'
2
2
 
3
+ export const eventsToProcessStateSpecification: SelectBuilderSpecification = qb =>
4
+ qb
5
+ .where(it => it.in('state', ['retrying', 'created', 'processing']))
3
6
 
4
- export const eventsToProcessStateSpecification: SelectBuilderSpecification = qb => qb
5
- .where(it => it.in('state', ['retrying', 'created', 'processing']))
6
-
7
- export const eventsToProcessSpecification: SelectBuilderSpecification = qb => qb
8
- .match(eventsToProcessStateSpecification)
9
- .where(it => it.compare('visible_at', Operator.lte, 'now'))
10
- .orderBy('priority', 'desc')
11
- .orderBy('visible_at')
7
+ export const eventsToProcessSpecification: SelectBuilderSpecification = qb =>
8
+ qb
9
+ .match(eventsToProcessStateSpecification)
10
+ .where(it => it.compare('visible_at', Operator.lte, 'now'))
11
+ .orderBy('priority', 'desc')
12
+ .orderBy('visible_at')
@@ -2,7 +2,6 @@ import { Command } from '@contember/engine-system-api'
2
2
  import { ConflictActionType, InsertBuilder, Literal } from '@contember/database'
3
3
 
4
4
  export class SetVariableCommand implements Command<void> {
5
-
6
5
  constructor(
7
6
  private readonly name: string,
8
7
  private readonly value: string,
@@ -14,6 +14,9 @@ export type EventRow = {
14
14
  target: string
15
15
  priority: number
16
16
  trigger: string
17
+ identity_id: string | null
18
+ ip_address: string | null
19
+ user_agent: string | null
17
20
  payload: ActionsPayload.AnyEventPayload
18
21
  log: any[]
19
22
  }
@@ -71,31 +71,30 @@ export class TriggerHandler {
71
71
 
72
72
  private async directUpdateHandler(event: AfterUpdateEvent) {
73
73
  const updateListeners = this.listenersStore.getUpdateListeners(event.entity.name)
74
- updateListeners.map(listener => {
74
+ await Promise.all(updateListeners.map(listener => {
75
75
  if (event.data.some(it => listener.fields.has(it.fieldName) && it.value !== it.old)) {
76
- this.payloadManager.add({
76
+ return this.payloadManager.add({
77
77
  listener,
78
78
  entity: event.entity,
79
79
  primary: event.id,
80
80
  cause: event,
81
81
  })
82
82
  }
83
- })
83
+ }))
84
84
  }
85
85
 
86
86
  private async directCreateHandler(event: AfterInsertEvent) {
87
87
  const createListeners = this.listenersStore.getCreateListener(event.entity.name)
88
- createListeners.map(listener => {
89
- this.payloadManager.add({
88
+ await Promise.all(createListeners.map(listener => {
89
+ return this.payloadManager.add({
90
90
  listener,
91
91
  entity: event.entity,
92
92
  primary: event.id,
93
93
  cause: event,
94
94
  })
95
- })
95
+ }))
96
96
  }
97
97
 
98
-
99
98
  /**
100
99
  * Collect affected triggers after entity was created or before it was deleted.
101
100
  * todo: after insert, it should probably check only owning relations, because other relations are connected later, so it would be always empty
@@ -103,9 +102,11 @@ export class TriggerHandler {
103
102
  private async indirectChangesEntityHandler(event: BeforeDeleteEvent | AfterInsertEvent) {
104
103
  //
105
104
  const indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)
106
- const promises = indirectEntityListeners.map(listener => this.collectDeepChanges(event, listener, {
107
- [event.entity.primary]: { eq: event.id },
108
- }))
105
+ const promises = indirectEntityListeners.map(listener =>
106
+ this.collectDeepChanges(event, listener, {
107
+ [event.entity.primary]: { eq: event.id },
108
+ })
109
+ )
109
110
  await Promise.all(promises)
110
111
  }
111
112
 
@@ -142,20 +143,20 @@ export class TriggerHandler {
142
143
  await Promise.all(promises)
143
144
  }
144
145
 
145
-
146
146
  private async collectDeepChanges(
147
147
  cause: EventCause,
148
148
  listener: IndirectListener | JunctionListener,
149
149
  where: Input.Where,
150
150
  ) {
151
151
  const result = await this.changesFetcher.fetch(listener, where)
152
- for (const row of result) {
153
- this.payloadManager.add({
152
+ await Promise.all(result.map(row => {
153
+ return this.payloadManager.add({
154
154
  listener,
155
155
  entity: listener.rootEntity,
156
- primary: row,
156
+ primary: row.id,
157
157
  cause,
158
+ nodes: row.nodes,
158
159
  })
159
- }
160
+ }))
160
161
  }
161
162
  }
@@ -1,12 +1,21 @@
1
1
  import { Mapper, PathFactory, WhereBuilder } from '@contember/engine-content-api'
2
2
  import { IndirectListener, JunctionListener } from './TriggerListenersStore'
3
3
  import { SelectBuilder } from '@contember/database'
4
- import { Input } from '@contember/schema'
4
+ import { ActionsPayload, Input, Model, Schema } from '@contember/schema'
5
+ import { JoinBuilder } from '@contember/engine-content-api'
6
+ import { getTargetEntity } from '@contember/schema-utils'
7
+
8
+ export type TriggerIndirectChangesFetcherResult = {
9
+ id: Input.PrimaryValue
10
+ nodes?: ActionsPayload.EntityEventPathNode[]
11
+ }[]
5
12
 
6
13
  export class TriggerIndirectChangesFetcher {
7
14
  constructor(
15
+ private readonly model: Model.Schema,
8
16
  private readonly mapper: Mapper,
9
17
  private readonly whereBuilder: WhereBuilder,
18
+ private readonly joinBuilder: JoinBuilder,
10
19
  private readonly pathFactory: PathFactory,
11
20
  ) {
12
21
  }
@@ -14,7 +23,11 @@ export class TriggerIndirectChangesFetcher {
14
23
  public async fetch(
15
24
  listener: IndirectListener | JunctionListener,
16
25
  where: Input.Where,
17
- ): Promise<Input.PrimaryValue[]> {
26
+ ): Promise<TriggerIndirectChangesFetcherResult> {
27
+ if (listener.trigger.withNodes) {
28
+ return this.fetchWithNodes(listener, where)
29
+ }
30
+
18
31
  for (let i = listener.path.length - 1; i >= 0; i--) {
19
32
  where = { [listener.path[i]]: where }
20
33
  }
@@ -24,7 +37,53 @@ export class TriggerIndirectChangesFetcher {
24
37
  const path = this.pathFactory.create([])
25
38
  const qbWithWhere = this.whereBuilder.build(qb, listener.rootEntity, path, where)
26
39
 
27
- return (await qbWithWhere.getResult(this.mapper.db)).map(it => it.id)
40
+ return (await qbWithWhere.getResult(this.mapper.db))
28
41
  }
29
42
 
43
+ private async fetchWithNodes(
44
+ listener: IndirectListener | JunctionListener,
45
+ where: Input.Where,
46
+ ): Promise<TriggerIndirectChangesFetcherResult> {
47
+ const basePath = this.pathFactory.create([])
48
+ let path = basePath
49
+ let entity = listener.rootEntity
50
+ let qb = SelectBuilder.create()
51
+ .from(entity.tableName, path.alias)
52
+ .select([path.alias, entity.primaryColumn], path.for(entity.primary).alias)
53
+
54
+ for (let i = 0; i < listener.path.length; i++) {
55
+ const relationName = listener.path[i]
56
+ path = path.for(relationName)
57
+ const targetEntity = getTargetEntity(this.model, entity, relationName)
58
+ if (!targetEntity) {
59
+ throw new Error(`Target entity for relation ${entity.name}::${relationName} not found`)
60
+ }
61
+ qb = this.joinBuilder.join(qb, path, entity, relationName)
62
+
63
+ entity = targetEntity
64
+ qb = qb.select([path.alias, targetEntity.primaryColumn], path.for(targetEntity.primary).alias)
65
+ }
66
+
67
+ const qbWithWhere = this.whereBuilder.build(qb, entity, path, where)
68
+
69
+ const result = await qbWithWhere.getResult(this.mapper.db)
70
+
71
+ return result.map(row => {
72
+ const nodes: ActionsPayload.EntityEventPathNode[] = []
73
+ let entity = listener.rootEntity
74
+ let path = basePath
75
+ const id = row[path.for(entity.primary).alias]
76
+ for (let i = 0; i < listener.path.length; i++) {
77
+ const relationName = listener.path[i]
78
+ const targetEntity = getTargetEntity(this.model, entity, relationName)
79
+ if (!targetEntity) {
80
+ throw new Error(`Target entity for relation ${entity.name}::${relationName} not found`)
81
+ }
82
+ path = path.for(relationName)
83
+ nodes.push({ relation: relationName, entity: targetEntity.name, id: row[path.for(targetEntity.primary).alias] })
84
+ entity = targetEntity
85
+ }
86
+ return { id, nodes }
87
+ })
88
+ }
30
89
  }
@@ -1,10 +1,4 @@
1
- import {
2
- CreateListener,
3
- DeleteListener,
4
- IndirectListener,
5
- JunctionListener,
6
- UpdateListener,
7
- } from './TriggerListenersStore'
1
+ import { CreateListener, DeleteListener, IndirectListener, JunctionListener, UpdateListener } from './TriggerListenersStore'
8
2
 
9
3
  export interface TriggerListeners {
10
4
  readonly deleteListeners: Map<string, DeleteListener[]>
@@ -13,4 +7,3 @@ export interface TriggerListeners {
13
7
  readonly indirectListeners: Map<string, IndirectListener[]>
14
8
  readonly junctionListeners: Map<string, Map<string, JunctionListener[]>>
15
9
  }
16
-
@@ -6,7 +6,6 @@ import { mapGetOrPut } from '../utils/map'
6
6
  import { ImplementationException } from '../ImplementationException'
7
7
 
8
8
  export class TriggerListenerBuilder {
9
-
10
9
  private readonly data: TriggerListeners = {
11
10
  createListeners: new Map(),
12
11
  updateListeners: new Map(),
@@ -26,7 +25,7 @@ export class TriggerListenerBuilder {
26
25
  } else if (trigger.type === 'watch') {
27
26
  this.processIndirectListeners(trigger)
28
27
  } else {
29
- ((_: never) => {
28
+ ;((_: never) => {
30
29
  throw new ImplementationException(`Unhandled trigger ${(trigger as any).type}`)
31
30
  })(trigger)
32
31
  }
@@ -169,12 +168,10 @@ export class TriggerListenerBuilder {
169
168
  return new TriggerListenersStore(this.data)
170
169
  }
171
170
 
172
-
173
171
  private addListener<
174
172
  K extends Exclude<keyof TriggerListeners, 'junctionListeners'>,
175
- V extends TriggerListeners[K] extends Map<string, infer V extends any[]> ? V[number] : never
176
- >
177
- (
173
+ V extends TriggerListeners[K] extends Map<string, infer V extends any[]> ? V[number] : never,
174
+ >(
178
175
  type: K,
179
176
  entityName: string,
180
177
  value: V,
@@ -3,7 +3,7 @@ import { TriggerListeners } from './TriggerListeners'
3
3
 
4
4
  export interface IndirectListener {
5
5
  type: 'indirect'
6
- trigger: Actions.AnyTrigger
6
+ trigger: Actions.WatchTrigger
7
7
  rootEntity: Model.Entity
8
8
  fields: Set<string>
9
9
  relations: Set<string>
@@ -12,7 +12,7 @@ export interface IndirectListener {
12
12
 
13
13
  export interface JunctionListener {
14
14
  type: 'junction'
15
- trigger: Actions.AnyTrigger
15
+ trigger: Actions.WatchTrigger
16
16
  rootEntity: Model.Entity
17
17
  path: string[]
18
18
  context: {
@@ -23,7 +23,10 @@ export class TriggerPayloadBuilder {
23
23
  const selections = await this.fetchSelection(filteredEvents)
24
24
  const triggerType = filteredEvents[0].listener.trigger.type
25
25
  if (triggerType === 'basic') {
26
- return filteredEvents.map(it => ({ trigger: it.listener.trigger.name, ...this.buildBaseEventPayloads(it, it.selection ?? selections[it.primary]) }))
26
+ return filteredEvents.map(it => ({
27
+ trigger: it.listener.trigger.name,
28
+ ...this.buildBaseEventPayloads(it, it.selection ?? selections[it.primary]),
29
+ }))
27
30
  }
28
31
  if (triggerType === 'watch') {
29
32
  return this.buildWatchEventPayloads(filteredEvents, selections)
@@ -35,9 +38,13 @@ export class TriggerPayloadBuilder {
35
38
  if (event.listener.type === 'delete' && event.listener.trigger.selection) {
36
39
  const input = this.convertSelectionNode(event.listener.trigger.selection)
37
40
 
38
- const selection = await this.mapper.selectUnique(event.entity, input.withArg('by', {
39
- [event.entity.primary]: event.primary,
40
- }), [])
41
+ const selection = await this.mapper.selectUnique(
42
+ event.entity,
43
+ input.withArg('by', {
44
+ [event.entity.primary]: event.primary,
45
+ }),
46
+ [],
47
+ )
41
48
  return { ...event, selection }
42
49
  }
43
50
  return event
@@ -51,6 +58,19 @@ export class TriggerPayloadBuilder {
51
58
  }
52
59
  const payloads: ActionsPayload.WatchEventPayload[] = []
53
60
  for (const eventsByPrimary of Object.values(byPrimary)) {
61
+ const baseEvents: ActionsPayload.BaseEventPayload[] = []
62
+
63
+ const existingEvents = new Set<string>()
64
+ for (const event of eventsByPrimary.events) {
65
+ const baseEvent = this.buildBaseEventPayloads(event)
66
+ const stringRepresentation = JSON.stringify(baseEvent)
67
+ if (existingEvents.has(stringRepresentation)) {
68
+ continue
69
+ }
70
+ existingEvents.add(stringRepresentation)
71
+ baseEvents.push(baseEvent)
72
+ }
73
+
54
74
  payloads.push({
55
75
  operation: 'watch',
56
76
  trigger: events[0].listener.trigger.name,
@@ -58,7 +78,7 @@ export class TriggerPayloadBuilder {
58
78
  id: eventsByPrimary.primary,
59
79
  selection: eventsByPrimary.events.find(it => it.selection)?.selection
60
80
  ?? selections[eventsByPrimary.primary],
61
- events: eventsByPrimary.events.map(it => this.buildBaseEventPayloads(it)),
81
+ events: baseEvents,
62
82
  })
63
83
  }
64
84
  return payloads
@@ -74,6 +94,7 @@ export class TriggerPayloadBuilder {
74
94
  selection,
75
95
  values: Object.fromEntries(event.cause.data.map(it => [it.fieldName, it.value])),
76
96
  path: 'path' in event.listener ? event.listener.path : undefined,
97
+ nodes: event.nodes,
77
98
  }
78
99
  case 'AfterUpdateEvent':
79
100
  case 'BeforeUpdateEvent':
@@ -89,6 +110,7 @@ export class TriggerPayloadBuilder {
89
110
  values: Object.fromEntries(event.cause.data.map(it => [it.fieldName, it.value])),
90
111
  path: 'path' in event.listener ? event.listener.path : undefined,
91
112
  old: Object.fromEntries(afterEvent.data.map(it => [it.fieldName, it.old])),
113
+ nodes: event.nodes,
92
114
  }
93
115
  case 'BeforeDeleteEvent':
94
116
  return {
@@ -97,6 +119,7 @@ export class TriggerPayloadBuilder {
97
119
  id: event.cause.id,
98
120
  selection,
99
121
  path: 'path' in event.listener ? event.listener.path : undefined,
122
+ nodes: event.nodes,
100
123
  }
101
124
  case 'AfterJunctionUpdateEvent':
102
125
  if (event.listener.type !== 'junction') {
@@ -112,6 +135,7 @@ export class TriggerPayloadBuilder {
112
135
  id,
113
136
  inverseId,
114
137
  path: 'path' in event.listener ? event.listener.path : undefined,
138
+ nodes: event.nodes,
115
139
  }
116
140
  default:
117
141
  assertNever(event.cause, it => it.type)
@@ -135,14 +159,20 @@ export class TriggerPayloadBuilder {
135
159
  return await this.mapper.selectAssoc(entity, input, [], entity.primary)
136
160
  }
137
161
 
138
-
139
162
  private convertSelectionNode(node: Actions.SelectionNode, nodeName = 'root', path: string[] = []): ObjectNode<Input.ListQueryInput> {
140
- return new ObjectNode(nodeName, nodeName, node.map(it => {
141
- const [field, args, selection] = Array.isArray(it) ? it : [it, undefined, undefined]
142
- if (selection === undefined || selection.length === 0) {
143
- return new FieldNode(field, field, {})
144
- }
145
- return this.convertSelectionNode(selection, field, [...path, nodeName]).withArgs(args)
146
- }), {}, {}, path)
163
+ return new ObjectNode(
164
+ nodeName,
165
+ nodeName,
166
+ node.map(it => {
167
+ const [field, args, selection] = Array.isArray(it) ? it : [it, undefined, undefined]
168
+ if (selection === undefined || selection.length === 0) {
169
+ return new FieldNode(field, field, {})
170
+ }
171
+ return this.convertSelectionNode(selection, field, [...path, nodeName]).withArgs(args)
172
+ }),
173
+ {},
174
+ {},
175
+ path,
176
+ )
147
177
  }
148
178
  }
@@ -1,16 +1,16 @@
1
- import { Actions, Input, Model } from '@contember/schema'
1
+ import { Actions, ActionsPayload, Input, Model } from '@contember/schema'
2
2
  import { AnyListener } from './TriggerListenersStore'
3
3
  import { EventCause } from './TriggerHandler'
4
4
  import { TriggerPayloadBuilder } from './TriggerPayloadBuilder'
5
5
  import { TriggerPayloadPersister } from './TriggerPayloadPersister'
6
6
 
7
-
8
7
  export interface FiredEvent {
9
8
  listener: AnyListener
10
9
  cause: EventCause
11
10
  entity: Model.Entity
12
11
  primary: Input.PrimaryValue
13
12
  selection?: any
13
+ nodes?: ActionsPayload.EntityEventPathNode[]
14
14
  }
15
15
 
16
16
  export class TriggerPayloadManager {
@@ -28,7 +28,6 @@ export class TriggerPayloadManager {
28
28
  this.eventsByTrigger[firedEvent.listener.trigger.name].push(event)
29
29
  }
30
30
 
31
-
32
31
  public async persist(): Promise<void> {
33
32
  for (const events of Object.values(this.eventsByTrigger)) {
34
33
  const payloads = await this.triggerPayloadBuilder.build(events)
@@ -37,4 +36,3 @@ export class TriggerPayloadManager {
37
36
  }
38
37
  }
39
38
  }
40
-