@contember/engine-actions 2.1.0-alpha.30 → 2.1.0-alpha.36
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.
- package/graphql.codegen.yml +1 -1
- package/package.json +27 -22
- package/src/ActionsExecutionContainerHookFactory.ts +23 -11
- package/src/dispatch/DispatchWorkerSupervisor.ts +17 -16
- package/src/dispatch/EventDispatcher.ts +0 -2
- package/src/dispatch/EventsRepository.ts +41 -40
- package/src/dispatch/ProjectDispatcher.ts +5 -10
- package/src/dispatch/WebhookTargetHandler.ts +15 -9
- package/src/dispatch/types.ts +1 -2
- package/src/graphql/http/ActionsApiMiddlewareFactory.ts +6 -5
- package/src/graphql/http/ActionsContextResolver.ts +1 -2
- package/src/graphql/http/ActionsGraphQLHandlerFactory.ts +0 -1
- package/src/graphql/http/ActionsWebsocketControllerFactory.ts +7 -5
- package/src/graphql/resolvers/ResolversFactory.ts +3 -1
- package/src/graphql/resolvers/mutation/SetVariablesMutationResolver.ts +0 -1
- package/src/graphql/resolvers/query/EventsQueryResolver.ts +1 -8
- package/src/graphql/resolvers/query/VariablesQueryResolver.ts +0 -1
- package/src/graphql/schema/index.ts +37 -36
- package/src/index.ts +50 -29
- package/src/migrations/2023-03-10-145000-actions-variables.ts +1 -1
- package/src/migrations/2025-05-28-160000-action-event-user.ts +1 -1
- package/src/migrations/snapshot.ts +1 -1
- package/src/model/EventsToProcessSpecification.ts +9 -8
- package/src/model/SetVariableCommand.ts +0 -1
- package/src/triggers/TriggerHandler.ts +5 -5
- package/src/triggers/TriggerListeners.ts +1 -8
- package/src/triggers/TriggerListenersBuilder.ts +3 -6
- package/src/triggers/TriggerPayloadBuilder.ts +25 -12
- package/src/triggers/TriggerPayloadManager.ts +0 -3
- package/src/triggers/TriggerPayloadPersister.ts +0 -1
- package/tests/cases/unit/generator.test.ts +132 -135
- package/tests/cases/unit/webhookHandler.test.ts +44 -41
- package/dist/development/index.cjs +0 -99
- package/dist/development/index.cjs.map +0 -1
- package/dist/development/index.js +0 -99
- package/dist/development/index.js.map +0 -1
- package/dist/development/src/ActionsExecutionContainerHookFactory.cjs +0 -30
- package/dist/development/src/ActionsExecutionContainerHookFactory.cjs.map +0 -1
- package/dist/development/src/ActionsExecutionContainerHookFactory.js +0 -30
- package/dist/development/src/ActionsExecutionContainerHookFactory.js.map +0 -1
- package/dist/development/src/ImplementationException.cjs +0 -6
- package/dist/development/src/ImplementationException.cjs.map +0 -1
- package/dist/development/src/ImplementationException.js +0 -6
- package/dist/development/src/ImplementationException.js.map +0 -1
- package/dist/development/src/ListenerStoreProvider.cjs +0 -25
- package/dist/development/src/ListenerStoreProvider.cjs.map +0 -1
- package/dist/development/src/ListenerStoreProvider.js +0 -25
- package/dist/development/src/ListenerStoreProvider.js.map +0 -1
- package/dist/development/src/authorization/ActionsAuthorizationActions.cjs +0 -17
- package/dist/development/src/authorization/ActionsAuthorizationActions.cjs.map +0 -1
- package/dist/development/src/authorization/ActionsAuthorizationActions.js +0 -18
- package/dist/development/src/authorization/ActionsAuthorizationActions.js.map +0 -1
- package/dist/development/src/authorization/ActionsPermissionsFactory.cjs +0 -16
- package/dist/development/src/authorization/ActionsPermissionsFactory.cjs.map +0 -1
- package/dist/development/src/authorization/ActionsPermissionsFactory.js +0 -16
- package/dist/development/src/authorization/ActionsPermissionsFactory.js.map +0 -1
- package/dist/development/src/dispatch/DispatchWorkerSupervisor.cjs +0 -125
- package/dist/development/src/dispatch/DispatchWorkerSupervisor.cjs.map +0 -1
- package/dist/development/src/dispatch/DispatchWorkerSupervisor.js +0 -125
- package/dist/development/src/dispatch/DispatchWorkerSupervisor.js.map +0 -1
- package/dist/development/src/dispatch/EventDispatcher.cjs +0 -43
- package/dist/development/src/dispatch/EventDispatcher.cjs.map +0 -1
- package/dist/development/src/dispatch/EventDispatcher.js +0 -43
- package/dist/development/src/dispatch/EventDispatcher.js.map +0 -1
- package/dist/development/src/dispatch/EventsRepository.cjs +0 -117
- package/dist/development/src/dispatch/EventsRepository.cjs.map +0 -1
- package/dist/development/src/dispatch/EventsRepository.js +0 -117
- package/dist/development/src/dispatch/EventsRepository.js.map +0 -1
- package/dist/development/src/dispatch/ProjectDispatcher.cjs +0 -99
- package/dist/development/src/dispatch/ProjectDispatcher.cjs.map +0 -1
- package/dist/development/src/dispatch/ProjectDispatcher.js +0 -99
- package/dist/development/src/dispatch/ProjectDispatcher.js.map +0 -1
- package/dist/development/src/dispatch/TargetHandlerResolver.cjs +0 -16
- package/dist/development/src/dispatch/TargetHandlerResolver.cjs.map +0 -1
- package/dist/development/src/dispatch/TargetHandlerResolver.js +0 -16
- package/dist/development/src/dispatch/TargetHandlerResolver.js.map +0 -1
- package/dist/development/src/dispatch/WebhookFetcher.cjs +0 -16
- package/dist/development/src/dispatch/WebhookFetcher.cjs.map +0 -1
- package/dist/development/src/dispatch/WebhookFetcher.js +0 -16
- package/dist/development/src/dispatch/WebhookFetcher.js.map +0 -1
- package/dist/development/src/dispatch/WebhookTargetHandler.cjs +0 -196
- package/dist/development/src/dispatch/WebhookTargetHandler.cjs.map +0 -1
- package/dist/development/src/dispatch/WebhookTargetHandler.js +0 -179
- package/dist/development/src/dispatch/WebhookTargetHandler.js.map +0 -1
- package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.cjs +0 -39
- package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.cjs.map +0 -1
- package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.js +0 -39
- package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.js.map +0 -1
- package/dist/development/src/graphql/http/ActionsContextResolver.cjs +0 -39
- package/dist/development/src/graphql/http/ActionsContextResolver.cjs.map +0 -1
- package/dist/development/src/graphql/http/ActionsContextResolver.js +0 -39
- package/dist/development/src/graphql/http/ActionsContextResolver.js.map +0 -1
- package/dist/development/src/graphql/http/ActionsGraphQLHandlerFactory.cjs +0 -20
- package/dist/development/src/graphql/http/ActionsGraphQLHandlerFactory.cjs.map +0 -1
- package/dist/development/src/graphql/http/ActionsGraphQLHandlerFactory.js +0 -20
- package/dist/development/src/graphql/http/ActionsGraphQLHandlerFactory.js.map +0 -1
- package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.cjs +0 -149
- package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.cjs.map +0 -1
- package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.js +0 -132
- package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.js.map +0 -1
- package/dist/development/src/graphql/resolvers/ResolversFactory.cjs +0 -36
- package/dist/development/src/graphql/resolvers/ResolversFactory.cjs.map +0 -1
- package/dist/development/src/graphql/resolvers/ResolversFactory.js +0 -36
- package/dist/development/src/graphql/resolvers/ResolversFactory.js.map +0 -1
- package/dist/development/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.cjs +0 -19
- package/dist/development/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.cjs.map +0 -1
- package/dist/development/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js +0 -19
- package/dist/development/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js.map +0 -1
- package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs +0 -21
- package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs.map +0 -1
- package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.js +0 -21
- package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.js.map +0 -1
- package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.cjs +0 -19
- package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.cjs.map +0 -1
- package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js +0 -19
- package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js.map +0 -1
- package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs +0 -19
- package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs.map +0 -1
- package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.js +0 -19
- package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.js.map +0 -1
- package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.cjs +0 -61
- package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +0 -1
- package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.js +0 -61
- package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.js.map +0 -1
- package/dist/development/src/graphql/resolvers/query/VariablesQueryResolver.cjs +0 -19
- package/dist/development/src/graphql/resolvers/query/VariablesQueryResolver.cjs.map +0 -1
- package/dist/development/src/graphql/resolvers/query/VariablesQueryResolver.js +0 -19
- package/dist/development/src/graphql/resolvers/query/VariablesQueryResolver.js.map +0 -1
- package/dist/development/src/graphql/schema/actions.graphql.cjs +0 -107
- package/dist/development/src/graphql/schema/actions.graphql.cjs.map +0 -1
- package/dist/development/src/graphql/schema/actions.graphql.js +0 -107
- package/dist/development/src/graphql/schema/actions.graphql.js.map +0 -1
- package/dist/development/src/migrations/2023-03-10-145000-actions-variables.cjs +0 -16
- package/dist/development/src/migrations/2023-03-10-145000-actions-variables.cjs.map +0 -1
- package/dist/development/src/migrations/2023-03-10-145000-actions-variables.js +0 -17
- package/dist/development/src/migrations/2023-03-10-145000-actions-variables.js.map +0 -1
- package/dist/development/src/migrations/2025-05-28-160000-action-event-user.cjs +0 -16
- package/dist/development/src/migrations/2025-05-28-160000-action-event-user.cjs.map +0 -1
- package/dist/development/src/migrations/2025-05-28-160000-action-event-user.js +0 -17
- package/dist/development/src/migrations/2025-05-28-160000-action-event-user.js.map +0 -1
- package/dist/development/src/migrations/index.cjs +0 -12
- package/dist/development/src/migrations/index.cjs.map +0 -1
- package/dist/development/src/migrations/index.js +0 -12
- package/dist/development/src/migrations/index.js.map +0 -1
- package/dist/development/src/migrations/snapshot.cjs +0 -51
- package/dist/development/src/migrations/snapshot.cjs.map +0 -1
- package/dist/development/src/migrations/snapshot.js +0 -52
- package/dist/development/src/migrations/snapshot.js.map +0 -1
- package/dist/development/src/model/EventByIdQuery.cjs +0 -17
- package/dist/development/src/model/EventByIdQuery.cjs.map +0 -1
- package/dist/development/src/model/EventByIdQuery.js +0 -17
- package/dist/development/src/model/EventByIdQuery.js.map +0 -1
- package/dist/development/src/model/EventsInProcessingQuery.cjs +0 -14
- package/dist/development/src/model/EventsInProcessingQuery.cjs.map +0 -1
- package/dist/development/src/model/EventsInProcessingQuery.js +0 -14
- package/dist/development/src/model/EventsInProcessingQuery.js.map +0 -1
- package/dist/development/src/model/EventsToProcessQuery.cjs +0 -15
- package/dist/development/src/model/EventsToProcessQuery.cjs.map +0 -1
- package/dist/development/src/model/EventsToProcessQuery.js +0 -15
- package/dist/development/src/model/EventsToProcessQuery.js.map +0 -1
- package/dist/development/src/model/EventsToProcessSpecification.cjs +0 -8
- package/dist/development/src/model/EventsToProcessSpecification.cjs.map +0 -1
- package/dist/development/src/model/EventsToProcessSpecification.js +0 -8
- package/dist/development/src/model/EventsToProcessSpecification.js.map +0 -1
- package/dist/development/src/model/FailedEventsQuery.cjs +0 -14
- package/dist/development/src/model/FailedEventsQuery.cjs.map +0 -1
- package/dist/development/src/model/FailedEventsQuery.js +0 -14
- package/dist/development/src/model/FailedEventsQuery.js.map +0 -1
- package/dist/development/src/model/SetVariableCommand.cjs +0 -21
- package/dist/development/src/model/SetVariableCommand.cjs.map +0 -1
- package/dist/development/src/model/SetVariableCommand.js +0 -21
- package/dist/development/src/model/SetVariableCommand.js.map +0 -1
- package/dist/development/src/model/VariablesManager.cjs +0 -41
- package/dist/development/src/model/VariablesManager.cjs.map +0 -1
- package/dist/development/src/model/VariablesManager.js +0 -41
- package/dist/development/src/model/VariablesManager.js.map +0 -1
- package/dist/development/src/model/VariablesQuery.cjs +0 -10
- package/dist/development/src/model/VariablesQuery.cjs.map +0 -1
- package/dist/development/src/model/VariablesQuery.js +0 -10
- package/dist/development/src/model/VariablesQuery.js.map +0 -1
- package/dist/development/src/triggers/TriggerHandler.cjs +0 -127
- package/dist/development/src/triggers/TriggerHandler.cjs.map +0 -1
- package/dist/development/src/triggers/TriggerHandler.js +0 -127
- package/dist/development/src/triggers/TriggerHandler.js.map +0 -1
- package/dist/development/src/triggers/TriggerIndirectChangesFetcher.cjs +0 -63
- package/dist/development/src/triggers/TriggerIndirectChangesFetcher.cjs.map +0 -1
- package/dist/development/src/triggers/TriggerIndirectChangesFetcher.js +0 -63
- package/dist/development/src/triggers/TriggerIndirectChangesFetcher.js.map +0 -1
- package/dist/development/src/triggers/TriggerListenersBuilder.cjs +0 -169
- package/dist/development/src/triggers/TriggerListenersBuilder.cjs.map +0 -1
- package/dist/development/src/triggers/TriggerListenersBuilder.js +0 -169
- package/dist/development/src/triggers/TriggerListenersBuilder.js.map +0 -1
- package/dist/development/src/triggers/TriggerListenersFactory.cjs +0 -17
- package/dist/development/src/triggers/TriggerListenersFactory.cjs.map +0 -1
- package/dist/development/src/triggers/TriggerListenersFactory.js +0 -17
- package/dist/development/src/triggers/TriggerListenersFactory.js.map +0 -1
- package/dist/development/src/triggers/TriggerListenersStore.cjs +0 -24
- package/dist/development/src/triggers/TriggerListenersStore.cjs.map +0 -1
- package/dist/development/src/triggers/TriggerListenersStore.js +0 -24
- package/dist/development/src/triggers/TriggerListenersStore.js.map +0 -1
- package/dist/development/src/triggers/TriggerPayloadBuilder.cjs +0 -149
- package/dist/development/src/triggers/TriggerPayloadBuilder.cjs.map +0 -1
- package/dist/development/src/triggers/TriggerPayloadBuilder.js +0 -149
- package/dist/development/src/triggers/TriggerPayloadBuilder.js.map +0 -1
- package/dist/development/src/triggers/TriggerPayloadManager.cjs +0 -27
- package/dist/development/src/triggers/TriggerPayloadManager.cjs.map +0 -1
- package/dist/development/src/triggers/TriggerPayloadManager.js +0 -27
- package/dist/development/src/triggers/TriggerPayloadManager.js.map +0 -1
- package/dist/development/src/triggers/TriggerPayloadPersister.cjs +0 -47
- package/dist/development/src/triggers/TriggerPayloadPersister.cjs.map +0 -1
- package/dist/development/src/triggers/TriggerPayloadPersister.js +0 -47
- package/dist/development/src/triggers/TriggerPayloadPersister.js.map +0 -1
- package/dist/development/src/utils/assertNever.cjs +0 -7
- package/dist/development/src/utils/assertNever.cjs.map +0 -1
- package/dist/development/src/utils/assertNever.js +0 -7
- package/dist/development/src/utils/assertNever.js.map +0 -1
- package/dist/development/src/utils/map.cjs +0 -13
- package/dist/development/src/utils/map.cjs.map +0 -1
- package/dist/development/src/utils/map.js +0 -13
- package/dist/development/src/utils/map.js.map +0 -1
- package/dist/development/src/utils/notifyChannel.cjs +0 -9
- package/dist/development/src/utils/notifyChannel.cjs.map +0 -1
- package/dist/development/src/utils/notifyChannel.js +0 -9
- package/dist/development/src/utils/notifyChannel.js.map +0 -1
- package/dist/production/index.cjs +0 -99
- package/dist/production/index.cjs.map +0 -1
- package/dist/production/index.js +0 -99
- package/dist/production/index.js.map +0 -1
- package/dist/production/src/ActionsExecutionContainerHookFactory.cjs +0 -30
- package/dist/production/src/ActionsExecutionContainerHookFactory.cjs.map +0 -1
- package/dist/production/src/ActionsExecutionContainerHookFactory.js +0 -30
- package/dist/production/src/ActionsExecutionContainerHookFactory.js.map +0 -1
- package/dist/production/src/ImplementationException.cjs +0 -6
- package/dist/production/src/ImplementationException.cjs.map +0 -1
- package/dist/production/src/ImplementationException.js +0 -6
- package/dist/production/src/ImplementationException.js.map +0 -1
- package/dist/production/src/ListenerStoreProvider.cjs +0 -25
- package/dist/production/src/ListenerStoreProvider.cjs.map +0 -1
- package/dist/production/src/ListenerStoreProvider.js +0 -25
- package/dist/production/src/ListenerStoreProvider.js.map +0 -1
- package/dist/production/src/authorization/ActionsAuthorizationActions.cjs +0 -17
- package/dist/production/src/authorization/ActionsAuthorizationActions.cjs.map +0 -1
- package/dist/production/src/authorization/ActionsAuthorizationActions.js +0 -18
- package/dist/production/src/authorization/ActionsAuthorizationActions.js.map +0 -1
- package/dist/production/src/authorization/ActionsPermissionsFactory.cjs +0 -16
- package/dist/production/src/authorization/ActionsPermissionsFactory.cjs.map +0 -1
- package/dist/production/src/authorization/ActionsPermissionsFactory.js +0 -16
- package/dist/production/src/authorization/ActionsPermissionsFactory.js.map +0 -1
- package/dist/production/src/dispatch/DispatchWorkerSupervisor.cjs +0 -125
- package/dist/production/src/dispatch/DispatchWorkerSupervisor.cjs.map +0 -1
- package/dist/production/src/dispatch/DispatchWorkerSupervisor.js +0 -125
- package/dist/production/src/dispatch/DispatchWorkerSupervisor.js.map +0 -1
- package/dist/production/src/dispatch/EventDispatcher.cjs +0 -43
- package/dist/production/src/dispatch/EventDispatcher.cjs.map +0 -1
- package/dist/production/src/dispatch/EventDispatcher.js +0 -43
- package/dist/production/src/dispatch/EventDispatcher.js.map +0 -1
- package/dist/production/src/dispatch/EventsRepository.cjs +0 -117
- package/dist/production/src/dispatch/EventsRepository.cjs.map +0 -1
- package/dist/production/src/dispatch/EventsRepository.js +0 -117
- package/dist/production/src/dispatch/EventsRepository.js.map +0 -1
- package/dist/production/src/dispatch/ProjectDispatcher.cjs +0 -99
- package/dist/production/src/dispatch/ProjectDispatcher.cjs.map +0 -1
- package/dist/production/src/dispatch/ProjectDispatcher.js +0 -99
- package/dist/production/src/dispatch/ProjectDispatcher.js.map +0 -1
- package/dist/production/src/dispatch/TargetHandlerResolver.cjs +0 -16
- package/dist/production/src/dispatch/TargetHandlerResolver.cjs.map +0 -1
- package/dist/production/src/dispatch/TargetHandlerResolver.js +0 -16
- package/dist/production/src/dispatch/TargetHandlerResolver.js.map +0 -1
- package/dist/production/src/dispatch/WebhookFetcher.cjs +0 -16
- package/dist/production/src/dispatch/WebhookFetcher.cjs.map +0 -1
- package/dist/production/src/dispatch/WebhookFetcher.js +0 -16
- package/dist/production/src/dispatch/WebhookFetcher.js.map +0 -1
- package/dist/production/src/dispatch/WebhookTargetHandler.cjs +0 -196
- package/dist/production/src/dispatch/WebhookTargetHandler.cjs.map +0 -1
- package/dist/production/src/dispatch/WebhookTargetHandler.js +0 -179
- package/dist/production/src/dispatch/WebhookTargetHandler.js.map +0 -1
- package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.cjs +0 -39
- package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.cjs.map +0 -1
- package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.js +0 -39
- package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.js.map +0 -1
- package/dist/production/src/graphql/http/ActionsContextResolver.cjs +0 -39
- package/dist/production/src/graphql/http/ActionsContextResolver.cjs.map +0 -1
- package/dist/production/src/graphql/http/ActionsContextResolver.js +0 -39
- package/dist/production/src/graphql/http/ActionsContextResolver.js.map +0 -1
- package/dist/production/src/graphql/http/ActionsGraphQLHandlerFactory.cjs +0 -20
- package/dist/production/src/graphql/http/ActionsGraphQLHandlerFactory.cjs.map +0 -1
- package/dist/production/src/graphql/http/ActionsGraphQLHandlerFactory.js +0 -20
- package/dist/production/src/graphql/http/ActionsGraphQLHandlerFactory.js.map +0 -1
- package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.cjs +0 -149
- package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.cjs.map +0 -1
- package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.js +0 -132
- package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.js.map +0 -1
- package/dist/production/src/graphql/resolvers/ResolversFactory.cjs +0 -36
- package/dist/production/src/graphql/resolvers/ResolversFactory.cjs.map +0 -1
- package/dist/production/src/graphql/resolvers/ResolversFactory.js +0 -36
- package/dist/production/src/graphql/resolvers/ResolversFactory.js.map +0 -1
- package/dist/production/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.cjs +0 -19
- package/dist/production/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.cjs.map +0 -1
- package/dist/production/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js +0 -19
- package/dist/production/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js.map +0 -1
- package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs +0 -21
- package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs.map +0 -1
- package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.js +0 -21
- package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.js.map +0 -1
- package/dist/production/src/graphql/resolvers/mutation/SetVariablesMutationResolver.cjs +0 -19
- package/dist/production/src/graphql/resolvers/mutation/SetVariablesMutationResolver.cjs.map +0 -1
- package/dist/production/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js +0 -19
- package/dist/production/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js.map +0 -1
- package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs +0 -19
- package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs.map +0 -1
- package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.js +0 -19
- package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.js.map +0 -1
- package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.cjs +0 -61
- package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +0 -1
- package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.js +0 -61
- package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.js.map +0 -1
- package/dist/production/src/graphql/resolvers/query/VariablesQueryResolver.cjs +0 -19
- package/dist/production/src/graphql/resolvers/query/VariablesQueryResolver.cjs.map +0 -1
- package/dist/production/src/graphql/resolvers/query/VariablesQueryResolver.js +0 -19
- package/dist/production/src/graphql/resolvers/query/VariablesQueryResolver.js.map +0 -1
- package/dist/production/src/graphql/schema/actions.graphql.cjs +0 -107
- package/dist/production/src/graphql/schema/actions.graphql.cjs.map +0 -1
- package/dist/production/src/graphql/schema/actions.graphql.js +0 -107
- package/dist/production/src/graphql/schema/actions.graphql.js.map +0 -1
- package/dist/production/src/migrations/2023-03-10-145000-actions-variables.cjs +0 -16
- package/dist/production/src/migrations/2023-03-10-145000-actions-variables.cjs.map +0 -1
- package/dist/production/src/migrations/2023-03-10-145000-actions-variables.js +0 -17
- package/dist/production/src/migrations/2023-03-10-145000-actions-variables.js.map +0 -1
- package/dist/production/src/migrations/2025-05-28-160000-action-event-user.cjs +0 -16
- package/dist/production/src/migrations/2025-05-28-160000-action-event-user.cjs.map +0 -1
- package/dist/production/src/migrations/2025-05-28-160000-action-event-user.js +0 -17
- package/dist/production/src/migrations/2025-05-28-160000-action-event-user.js.map +0 -1
- package/dist/production/src/migrations/index.cjs +0 -12
- package/dist/production/src/migrations/index.cjs.map +0 -1
- package/dist/production/src/migrations/index.js +0 -12
- package/dist/production/src/migrations/index.js.map +0 -1
- package/dist/production/src/migrations/snapshot.cjs +0 -51
- package/dist/production/src/migrations/snapshot.cjs.map +0 -1
- package/dist/production/src/migrations/snapshot.js +0 -52
- package/dist/production/src/migrations/snapshot.js.map +0 -1
- package/dist/production/src/model/EventByIdQuery.cjs +0 -17
- package/dist/production/src/model/EventByIdQuery.cjs.map +0 -1
- package/dist/production/src/model/EventByIdQuery.js +0 -17
- package/dist/production/src/model/EventByIdQuery.js.map +0 -1
- package/dist/production/src/model/EventsInProcessingQuery.cjs +0 -14
- package/dist/production/src/model/EventsInProcessingQuery.cjs.map +0 -1
- package/dist/production/src/model/EventsInProcessingQuery.js +0 -14
- package/dist/production/src/model/EventsInProcessingQuery.js.map +0 -1
- package/dist/production/src/model/EventsToProcessQuery.cjs +0 -15
- package/dist/production/src/model/EventsToProcessQuery.cjs.map +0 -1
- package/dist/production/src/model/EventsToProcessQuery.js +0 -15
- package/dist/production/src/model/EventsToProcessQuery.js.map +0 -1
- package/dist/production/src/model/EventsToProcessSpecification.cjs +0 -8
- package/dist/production/src/model/EventsToProcessSpecification.cjs.map +0 -1
- package/dist/production/src/model/EventsToProcessSpecification.js +0 -8
- package/dist/production/src/model/EventsToProcessSpecification.js.map +0 -1
- package/dist/production/src/model/FailedEventsQuery.cjs +0 -14
- package/dist/production/src/model/FailedEventsQuery.cjs.map +0 -1
- package/dist/production/src/model/FailedEventsQuery.js +0 -14
- package/dist/production/src/model/FailedEventsQuery.js.map +0 -1
- package/dist/production/src/model/SetVariableCommand.cjs +0 -21
- package/dist/production/src/model/SetVariableCommand.cjs.map +0 -1
- package/dist/production/src/model/SetVariableCommand.js +0 -21
- package/dist/production/src/model/SetVariableCommand.js.map +0 -1
- package/dist/production/src/model/VariablesManager.cjs +0 -41
- package/dist/production/src/model/VariablesManager.cjs.map +0 -1
- package/dist/production/src/model/VariablesManager.js +0 -41
- package/dist/production/src/model/VariablesManager.js.map +0 -1
- package/dist/production/src/model/VariablesQuery.cjs +0 -10
- package/dist/production/src/model/VariablesQuery.cjs.map +0 -1
- package/dist/production/src/model/VariablesQuery.js +0 -10
- package/dist/production/src/model/VariablesQuery.js.map +0 -1
- package/dist/production/src/triggers/TriggerHandler.cjs +0 -127
- package/dist/production/src/triggers/TriggerHandler.cjs.map +0 -1
- package/dist/production/src/triggers/TriggerHandler.js +0 -127
- package/dist/production/src/triggers/TriggerHandler.js.map +0 -1
- package/dist/production/src/triggers/TriggerIndirectChangesFetcher.cjs +0 -63
- package/dist/production/src/triggers/TriggerIndirectChangesFetcher.cjs.map +0 -1
- package/dist/production/src/triggers/TriggerIndirectChangesFetcher.js +0 -63
- package/dist/production/src/triggers/TriggerIndirectChangesFetcher.js.map +0 -1
- package/dist/production/src/triggers/TriggerListenersBuilder.cjs +0 -169
- package/dist/production/src/triggers/TriggerListenersBuilder.cjs.map +0 -1
- package/dist/production/src/triggers/TriggerListenersBuilder.js +0 -169
- package/dist/production/src/triggers/TriggerListenersBuilder.js.map +0 -1
- package/dist/production/src/triggers/TriggerListenersFactory.cjs +0 -17
- package/dist/production/src/triggers/TriggerListenersFactory.cjs.map +0 -1
- package/dist/production/src/triggers/TriggerListenersFactory.js +0 -17
- package/dist/production/src/triggers/TriggerListenersFactory.js.map +0 -1
- package/dist/production/src/triggers/TriggerListenersStore.cjs +0 -24
- package/dist/production/src/triggers/TriggerListenersStore.cjs.map +0 -1
- package/dist/production/src/triggers/TriggerListenersStore.js +0 -24
- package/dist/production/src/triggers/TriggerListenersStore.js.map +0 -1
- package/dist/production/src/triggers/TriggerPayloadBuilder.cjs +0 -149
- package/dist/production/src/triggers/TriggerPayloadBuilder.cjs.map +0 -1
- package/dist/production/src/triggers/TriggerPayloadBuilder.js +0 -149
- package/dist/production/src/triggers/TriggerPayloadBuilder.js.map +0 -1
- package/dist/production/src/triggers/TriggerPayloadManager.cjs +0 -27
- package/dist/production/src/triggers/TriggerPayloadManager.cjs.map +0 -1
- package/dist/production/src/triggers/TriggerPayloadManager.js +0 -27
- package/dist/production/src/triggers/TriggerPayloadManager.js.map +0 -1
- package/dist/production/src/triggers/TriggerPayloadPersister.cjs +0 -47
- package/dist/production/src/triggers/TriggerPayloadPersister.cjs.map +0 -1
- package/dist/production/src/triggers/TriggerPayloadPersister.js +0 -47
- package/dist/production/src/triggers/TriggerPayloadPersister.js.map +0 -1
- package/dist/production/src/utils/assertNever.cjs +0 -7
- package/dist/production/src/utils/assertNever.cjs.map +0 -1
- package/dist/production/src/utils/assertNever.js +0 -7
- package/dist/production/src/utils/assertNever.js.map +0 -1
- package/dist/production/src/utils/map.cjs +0 -13
- package/dist/production/src/utils/map.cjs.map +0 -1
- package/dist/production/src/utils/map.js +0 -13
- package/dist/production/src/utils/map.js.map +0 -1
- package/dist/production/src/utils/notifyChannel.cjs +0 -9
- package/dist/production/src/utils/notifyChannel.cjs.map +0 -1
- package/dist/production/src/utils/notifyChannel.js +0 -9
- package/dist/production/src/utils/notifyChannel.js.map +0 -1
- package/dist/tests/cases/unit/generator.test.d.ts +0 -2
- package/dist/tests/cases/unit/generator.test.d.ts.map +0 -1
- package/dist/tests/cases/unit/webhookHandler.test.d.ts +0 -2
- package/dist/tests/cases/unit/webhookHandler.test.d.ts.map +0 -1
- package/dist/tests/src/gql.d.ts +0 -2
- package/dist/tests/src/gql.d.ts.map +0 -1
- package/dist/tests/src/uuid.d.ts +0 -3
- package/dist/tests/src/uuid.d.ts.map +0 -1
- package/dist/tests/tsconfig.tsbuildinfo +0 -1
- package/dist/types/ActionsExecutionContainerHookFactory.d.ts +0 -8
- package/dist/types/ActionsExecutionContainerHookFactory.d.ts.map +0 -1
- package/dist/types/ImplementationException.d.ts +0 -3
- package/dist/types/ImplementationException.d.ts.map +0 -1
- package/dist/types/ListenerStoreProvider.d.ts +0 -7
- package/dist/types/ListenerStoreProvider.d.ts.map +0 -1
- package/dist/types/authorization/ActionsAuthorizationActions.d.ts +0 -38
- package/dist/types/authorization/ActionsAuthorizationActions.d.ts.map +0 -1
- package/dist/types/authorization/ActionsPermissionsFactory.d.ts +0 -5
- package/dist/types/authorization/ActionsPermissionsFactory.d.ts.map +0 -1
- package/dist/types/authorization/Identity.d.ts +0 -5
- package/dist/types/authorization/Identity.d.ts.map +0 -1
- package/dist/types/authorization/index.d.ts +0 -4
- package/dist/types/authorization/index.d.ts.map +0 -1
- package/dist/types/dispatch/DispatchWorkerSupervisor.d.ts +0 -17
- package/dist/types/dispatch/DispatchWorkerSupervisor.d.ts.map +0 -1
- package/dist/types/dispatch/EventDispatcher.d.ts +0 -25
- package/dist/types/dispatch/EventDispatcher.d.ts.map +0 -1
- package/dist/types/dispatch/EventsRepository.d.ts +0 -23
- package/dist/types/dispatch/EventsRepository.d.ts.map +0 -1
- package/dist/types/dispatch/ProjectDispatcher.d.ts +0 -22
- package/dist/types/dispatch/ProjectDispatcher.d.ts.map +0 -1
- package/dist/types/dispatch/TargetHandlerResolver.d.ts +0 -9
- package/dist/types/dispatch/TargetHandlerResolver.d.ts.map +0 -1
- package/dist/types/dispatch/WebhookFetcher.d.ts +0 -14
- package/dist/types/dispatch/WebhookFetcher.d.ts.map +0 -1
- package/dist/types/dispatch/WebhookTargetHandler.d.ts +0 -16
- package/dist/types/dispatch/WebhookTargetHandler.d.ts.map +0 -1
- package/dist/types/dispatch/types.d.ts +0 -27
- package/dist/types/dispatch/types.d.ts.map +0 -1
- package/dist/types/graphql/http/ActionsApiMiddlewareFactory.d.ts +0 -13
- package/dist/types/graphql/http/ActionsApiMiddlewareFactory.d.ts.map +0 -1
- package/dist/types/graphql/http/ActionsContextResolver.d.ts +0 -14
- package/dist/types/graphql/http/ActionsContextResolver.d.ts.map +0 -1
- package/dist/types/graphql/http/ActionsGraphQLHandlerFactory.d.ts +0 -8
- package/dist/types/graphql/http/ActionsGraphQLHandlerFactory.d.ts.map +0 -1
- package/dist/types/graphql/http/ActionsWebsocketControllerFactory.d.ts +0 -11
- package/dist/types/graphql/http/ActionsWebsocketControllerFactory.d.ts.map +0 -1
- package/dist/types/graphql/resolvers/ActionsContext.d.ts +0 -14
- package/dist/types/graphql/resolvers/ActionsContext.d.ts.map +0 -1
- package/dist/types/graphql/resolvers/ResolversFactory.d.ts +0 -15
- package/dist/types/graphql/resolvers/ResolversFactory.d.ts.map +0 -1
- package/dist/types/graphql/resolvers/index.d.ts +0 -3
- package/dist/types/graphql/resolvers/index.d.ts.map +0 -1
- package/dist/types/graphql/resolvers/mutation/ProcessBatchMutationResolver.d.ts +0 -11
- package/dist/types/graphql/resolvers/mutation/ProcessBatchMutationResolver.d.ts.map +0 -1
- package/dist/types/graphql/resolvers/mutation/RetryEventMutationResolver.d.ts +0 -11
- package/dist/types/graphql/resolvers/mutation/RetryEventMutationResolver.d.ts.map +0 -1
- package/dist/types/graphql/resolvers/mutation/SetVariablesMutationResolver.d.ts +0 -11
- package/dist/types/graphql/resolvers/mutation/SetVariablesMutationResolver.d.ts.map +0 -1
- package/dist/types/graphql/resolvers/mutation/StopEventMutationResolver.d.ts +0 -11
- package/dist/types/graphql/resolvers/mutation/StopEventMutationResolver.d.ts.map +0 -1
- package/dist/types/graphql/resolvers/mutation/index.d.ts +0 -5
- package/dist/types/graphql/resolvers/mutation/index.d.ts.map +0 -1
- package/dist/types/graphql/resolvers/query/EventsQueryResolver.d.ts +0 -14
- package/dist/types/graphql/resolvers/query/EventsQueryResolver.d.ts.map +0 -1
- package/dist/types/graphql/resolvers/query/VariablesQueryResolver.d.ts +0 -12
- package/dist/types/graphql/resolvers/query/VariablesQueryResolver.d.ts.map +0 -1
- package/dist/types/graphql/resolvers/query/index.d.ts +0 -2
- package/dist/types/graphql/resolvers/query/index.d.ts.map +0 -1
- package/dist/types/graphql/schema/actions.graphql.d.ts +0 -3
- package/dist/types/graphql/schema/actions.graphql.d.ts.map +0 -1
- package/dist/types/graphql/schema/index.d.ts +0 -299
- package/dist/types/graphql/schema/index.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -13
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/migrations/2023-03-10-145000-actions-variables.d.ts +0 -3
- package/dist/types/migrations/2023-03-10-145000-actions-variables.d.ts.map +0 -1
- package/dist/types/migrations/2025-05-28-160000-action-event-user.d.ts +0 -3
- package/dist/types/migrations/2025-05-28-160000-action-event-user.d.ts.map +0 -1
- package/dist/types/migrations/index.d.ts +0 -3
- package/dist/types/migrations/index.d.ts.map +0 -1
- package/dist/types/migrations/snapshot.d.ts +0 -3
- package/dist/types/migrations/snapshot.d.ts.map +0 -1
- package/dist/types/model/EventByIdQuery.d.ts +0 -8
- package/dist/types/model/EventByIdQuery.d.ts.map +0 -1
- package/dist/types/model/EventsInProcessingQuery.d.ts +0 -9
- package/dist/types/model/EventsInProcessingQuery.d.ts.map +0 -1
- package/dist/types/model/EventsToProcessQuery.d.ts +0 -9
- package/dist/types/model/EventsToProcessQuery.d.ts.map +0 -1
- package/dist/types/model/EventsToProcessSpecification.d.ts +0 -4
- package/dist/types/model/EventsToProcessSpecification.d.ts.map +0 -1
- package/dist/types/model/FailedEventsQuery.d.ts +0 -9
- package/dist/types/model/FailedEventsQuery.d.ts.map +0 -1
- package/dist/types/model/SetVariableCommand.d.ts +0 -8
- package/dist/types/model/SetVariableCommand.d.ts.map +0 -1
- package/dist/types/model/VariablesManager.d.ts +0 -8
- package/dist/types/model/VariablesManager.d.ts.map +0 -1
- package/dist/types/model/VariablesQuery.d.ts +0 -12
- package/dist/types/model/VariablesQuery.d.ts.map +0 -1
- package/dist/types/model/types.d.ts +0 -22
- package/dist/types/model/types.d.ts.map +0 -1
- package/dist/types/triggers/TriggerHandler.d.ts +0 -26
- package/dist/types/triggers/TriggerHandler.d.ts.map +0 -1
- package/dist/types/triggers/TriggerIndirectChangesFetcher.d.ts +0 -19
- package/dist/types/triggers/TriggerIndirectChangesFetcher.d.ts.map +0 -1
- package/dist/types/triggers/TriggerListeners.d.ts +0 -9
- package/dist/types/triggers/TriggerListeners.d.ts.map +0 -1
- package/dist/types/triggers/TriggerListenersBuilder.d.ts +0 -15
- package/dist/types/triggers/TriggerListenersBuilder.d.ts.map +0 -1
- package/dist/types/triggers/TriggerListenersFactory.d.ts +0 -8
- package/dist/types/triggers/TriggerListenersFactory.d.ts.map +0 -1
- package/dist/types/triggers/TriggerListenersStore.d.ts +0 -48
- package/dist/types/triggers/TriggerListenersStore.d.ts.map +0 -1
- package/dist/types/triggers/TriggerPayloadBuilder.d.ts +0 -14
- package/dist/types/triggers/TriggerPayloadBuilder.d.ts.map +0 -1
- package/dist/types/triggers/TriggerPayloadManager.d.ts +0 -22
- package/dist/types/triggers/TriggerPayloadManager.d.ts.map +0 -1
- package/dist/types/triggers/TriggerPayloadPersister.d.ts +0 -21
- package/dist/types/triggers/TriggerPayloadPersister.d.ts.map +0 -1
- package/dist/types/triggers/index.d.ts +0 -8
- package/dist/types/triggers/index.d.ts.map +0 -1
- package/dist/types/tsconfig.tsbuildinfo +0 -1
- package/dist/types/utils/assertNever.d.ts +0 -2
- package/dist/types/utils/assertNever.d.ts.map +0 -1
- package/dist/types/utils/map.d.ts +0 -2
- package/dist/types/utils/map.d.ts.map +0 -1
- package/dist/types/utils/notifyChannel.d.ts +0 -4
- package/dist/types/utils/notifyChannel.d.ts.map +0 -1
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { AcquiringListener } from "@contember/database";
|
|
2
|
-
import { Supervisor } from "@contember/engine-common";
|
|
3
|
-
import { ImplementationException } from "../ImplementationException.js";
|
|
4
|
-
class DispatchWorkerSupervisorFactory {
|
|
5
|
-
constructor(projectDispatcherFactory) {
|
|
6
|
-
this.projectDispatcherFactory = projectDispatcherFactory;
|
|
7
|
-
}
|
|
8
|
-
create(projectGroup) {
|
|
9
|
-
return new DispatchWorkerSupervisor(this.projectDispatcherFactory, projectGroup);
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
class DispatchWorkerSupervisor {
|
|
13
|
-
constructor(projectDispatcherFactory, projectGroup) {
|
|
14
|
-
this.projectDispatcherFactory = projectDispatcherFactory;
|
|
15
|
-
this.projectGroup = projectGroup;
|
|
16
|
-
}
|
|
17
|
-
async run({ logger, onError }) {
|
|
18
|
-
const projectGroup = this.projectGroup;
|
|
19
|
-
const tenantContainer = projectGroup.tenantContainer;
|
|
20
|
-
const projectContainerResolver = projectGroup.projectContainerResolver;
|
|
21
|
-
const running = /* @__PURE__ */ new Map();
|
|
22
|
-
const cleanupListener = projectContainerResolver.on("destroy", async ({ container }) => {
|
|
23
|
-
const runningForProject = running.get(container.project.slug);
|
|
24
|
-
if (!runningForProject) {
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
running.delete(container.project.slug);
|
|
28
|
-
await (await runningForProject.worker).end();
|
|
29
|
-
});
|
|
30
|
-
const refreshProjectWorker = async (container, isReloading) => {
|
|
31
|
-
const db = container.systemDatabaseContext;
|
|
32
|
-
const current = running.get(container.project.slug);
|
|
33
|
-
if (current && current.container === container) {
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
const dispatcher = this.projectDispatcherFactory.create({
|
|
37
|
-
db,
|
|
38
|
-
contentSchemaResolver: container.contentSchemaResolver,
|
|
39
|
-
projectSlug: container.project.slug
|
|
40
|
-
});
|
|
41
|
-
const supervisedDispatcher = new Supervisor(
|
|
42
|
-
dispatcher,
|
|
43
|
-
{ startupMax: isReloading ? Number.MAX_VALUE : 10 }
|
|
44
|
-
);
|
|
45
|
-
const worker = supervisedDispatcher.run({
|
|
46
|
-
logger,
|
|
47
|
-
onError: () => {
|
|
48
|
-
throw new ImplementationException("supervised project dispatcher crashed");
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
running.set(container.project.slug, { worker, container });
|
|
52
|
-
try {
|
|
53
|
-
if (current) {
|
|
54
|
-
await (await current.worker).end();
|
|
55
|
-
}
|
|
56
|
-
await worker;
|
|
57
|
-
logger.debug("Project dispatch worker started", { project: container.project.slug });
|
|
58
|
-
} catch (e) {
|
|
59
|
-
logger.error(e, { message: "Project dispatch worker start failed", project: container.project.slug });
|
|
60
|
-
running.delete(container.project.slug);
|
|
61
|
-
throw e;
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
const projectTracker = new Supervisor(new AcquiringListener(
|
|
65
|
-
tenantContainer.databaseContext.client,
|
|
66
|
-
"project_updated",
|
|
67
|
-
async () => {
|
|
68
|
-
logger.debug("Project config change detected, reloading dispatch workers");
|
|
69
|
-
await endProjectWorkers();
|
|
70
|
-
try {
|
|
71
|
-
await startWorkers(true);
|
|
72
|
-
} catch (e) {
|
|
73
|
-
logger.error(e, { message: "Dispatch workers reload failed, terminating" });
|
|
74
|
-
await endAll();
|
|
75
|
-
onError(e);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
));
|
|
79
|
-
const runningProjectTracker = await projectTracker.run({
|
|
80
|
-
logger,
|
|
81
|
-
onError: () => {
|
|
82
|
-
throw new ImplementationException("supervised project tracker crashed");
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
const fetchProjects = async () => await tenantContainer.projectManager.getProjects(tenantContainer.databaseContext);
|
|
86
|
-
const startWorkers = async (isReloading) => {
|
|
87
|
-
try {
|
|
88
|
-
const projects = await fetchProjects();
|
|
89
|
-
for (const project of projects) {
|
|
90
|
-
const container = await projectGroup.projectContainerResolver.getProjectContainer(project.slug);
|
|
91
|
-
if (container) {
|
|
92
|
-
await refreshProjectWorker(container, isReloading);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
} catch (e) {
|
|
96
|
-
await endAll();
|
|
97
|
-
throw e;
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
const endProjectWorkers = async () => {
|
|
101
|
-
const workers = [...running.values()];
|
|
102
|
-
running.clear();
|
|
103
|
-
await Promise.allSettled(workers.map(async ({ worker }) => await (await worker).end()));
|
|
104
|
-
};
|
|
105
|
-
const endAll = async () => {
|
|
106
|
-
logger.debug("Terminating project dispatch workers...");
|
|
107
|
-
cleanupListener();
|
|
108
|
-
try {
|
|
109
|
-
await runningProjectTracker.end();
|
|
110
|
-
} catch {
|
|
111
|
-
}
|
|
112
|
-
await endProjectWorkers();
|
|
113
|
-
logger.debug("Project dispatch workers terminated");
|
|
114
|
-
};
|
|
115
|
-
await startWorkers(false);
|
|
116
|
-
return {
|
|
117
|
-
end: endAll
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
export {
|
|
122
|
-
DispatchWorkerSupervisor,
|
|
123
|
-
DispatchWorkerSupervisorFactory
|
|
124
|
-
};
|
|
125
|
-
//# sourceMappingURL=DispatchWorkerSupervisor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DispatchWorkerSupervisor.js","sources":["../../../../../packages/engine-actions/src/dispatch/DispatchWorkerSupervisor.ts"],"sourcesContent":["import { ProjectContainer, ProjectGroupContainer } from '@contember/engine-http'\nimport { AcquiringListener } from '@contember/database'\nimport { Runnable, RunnableArgs, Running, Supervisor } from '@contember/engine-common'\nimport { ProjectDispatcherFactory } from './ProjectDispatcher'\nimport { Logger } from '@contember/logger'\nimport { ImplementationException } from '../ImplementationException'\n\nexport class DispatchWorkerSupervisorFactory {\n\n\tconstructor(\n\t\tprivate projectDispatcherFactory: ProjectDispatcherFactory,\n\t) {\n\t}\n\n\tpublic create(projectGroup: ProjectGroupContainer): DispatchWorkerSupervisor {\n\t\treturn new DispatchWorkerSupervisor(this.projectDispatcherFactory, projectGroup)\n\t}\n}\n\nexport class DispatchWorkerSupervisor implements Runnable {\n\tconstructor(\n\t\tprivate projectDispatcherFactory: ProjectDispatcherFactory,\n\t\tprivate projectGroup: ProjectGroupContainer,\n\t) {\n\t}\n\n\tpublic async run({ logger, onError }: RunnableArgs) {\n\t\tconst projectGroup = this.projectGroup\n\t\tconst tenantContainer = projectGroup.tenantContainer\n\t\tconst projectContainerResolver = projectGroup.projectContainerResolver\n\n\t\tconst running = new Map<string, { worker: Promise<Running>; container: ProjectContainer }>()\n\n\t\tconst cleanupListener = projectContainerResolver.on('destroy', async ({ container }) => {\n\t\t\tconst runningForProject = running.get(container.project.slug)\n\t\t\tif (!runningForProject) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\trunning.delete(container.project.slug)\n\t\t\tawait (await runningForProject.worker).end()\n\t\t})\n\n\t\tconst refreshProjectWorker = async (container: ProjectContainer, isReloading: boolean) => {\n\t\t\tconst db = container.systemDatabaseContext\n\t\t\tconst current = running.get(container.project.slug)\n\t\t\tif (current && current.container === container) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst dispatcher = this.projectDispatcherFactory.create({\n\t\t\t\tdb,\n\t\t\t\tcontentSchemaResolver: container.contentSchemaResolver,\n\t\t\t\tprojectSlug: container.project.slug,\n\t\t\t})\n\t\t\tconst supervisedDispatcher = new Supervisor(\n\t\t\t\tdispatcher,\n\t\t\t\t{ startupMax: isReloading ? Number.MAX_VALUE : 10 },\n\t\t\t)\n\t\t\tconst worker = supervisedDispatcher.run({\n\t\t\t\tlogger,\n\t\t\t\tonError: () => {\n\t\t\t\t\tthrow new ImplementationException('supervised project dispatcher crashed')\n\t\t\t\t},\n\t\t\t})\n\t\t\trunning.set(container.project.slug, { worker, container })\n\t\t\ttry {\n\t\t\t\tif (current) {\n\t\t\t\t\tawait (await current.worker).end()\n\t\t\t\t}\n\t\t\t\tawait worker\n\t\t\t\tlogger.debug('Project dispatch worker started', { project: container.project.slug })\n\t\t\t} catch (e) {\n\t\t\t\tlogger.error(e, { message: 'Project dispatch worker start failed', project: container.project.slug })\n\t\t\t\trunning.delete(container.project.slug)\n\t\t\t\tthrow e\n\t\t\t}\n\t\t}\n\t\tconst projectTracker = new Supervisor(new AcquiringListener(\n\t\t\ttenantContainer.databaseContext.client,\n\t\t\t'project_updated',\n\t\t\tasync () => {\n\t\t\t\tlogger.debug('Project config change detected, reloading dispatch workers')\n\t\t\t\tawait endProjectWorkers()\n\t\t\t\ttry {\n\t\t\t\t\tawait startWorkers(true)\n\t\t\t\t} catch (e) {\n\t\t\t\t\tlogger.error(e, { message: 'Dispatch workers reload failed, terminating' })\n\t\t\t\t\tawait endAll()\n\t\t\t\t\tonError(e)\n\t\t\t\t}\n\t\t\t},\n\t\t))\n\n\t\tconst runningProjectTracker = await projectTracker.run({\n\t\t\tlogger,\n\t\t\tonError: () => {\n\t\t\t\tthrow new ImplementationException('supervised project tracker crashed')\n\t\t\t},\n\t\t})\n\t\tconst fetchProjects = async () => await tenantContainer.projectManager.getProjects(tenantContainer.databaseContext)\n\n\t\tconst startWorkers = async (isReloading: boolean) => {\n\t\t\ttry {\n\t\t\t\tconst projects = await fetchProjects()\n\t\t\t\tfor (const project of projects) {\n\t\t\t\t\tconst container = await projectGroup.projectContainerResolver.getProjectContainer(project.slug)\n\t\t\t\t\tif (container) {\n\t\t\t\t\t\tawait refreshProjectWorker(container, isReloading)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tawait endAll()\n\t\t\t\tthrow e\n\t\t\t}\n\t\t}\n\t\tconst endProjectWorkers = async () => {\n\t\t\tconst workers = [...running.values()]\n\t\t\trunning.clear()\n\t\t\tawait Promise.allSettled(workers.map(async ({ worker }) => await (await worker).end()))\n\t\t}\n\t\tconst endAll = async () => {\n\t\t\tlogger.debug('Terminating project dispatch workers...')\n\t\t\tcleanupListener()\n\t\t\ttry {\n\t\t\t\tawait runningProjectTracker.end()\n\t\t\t} catch {\n\t\t\t}\n\t\t\tawait endProjectWorkers()\n\t\t\tlogger.debug('Project dispatch workers terminated')\n\t\t}\n\n\t\tawait startWorkers(false)\n\n\t\treturn {\n\t\t\tend: endAll,\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
class EventDispatcher {
|
|
4
|
-
constructor(eventsRepository, variablesManager, invokeResolver) {
|
|
5
|
-
this.eventsRepository = eventsRepository;
|
|
6
|
-
this.variablesManager = variablesManager;
|
|
7
|
-
this.invokeResolver = invokeResolver;
|
|
8
|
-
}
|
|
9
|
-
async processBatch({ db, contentSchemaResolver, logger }) {
|
|
10
|
-
const schema = (await contentSchemaResolver.getSchema({ db, normalize: true })).schema;
|
|
11
|
-
const batch = await this.eventsRepository.fetchBatch(schema.actions, db.client);
|
|
12
|
-
const batchId = Math.random().toString().substring(2);
|
|
13
|
-
const batchLogger = logger.child({ loc: "Actions.EventDispatcher", batchId });
|
|
14
|
-
if (!batch.ok) {
|
|
15
|
-
batchLogger.debug("Nothing to process", {
|
|
16
|
-
backoffMs: batch.backoffMs ?? "undefined"
|
|
17
|
-
});
|
|
18
|
-
return { failed: 0, succeed: 0, backoffMs: batch.backoffMs };
|
|
19
|
-
}
|
|
20
|
-
const { target, events } = batch;
|
|
21
|
-
try {
|
|
22
|
-
const handler = this.invokeResolver.resolveHandler(target);
|
|
23
|
-
batchLogger.debug("Processing started", {
|
|
24
|
-
events: batch.events.map((it) => it.id)
|
|
25
|
-
});
|
|
26
|
-
const variables = await this.variablesManager.fetchVariables(db);
|
|
27
|
-
const handledEvents = await handler.handle({ target, events, logger: batchLogger, variables });
|
|
28
|
-
const [succeed, failed] = await this.eventsRepository.persistProcessed(db.client, handledEvents);
|
|
29
|
-
batchLogger.debug("Processing done", { succeed, failed });
|
|
30
|
-
return { succeed, failed, backoffMs: 0 };
|
|
31
|
-
} catch (e) {
|
|
32
|
-
logger.error(e, { loc: "EventDispatcher", batchId });
|
|
33
|
-
const failedEvents = events.map((it) => ({
|
|
34
|
-
row: it,
|
|
35
|
-
result: { ok: false, errorMessage: `Internal error` }
|
|
36
|
-
}));
|
|
37
|
-
await this.eventsRepository.persistProcessed(db.client, failedEvents);
|
|
38
|
-
return { succeed: 0, failed: batch.events.length, backoffMs: 0 };
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
exports.EventDispatcher = EventDispatcher;
|
|
43
|
-
//# sourceMappingURL=EventDispatcher.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EventDispatcher.cjs","sources":["../../../../../packages/engine-actions/src/dispatch/EventDispatcher.ts"],"sourcesContent":["import { EventsRepository } from './EventsRepository'\nimport { TargetHandlerResolver } from './TargetHandlerResolver'\nimport { HandledEvent } from './types'\nimport { Logger } from '@contember/logger'\nimport { ContentSchemaResolver } from '@contember/engine-http'\nimport { DatabaseContext } from '@contember/engine-system-api'\nimport { VariablesManager } from '../model/VariablesManager'\n\n\ntype ProcessBatchArgs = {\n\tdb: DatabaseContext\n\tcontentSchemaResolver: ContentSchemaResolver\n\tlogger: Logger\n}\n\ntype ProcessBatchResult = {\n\tsucceed: number\n\tfailed: number\n\tbackoffMs: number | undefined\n}\n\nexport class EventDispatcher {\n\n\tconstructor(\n\t\tprivate readonly eventsRepository: EventsRepository,\n\t\tprivate readonly variablesManager: VariablesManager,\n\t\tprivate readonly invokeResolver: TargetHandlerResolver,\n\t) {\n\t}\n\n\tasync processBatch({ db, contentSchemaResolver, logger }: ProcessBatchArgs): Promise<ProcessBatchResult> {\n\t\tconst schema = (await contentSchemaResolver.getSchema({ db, normalize: true })).schema\n\t\tconst batch = await this.eventsRepository.fetchBatch(schema.actions, db.client)\n\t\tconst batchId = Math.random().toString().substring(2)\n\t\tconst batchLogger = logger.child({ loc: 'Actions.EventDispatcher', batchId })\n\t\tif (!batch.ok) {\n\t\t\tbatchLogger.debug('Nothing to process', {\n\t\t\t\tbackoffMs: batch.backoffMs ?? 'undefined',\n\t\t\t})\n\t\t\treturn { failed: 0, succeed: 0, backoffMs: batch.backoffMs }\n\t\t}\n\t\tconst { target, events } = batch\n\t\ttry {\n\t\t\tconst handler = this.invokeResolver.resolveHandler(target)\n\t\t\tbatchLogger.debug('Processing started', {\n\t\t\t\tevents: batch.events.map(it => it.id),\n\t\t\t})\n\t\t\tconst variables = await this.variablesManager.fetchVariables(db)\n\t\t\tconst handledEvents = await handler.handle({ target, events, logger: batchLogger, variables })\n\t\t\tconst [succeed, failed] = await this.eventsRepository.persistProcessed(db.client, handledEvents)\n\t\t\tbatchLogger.debug('Processing done', { succeed, failed })\n\t\t\treturn { succeed, failed, backoffMs: 0 }\n\t\t} catch (e) {\n\t\t\tlogger.error(e, { loc: 'EventDispatcher', batchId })\n\t\t\tconst failedEvents = events.map((it): HandledEvent => ({\n\t\t\t\trow: it,\n\t\t\t\tresult: { ok: false, errorMessage: `Internal error` },\n\t\t\t}))\n\t\t\tawait this.eventsRepository.persistProcessed(db.client, failedEvents)\n\n\t\t\treturn { succeed: 0, failed: batch.events.length, backoffMs: 0 }\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;AAqBO,MAAM,gBAAgB;AAAA,EAE5B,YACkB,kBACA,kBACA,gBAChB;AAHgB,SAAA,mBAAA;AACA,SAAA,mBAAA;AACA,SAAA,iBAAA;AAAA,EAAA;AAAA,EAIlB,MAAM,aAAa,EAAE,IAAI,uBAAuB,UAAyD;AAClG,UAAA,UAAU,MAAM,sBAAsB,UAAU,EAAE,IAAI,WAAW,KAAM,CAAA,GAAG;AAC1E,UAAA,QAAQ,MAAM,KAAK,iBAAiB,WAAW,OAAO,SAAS,GAAG,MAAM;AAC9E,UAAM,UAAU,KAAK,OAAA,EAAS,SAAS,EAAE,UAAU,CAAC;AACpD,UAAM,cAAc,OAAO,MAAM,EAAE,KAAK,2BAA2B,SAAS;AACxE,QAAA,CAAC,MAAM,IAAI;AACd,kBAAY,MAAM,sBAAsB;AAAA,QACvC,WAAW,MAAM,aAAa;AAAA,MAAA,CAC9B;AACD,aAAO,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,MAAM,UAAU;AAAA,IAAA;AAEtD,UAAA,EAAE,QAAQ,OAAA,IAAW;AACvB,QAAA;AACH,YAAM,UAAU,KAAK,eAAe,eAAe,MAAM;AACzD,kBAAY,MAAM,sBAAsB;AAAA,QACvC,QAAQ,MAAM,OAAO,IAAI,CAAA,OAAM,GAAG,EAAE;AAAA,MAAA,CACpC;AACD,YAAM,YAAY,MAAM,KAAK,iBAAiB,eAAe,EAAE;AACzD,YAAA,gBAAgB,MAAM,QAAQ,OAAO,EAAE,QAAQ,QAAQ,QAAQ,aAAa,WAAW;AACvF,YAAA,CAAC,SAAS,MAAM,IAAI,MAAM,KAAK,iBAAiB,iBAAiB,GAAG,QAAQ,aAAa;AAC/F,kBAAY,MAAM,mBAAmB,EAAE,SAAS,QAAQ;AACxD,aAAO,EAAE,SAAS,QAAQ,WAAW,EAAE;AAAA,aAC/B,GAAG;AACX,aAAO,MAAM,GAAG,EAAE,KAAK,mBAAmB,SAAS;AACnD,YAAM,eAAe,OAAO,IAAI,CAAC,QAAsB;AAAA,QACtD,KAAK;AAAA,QACL,QAAQ,EAAE,IAAI,OAAO,cAAc,iBAAiB;AAAA,MAAA,EACnD;AACF,YAAM,KAAK,iBAAiB,iBAAiB,GAAG,QAAQ,YAAY;AAE7D,aAAA,EAAE,SAAS,GAAG,QAAQ,MAAM,OAAO,QAAQ,WAAW,EAAE;AAAA,IAAA;AAAA,EAChE;AAEF;;"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
class EventDispatcher {
|
|
2
|
-
constructor(eventsRepository, variablesManager, invokeResolver) {
|
|
3
|
-
this.eventsRepository = eventsRepository;
|
|
4
|
-
this.variablesManager = variablesManager;
|
|
5
|
-
this.invokeResolver = invokeResolver;
|
|
6
|
-
}
|
|
7
|
-
async processBatch({ db, contentSchemaResolver, logger }) {
|
|
8
|
-
const schema = (await contentSchemaResolver.getSchema({ db, normalize: true })).schema;
|
|
9
|
-
const batch = await this.eventsRepository.fetchBatch(schema.actions, db.client);
|
|
10
|
-
const batchId = Math.random().toString().substring(2);
|
|
11
|
-
const batchLogger = logger.child({ loc: "Actions.EventDispatcher", batchId });
|
|
12
|
-
if (!batch.ok) {
|
|
13
|
-
batchLogger.debug("Nothing to process", {
|
|
14
|
-
backoffMs: batch.backoffMs ?? "undefined"
|
|
15
|
-
});
|
|
16
|
-
return { failed: 0, succeed: 0, backoffMs: batch.backoffMs };
|
|
17
|
-
}
|
|
18
|
-
const { target, events } = batch;
|
|
19
|
-
try {
|
|
20
|
-
const handler = this.invokeResolver.resolveHandler(target);
|
|
21
|
-
batchLogger.debug("Processing started", {
|
|
22
|
-
events: batch.events.map((it) => it.id)
|
|
23
|
-
});
|
|
24
|
-
const variables = await this.variablesManager.fetchVariables(db);
|
|
25
|
-
const handledEvents = await handler.handle({ target, events, logger: batchLogger, variables });
|
|
26
|
-
const [succeed, failed] = await this.eventsRepository.persistProcessed(db.client, handledEvents);
|
|
27
|
-
batchLogger.debug("Processing done", { succeed, failed });
|
|
28
|
-
return { succeed, failed, backoffMs: 0 };
|
|
29
|
-
} catch (e) {
|
|
30
|
-
logger.error(e, { loc: "EventDispatcher", batchId });
|
|
31
|
-
const failedEvents = events.map((it) => ({
|
|
32
|
-
row: it,
|
|
33
|
-
result: { ok: false, errorMessage: `Internal error` }
|
|
34
|
-
}));
|
|
35
|
-
await this.eventsRepository.persistProcessed(db.client, failedEvents);
|
|
36
|
-
return { succeed: 0, failed: batch.events.length, backoffMs: 0 };
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
export {
|
|
41
|
-
EventDispatcher
|
|
42
|
-
};
|
|
43
|
-
//# sourceMappingURL=EventDispatcher.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EventDispatcher.js","sources":["../../../../../packages/engine-actions/src/dispatch/EventDispatcher.ts"],"sourcesContent":["import { EventsRepository } from './EventsRepository'\nimport { TargetHandlerResolver } from './TargetHandlerResolver'\nimport { HandledEvent } from './types'\nimport { Logger } from '@contember/logger'\nimport { ContentSchemaResolver } from '@contember/engine-http'\nimport { DatabaseContext } from '@contember/engine-system-api'\nimport { VariablesManager } from '../model/VariablesManager'\n\n\ntype ProcessBatchArgs = {\n\tdb: DatabaseContext\n\tcontentSchemaResolver: ContentSchemaResolver\n\tlogger: Logger\n}\n\ntype ProcessBatchResult = {\n\tsucceed: number\n\tfailed: number\n\tbackoffMs: number | undefined\n}\n\nexport class EventDispatcher {\n\n\tconstructor(\n\t\tprivate readonly eventsRepository: EventsRepository,\n\t\tprivate readonly variablesManager: VariablesManager,\n\t\tprivate readonly invokeResolver: TargetHandlerResolver,\n\t) {\n\t}\n\n\tasync processBatch({ db, contentSchemaResolver, logger }: ProcessBatchArgs): Promise<ProcessBatchResult> {\n\t\tconst schema = (await contentSchemaResolver.getSchema({ db, normalize: true })).schema\n\t\tconst batch = await this.eventsRepository.fetchBatch(schema.actions, db.client)\n\t\tconst batchId = Math.random().toString().substring(2)\n\t\tconst batchLogger = logger.child({ loc: 'Actions.EventDispatcher', batchId })\n\t\tif (!batch.ok) {\n\t\t\tbatchLogger.debug('Nothing to process', {\n\t\t\t\tbackoffMs: batch.backoffMs ?? 'undefined',\n\t\t\t})\n\t\t\treturn { failed: 0, succeed: 0, backoffMs: batch.backoffMs }\n\t\t}\n\t\tconst { target, events } = batch\n\t\ttry {\n\t\t\tconst handler = this.invokeResolver.resolveHandler(target)\n\t\t\tbatchLogger.debug('Processing started', {\n\t\t\t\tevents: batch.events.map(it => it.id),\n\t\t\t})\n\t\t\tconst variables = await this.variablesManager.fetchVariables(db)\n\t\t\tconst handledEvents = await handler.handle({ target, events, logger: batchLogger, variables })\n\t\t\tconst [succeed, failed] = await this.eventsRepository.persistProcessed(db.client, handledEvents)\n\t\t\tbatchLogger.debug('Processing done', { succeed, failed })\n\t\t\treturn { succeed, failed, backoffMs: 0 }\n\t\t} catch (e) {\n\t\t\tlogger.error(e, { loc: 'EventDispatcher', batchId })\n\t\t\tconst failedEvents = events.map((it): HandledEvent => ({\n\t\t\t\trow: it,\n\t\t\t\tresult: { ok: false, errorMessage: `Internal error` },\n\t\t\t}))\n\t\t\tawait this.eventsRepository.persistProcessed(db.client, failedEvents)\n\n\t\t\treturn { succeed: 0, failed: batch.events.length, backoffMs: 0 }\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"AAqBO,MAAM,gBAAgB;AAAA,EAE5B,YACkB,kBACA,kBACA,gBAChB;AAHgB,SAAA,mBAAA;AACA,SAAA,mBAAA;AACA,SAAA,iBAAA;AAAA,EAAA;AAAA,EAIlB,MAAM,aAAa,EAAE,IAAI,uBAAuB,UAAyD;AAClG,UAAA,UAAU,MAAM,sBAAsB,UAAU,EAAE,IAAI,WAAW,KAAM,CAAA,GAAG;AAC1E,UAAA,QAAQ,MAAM,KAAK,iBAAiB,WAAW,OAAO,SAAS,GAAG,MAAM;AAC9E,UAAM,UAAU,KAAK,OAAA,EAAS,SAAS,EAAE,UAAU,CAAC;AACpD,UAAM,cAAc,OAAO,MAAM,EAAE,KAAK,2BAA2B,SAAS;AACxE,QAAA,CAAC,MAAM,IAAI;AACd,kBAAY,MAAM,sBAAsB;AAAA,QACvC,WAAW,MAAM,aAAa;AAAA,MAAA,CAC9B;AACD,aAAO,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,MAAM,UAAU;AAAA,IAAA;AAEtD,UAAA,EAAE,QAAQ,OAAA,IAAW;AACvB,QAAA;AACH,YAAM,UAAU,KAAK,eAAe,eAAe,MAAM;AACzD,kBAAY,MAAM,sBAAsB;AAAA,QACvC,QAAQ,MAAM,OAAO,IAAI,CAAA,OAAM,GAAG,EAAE;AAAA,MAAA,CACpC;AACD,YAAM,YAAY,MAAM,KAAK,iBAAiB,eAAe,EAAE;AACzD,YAAA,gBAAgB,MAAM,QAAQ,OAAO,EAAE,QAAQ,QAAQ,QAAQ,aAAa,WAAW;AACvF,YAAA,CAAC,SAAS,MAAM,IAAI,MAAM,KAAK,iBAAiB,iBAAiB,GAAG,QAAQ,aAAa;AAC/F,kBAAY,MAAM,mBAAmB,EAAE,SAAS,QAAQ;AACxD,aAAO,EAAE,SAAS,QAAQ,WAAW,EAAE;AAAA,aAC/B,GAAG;AACX,aAAO,MAAM,GAAG,EAAE,KAAK,mBAAmB,SAAS;AACnD,YAAM,eAAe,OAAO,IAAI,CAAC,QAAsB;AAAA,QACtD,KAAK;AAAA,QACL,QAAQ,EAAE,IAAI,OAAO,cAAc,iBAAiB;AAAA,MAAA,EACnD;AACF,YAAM,KAAK,iBAAiB,iBAAiB,GAAG,QAAQ,YAAY;AAE7D,aAAA,EAAE,SAAS,GAAG,QAAQ,MAAM,OAAO,QAAQ,WAAW,EAAE;AAAA,IAAA;AAAA,EAChE;AAEF;"}
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const Database = require("@contember/database");
|
|
4
|
-
const EventsToProcessSpecification = require("../model/EventsToProcessSpecification.cjs");
|
|
5
|
-
const ACK_TIMEOUT_MS = 1e3 * 60 * 10;
|
|
6
|
-
const DEFAULT_REPEAT_INTERVAL_MS = 5e3;
|
|
7
|
-
const DEFAULT_MAX_ATTEMPTS = 10;
|
|
8
|
-
const DEFAULT_BATCH_SIZE = 1;
|
|
9
|
-
class EventsRepository {
|
|
10
|
-
async fetchBatch(actions, db) {
|
|
11
|
-
const primaryEvent = (await this.fetchInternal(db, 1))[0];
|
|
12
|
-
if (!primaryEvent) {
|
|
13
|
-
return { ok: false, backoffMs: await this.fetchBackOff(db) };
|
|
14
|
-
}
|
|
15
|
-
const target = actions.targets[primaryEvent.target];
|
|
16
|
-
if (!target) {
|
|
17
|
-
await this.markFailedOnUnknownTarget(db, primaryEvent.target, primaryEvent.id);
|
|
18
|
-
return await this.fetchBatch(actions, db);
|
|
19
|
-
}
|
|
20
|
-
const batchSize = (target.batchSize ?? DEFAULT_BATCH_SIZE) - 1;
|
|
21
|
-
const batch = batchSize > 0 ? await this.fetchInternal(db, batchSize) : [];
|
|
22
|
-
return { ok: true, events: [primaryEvent, ...batch], target };
|
|
23
|
-
}
|
|
24
|
-
async fetchBackOff(db) {
|
|
25
|
-
const result = await Database.SelectBuilder.create().from("actions_event").match(EventsToProcessSpecification.eventsToProcessStateSpecification).select((it) => it.raw("ceil(extract(epoch from visible_at - now()) * 1000)"), "ms").orderBy("visible_at", "asc").limit(1).getResult(db);
|
|
26
|
-
return result.length ? Math.max(0, result[0].ms) : void 0;
|
|
27
|
-
}
|
|
28
|
-
async fetchInternal(db, limit, targetName) {
|
|
29
|
-
const visibleAt = /* @__PURE__ */ new Date();
|
|
30
|
-
visibleAt.setTime(visibleAt.getTime() + ACK_TIMEOUT_MS);
|
|
31
|
-
return await Database.UpdateBuilder.create().table("actions_event").with(
|
|
32
|
-
"events",
|
|
33
|
-
(qb) => qb.select((it) => it.raw("*")).from("actions_event").match(EventsToProcessSpecification.eventsToProcessSpecification).where(targetName ? { target: targetName } : {}).limit(limit).lock(Database.LockType.forNoKeyUpdate, Database.LockModifier.skipLocked)
|
|
34
|
-
).values({
|
|
35
|
-
state: "processing",
|
|
36
|
-
last_state_change: /* @__PURE__ */ new Date(),
|
|
37
|
-
visible_at: visibleAt
|
|
38
|
-
}).from((it) => it.from("events").where((it2) => it2.columnsEq(["events", "id"], ["actions_event", "id"]))).returning(new Database.Literal("*")).execute(db);
|
|
39
|
-
}
|
|
40
|
-
async persistProcessed(db, events) {
|
|
41
|
-
return await db.transaction(async (trx) => {
|
|
42
|
-
await trx.query(Database.Connection.REPEATABLE_READ);
|
|
43
|
-
const succeed = events.filter((it) => it.result.ok);
|
|
44
|
-
await this.markSucceed(trx, succeed.map((it) => it.row));
|
|
45
|
-
for (const event of events) {
|
|
46
|
-
if (!event.result.ok) {
|
|
47
|
-
await this.markFailed(trx, event);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return [succeed.length, events.length - succeed.length];
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
async requeue(db, events) {
|
|
54
|
-
await Database.UpdateBuilder.create().table("actions_event").values({
|
|
55
|
-
state: (it) => it.raw(`
|
|
56
|
-
CASE
|
|
57
|
-
WHEN num_retries = 0 THEN
|
|
58
|
-
?::__SCHEMA__.actions_trigger_state
|
|
59
|
-
ELSE
|
|
60
|
-
?::__SCHEMA__.actions_trigger_state END
|
|
61
|
-
`, "created", "retrying"),
|
|
62
|
-
last_state_change: /* @__PURE__ */ new Date(),
|
|
63
|
-
visible_at: /* @__PURE__ */ new Date()
|
|
64
|
-
}).where((it) => it.in("id", events)).execute(db);
|
|
65
|
-
}
|
|
66
|
-
async markStopped(db, events) {
|
|
67
|
-
await Database.UpdateBuilder.create().table("actions_event").values({
|
|
68
|
-
state: "stopped",
|
|
69
|
-
last_state_change: /* @__PURE__ */ new Date(),
|
|
70
|
-
resolved_at: /* @__PURE__ */ new Date()
|
|
71
|
-
}).where((it) => it.in("id", events)).execute(db);
|
|
72
|
-
}
|
|
73
|
-
async markSucceed(db, rows) {
|
|
74
|
-
const now = /* @__PURE__ */ new Date();
|
|
75
|
-
await Database.UpdateBuilder.create().table("actions_event").values({
|
|
76
|
-
state: "succeed",
|
|
77
|
-
num_retries: (it) => it.raw("num_retries + 1"),
|
|
78
|
-
resolved_at: now,
|
|
79
|
-
last_state_change: now
|
|
80
|
-
}).where((it) => it.in("id", rows.map((it2) => it2.id))).execute(db);
|
|
81
|
-
}
|
|
82
|
-
async markFailed(db, event) {
|
|
83
|
-
const numRetries = event.row.num_retries + 1;
|
|
84
|
-
const now = /* @__PURE__ */ new Date();
|
|
85
|
-
const nextAttempt = /* @__PURE__ */ new Date();
|
|
86
|
-
nextAttempt.setTime(nextAttempt.getTime() + (event.target?.initialRepeatIntervalMs ?? DEFAULT_REPEAT_INTERVAL_MS) * Math.pow(2, event.row.num_retries));
|
|
87
|
-
await Database.UpdateBuilder.create().table("actions_event").values({
|
|
88
|
-
last_state_change: now,
|
|
89
|
-
num_retries: numRetries,
|
|
90
|
-
log: JSON.stringify([...event.row.log, event.result]),
|
|
91
|
-
...numRetries < (event.target?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS) ? {
|
|
92
|
-
state: "retrying",
|
|
93
|
-
visible_at: nextAttempt
|
|
94
|
-
} : {
|
|
95
|
-
state: "failed"
|
|
96
|
-
}
|
|
97
|
-
}).where({ id: event.row.id }).execute(db);
|
|
98
|
-
}
|
|
99
|
-
async markFailedOnUnknownTarget(db, targetName, primaryEventId) {
|
|
100
|
-
await Database.UpdateBuilder.create().table("actions_event").where((it) => it.or(
|
|
101
|
-
(it2) => it2.and(
|
|
102
|
-
(it3) => it3.in("state", ["retrying", "created", "processing"]).compare("visible_at", Database.Operator.lte, "now").compare("target", Database.Operator.eq, targetName)
|
|
103
|
-
).and(
|
|
104
|
-
(it3) => it3.compare("id", Database.Operator.eq, primaryEventId)
|
|
105
|
-
)
|
|
106
|
-
)).values({
|
|
107
|
-
// intentionally not retrying
|
|
108
|
-
last_state_change: /* @__PURE__ */ new Date(),
|
|
109
|
-
num_retries: (it) => it.raw("num_retries + 1"),
|
|
110
|
-
log: (it) => it.raw("log || ?::jsonb", { ok: false, errorMessage: `Event target ${targetName} not found, stopping.` }),
|
|
111
|
-
state: "failed",
|
|
112
|
-
resolved_at: /* @__PURE__ */ new Date()
|
|
113
|
-
}).execute(db);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
exports.EventsRepository = EventsRepository;
|
|
117
|
-
//# sourceMappingURL=EventsRepository.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EventsRepository.cjs","sources":["../../../../../packages/engine-actions/src/dispatch/EventsRepository.ts"],"sourcesContent":["import {\n\tClient,\n\tConnection,\n\tLiteral,\n\tLockModifier,\n\tLockType,\n\tOperator,\n\tSelectBuilder,\n\tUpdateBuilder,\n} from '@contember/database'\nimport { EventRow, HandledEvent } from './types'\nimport { Actions } from '@contember/schema'\nimport { eventsToProcessSpecification, eventsToProcessStateSpecification } from '../model/EventsToProcessSpecification'\nimport { notify } from '../utils/notifyChannel'\n\n\nconst ACK_TIMEOUT_MS = 1_000 * 60 * 10 // 10 minutes\nconst DEFAULT_REPEAT_INTERVAL_MS = 5_000 // 5 seconds\nconst DEFAULT_MAX_ATTEMPTS = 10\nconst DEFAULT_BATCH_SIZE = 1\n\nexport class EventsRepository {\n\n\tpublic async fetchBatch(actions: Actions.Schema, db: Client): Promise<FetchBatchResult> {\n\t\tconst primaryEvent = (await this.fetchInternal(db, 1))[0]\n\t\tif (!primaryEvent) {\n\t\t\treturn { ok: false, backoffMs: await this.fetchBackOff(db) }\n\t\t}\n\t\tconst target = actions.targets[primaryEvent.target]\n\t\tif (!target) {\n\t\t\tawait this.markFailedOnUnknownTarget(db, primaryEvent.target, primaryEvent.id)\n\t\t\treturn await this.fetchBatch(actions, db)\n\t\t}\n\t\tconst batchSize = (target.batchSize ?? DEFAULT_BATCH_SIZE) - 1\n\t\tconst batch = batchSize > 0 ? await this.fetchInternal(db, batchSize) : []\n\t\treturn { ok: true, events: [primaryEvent, ...batch], target }\n\t}\n\n\n\tprivate async fetchBackOff(db: Client): Promise<number | undefined> {\n\t\tconst result = await SelectBuilder.create<{ ms: number }>()\n\t\t\t.from('actions_event')\n\t\t\t.match(eventsToProcessStateSpecification)\n\t\t\t.select(it => it.raw('ceil(extract(epoch from visible_at - now()) * 1000)'), 'ms')\n\t\t\t.orderBy('visible_at', 'asc')\n\t\t\t.limit(1)\n\t\t\t.getResult(db)\n\n\t\treturn result.length ? Math.max(0, result[0].ms) : undefined\n\t}\n\n\n\tprivate async fetchInternal(db: Client, limit: number, targetName?: string): Promise<EventRow[]> {\n\t\tconst visibleAt = new Date()\n\t\tvisibleAt.setTime(visibleAt.getTime() + ACK_TIMEOUT_MS)\n\t\treturn await UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.with('events', qb => qb\n\t\t\t\t.select(it => it.raw('*'))\n\t\t\t\t.from('actions_event')\n\t\t\t\t.match(eventsToProcessSpecification)\n\t\t\t\t.where(targetName ? { target: targetName } : {})\n\t\t\t\t.limit(limit)\n\t\t\t\t.lock(LockType.forNoKeyUpdate, LockModifier.skipLocked),\n\t\t\t)\n\t\t\t.values<EventRow>({\n\t\t\t\tstate: 'processing',\n\t\t\t\tlast_state_change: new Date(),\n\t\t\t\tvisible_at: visibleAt,\n\t\t\t})\n\t\t\t.from(it => it.from('events').where(it => it.columnsEq(['events', 'id'], ['actions_event', 'id'])))\n\t\t\t.returning<EventRow>(new Literal('*'))\n\t\t\t.execute(db)\n\t}\n\n\tpublic async persistProcessed(db: Client, events: HandledEvent[]): Promise<[number, number]> {\n\t\treturn await db.transaction(async trx => {\n\t\t\tawait trx.query(Connection.REPEATABLE_READ)\n\t\t\tconst succeed = events.filter(it => it.result.ok)\n\t\t\tawait this.markSucceed(trx, succeed.map(it => it.row))\n\n\t\t\tfor (const event of events) {\n\t\t\t\tif (!event.result.ok) {\n\t\t\t\t\tawait this.markFailed(trx, event)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [succeed.length, events.length - succeed.length]\n\t\t})\n\t}\n\n\tpublic async requeue(db: Client, events: string[]): Promise<void> {\n\t\tawait UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.values<EventRow>({\n\t\t\t\tstate: it => it.raw(`\n\t\t\t\t\tCASE \n\t\t\t\t\tWHEN num_retries = 0 THEN \n\t\t\t\t\t\t?::__SCHEMA__.actions_trigger_state \n\t\t\t\t\tELSE \n\t\t\t\t\t?::__SCHEMA__.actions_trigger_state END\n\t\t\t\t`, 'created', 'retrying'),\n\t\t\t\tlast_state_change: new Date(),\n\t\t\t\tvisible_at: new Date(),\n\t\t\t})\n\t\t\t.where(it => it.in('id', events))\n\t\t\t.execute(db)\n\t}\n\n\tpublic async markStopped(db: Client, events: string[]): Promise<void> {\n\t\tawait UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.values<EventRow>({\n\t\t\t\tstate: 'stopped',\n\t\t\t\tlast_state_change: new Date(),\n\t\t\t\tresolved_at: new Date(),\n\t\t\t})\n\t\t\t.where(it => it.in('id', events))\n\t\t\t.execute(db)\n\t}\n\n\tprivate async markSucceed(db: Client, rows: EventRow[]): Promise<void> {\n\t\tconst now = new Date()\n\t\tawait UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.values<EventRow>({\n\t\t\t\tstate: 'succeed',\n\t\t\t\tnum_retries: it => it.raw('num_retries + 1'),\n\t\t\t\tresolved_at: now,\n\t\t\t\tlast_state_change: now,\n\t\t\t})\n\t\t\t.where(it => it.in('id', rows.map(it => it.id)))\n\t\t\t.execute(db)\n\t}\n\n\tprivate async markFailed(db: Client, event: HandledEvent): Promise<void> {\n\t\tconst numRetries = event.row.num_retries + 1\n\t\tconst now = new Date()\n\t\tconst nextAttempt = new Date()\n\t\tnextAttempt.setTime(nextAttempt.getTime() + (event.target?.initialRepeatIntervalMs ?? DEFAULT_REPEAT_INTERVAL_MS) * Math.pow(2, event.row.num_retries))\n\t\tawait UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.values<EventRow>({\n\t\t\t\tlast_state_change: now,\n\t\t\t\tnum_retries: numRetries,\n\t\t\t\tlog: JSON.stringify([...event.row.log, event.result]) as any,\n\t\t\t\t...(numRetries < (event.target?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS) ? {\n\t\t\t\t\tstate: 'retrying',\n\t\t\t\t\tvisible_at: nextAttempt,\n\t\t\t\t} : {\n\t\t\t\t\tstate: 'failed',\n\t\t\t\t}),\n\t\t\t})\n\t\t\t.where({ id: event.row.id })\n\t\t\t.execute(db)\n\t}\n\n\tprivate async markFailedOnUnknownTarget(db: Client, targetName: string, primaryEventId: string) {\n\t\tawait UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.where(it => it.or(it => it\n\t\t\t\t.and(it => it\n\t\t\t\t\t.in('state', ['retrying', 'created', 'processing'])\n\t\t\t\t\t.compare('visible_at', Operator.lte, 'now')\n\t\t\t\t\t.compare('target', Operator.eq, targetName),\n\t\t\t\t)\n\t\t\t\t.and(it => it\n\t\t\t\t\t.compare('id', Operator.eq, primaryEventId),\n\t\t\t\t),\n\t\t\t))\n\t\t\t.values<EventRow>({\n\t\t\t\t// intentionally not retrying\n\t\t\t\tlast_state_change: new Date(),\n\t\t\t\tnum_retries: it => it.raw('num_retries + 1'),\n\t\t\t\tlog: it => it.raw('log || ?::jsonb', { ok: false, errorMessage: `Event target ${targetName} not found, stopping.` }),\n\t\t\t\tstate: 'failed',\n\t\t\t\tresolved_at: new Date(),\n\t\t\t})\n\t\t\t.execute(db)\n\t}\n}\n\nexport type FetchBatchResult =\n\t| { ok: true; events: EventRow[]; target: Actions.AnyTarget }\n\t| { ok: false; backoffMs?: number }\n"],"names":["SelectBuilder","eventsToProcessStateSpecification","UpdateBuilder","eventsToProcessSpecification","LockType","LockModifier","it","Literal","Connection","Operator"],"mappings":"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"}
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { SelectBuilder, UpdateBuilder as UpdateBuilder$1, LockType, LockModifier, Literal, Connection, Operator } from "@contember/database";
|
|
2
|
-
import { eventsToProcessStateSpecification, eventsToProcessSpecification } from "../model/EventsToProcessSpecification.js";
|
|
3
|
-
const ACK_TIMEOUT_MS = 1e3 * 60 * 10;
|
|
4
|
-
const DEFAULT_REPEAT_INTERVAL_MS = 5e3;
|
|
5
|
-
const DEFAULT_MAX_ATTEMPTS = 10;
|
|
6
|
-
const DEFAULT_BATCH_SIZE = 1;
|
|
7
|
-
class EventsRepository {
|
|
8
|
-
async fetchBatch(actions, db) {
|
|
9
|
-
const primaryEvent = (await this.fetchInternal(db, 1))[0];
|
|
10
|
-
if (!primaryEvent) {
|
|
11
|
-
return { ok: false, backoffMs: await this.fetchBackOff(db) };
|
|
12
|
-
}
|
|
13
|
-
const target = actions.targets[primaryEvent.target];
|
|
14
|
-
if (!target) {
|
|
15
|
-
await this.markFailedOnUnknownTarget(db, primaryEvent.target, primaryEvent.id);
|
|
16
|
-
return await this.fetchBatch(actions, db);
|
|
17
|
-
}
|
|
18
|
-
const batchSize = (target.batchSize ?? DEFAULT_BATCH_SIZE) - 1;
|
|
19
|
-
const batch = batchSize > 0 ? await this.fetchInternal(db, batchSize) : [];
|
|
20
|
-
return { ok: true, events: [primaryEvent, ...batch], target };
|
|
21
|
-
}
|
|
22
|
-
async fetchBackOff(db) {
|
|
23
|
-
const result = await SelectBuilder.create().from("actions_event").match(eventsToProcessStateSpecification).select((it) => it.raw("ceil(extract(epoch from visible_at - now()) * 1000)"), "ms").orderBy("visible_at", "asc").limit(1).getResult(db);
|
|
24
|
-
return result.length ? Math.max(0, result[0].ms) : void 0;
|
|
25
|
-
}
|
|
26
|
-
async fetchInternal(db, limit, targetName) {
|
|
27
|
-
const visibleAt = /* @__PURE__ */ new Date();
|
|
28
|
-
visibleAt.setTime(visibleAt.getTime() + ACK_TIMEOUT_MS);
|
|
29
|
-
return await UpdateBuilder$1.create().table("actions_event").with(
|
|
30
|
-
"events",
|
|
31
|
-
(qb) => qb.select((it) => it.raw("*")).from("actions_event").match(eventsToProcessSpecification).where(targetName ? { target: targetName } : {}).limit(limit).lock(LockType.forNoKeyUpdate, LockModifier.skipLocked)
|
|
32
|
-
).values({
|
|
33
|
-
state: "processing",
|
|
34
|
-
last_state_change: /* @__PURE__ */ new Date(),
|
|
35
|
-
visible_at: visibleAt
|
|
36
|
-
}).from((it) => it.from("events").where((it2) => it2.columnsEq(["events", "id"], ["actions_event", "id"]))).returning(new Literal("*")).execute(db);
|
|
37
|
-
}
|
|
38
|
-
async persistProcessed(db, events) {
|
|
39
|
-
return await db.transaction(async (trx) => {
|
|
40
|
-
await trx.query(Connection.REPEATABLE_READ);
|
|
41
|
-
const succeed = events.filter((it) => it.result.ok);
|
|
42
|
-
await this.markSucceed(trx, succeed.map((it) => it.row));
|
|
43
|
-
for (const event of events) {
|
|
44
|
-
if (!event.result.ok) {
|
|
45
|
-
await this.markFailed(trx, event);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return [succeed.length, events.length - succeed.length];
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
async requeue(db, events) {
|
|
52
|
-
await UpdateBuilder$1.create().table("actions_event").values({
|
|
53
|
-
state: (it) => it.raw(`
|
|
54
|
-
CASE
|
|
55
|
-
WHEN num_retries = 0 THEN
|
|
56
|
-
?::__SCHEMA__.actions_trigger_state
|
|
57
|
-
ELSE
|
|
58
|
-
?::__SCHEMA__.actions_trigger_state END
|
|
59
|
-
`, "created", "retrying"),
|
|
60
|
-
last_state_change: /* @__PURE__ */ new Date(),
|
|
61
|
-
visible_at: /* @__PURE__ */ new Date()
|
|
62
|
-
}).where((it) => it.in("id", events)).execute(db);
|
|
63
|
-
}
|
|
64
|
-
async markStopped(db, events) {
|
|
65
|
-
await UpdateBuilder$1.create().table("actions_event").values({
|
|
66
|
-
state: "stopped",
|
|
67
|
-
last_state_change: /* @__PURE__ */ new Date(),
|
|
68
|
-
resolved_at: /* @__PURE__ */ new Date()
|
|
69
|
-
}).where((it) => it.in("id", events)).execute(db);
|
|
70
|
-
}
|
|
71
|
-
async markSucceed(db, rows) {
|
|
72
|
-
const now = /* @__PURE__ */ new Date();
|
|
73
|
-
await UpdateBuilder$1.create().table("actions_event").values({
|
|
74
|
-
state: "succeed",
|
|
75
|
-
num_retries: (it) => it.raw("num_retries + 1"),
|
|
76
|
-
resolved_at: now,
|
|
77
|
-
last_state_change: now
|
|
78
|
-
}).where((it) => it.in("id", rows.map((it2) => it2.id))).execute(db);
|
|
79
|
-
}
|
|
80
|
-
async markFailed(db, event) {
|
|
81
|
-
const numRetries = event.row.num_retries + 1;
|
|
82
|
-
const now = /* @__PURE__ */ new Date();
|
|
83
|
-
const nextAttempt = /* @__PURE__ */ new Date();
|
|
84
|
-
nextAttempt.setTime(nextAttempt.getTime() + (event.target?.initialRepeatIntervalMs ?? DEFAULT_REPEAT_INTERVAL_MS) * Math.pow(2, event.row.num_retries));
|
|
85
|
-
await UpdateBuilder$1.create().table("actions_event").values({
|
|
86
|
-
last_state_change: now,
|
|
87
|
-
num_retries: numRetries,
|
|
88
|
-
log: JSON.stringify([...event.row.log, event.result]),
|
|
89
|
-
...numRetries < (event.target?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS) ? {
|
|
90
|
-
state: "retrying",
|
|
91
|
-
visible_at: nextAttempt
|
|
92
|
-
} : {
|
|
93
|
-
state: "failed"
|
|
94
|
-
}
|
|
95
|
-
}).where({ id: event.row.id }).execute(db);
|
|
96
|
-
}
|
|
97
|
-
async markFailedOnUnknownTarget(db, targetName, primaryEventId) {
|
|
98
|
-
await UpdateBuilder$1.create().table("actions_event").where((it) => it.or(
|
|
99
|
-
(it2) => it2.and(
|
|
100
|
-
(it3) => it3.in("state", ["retrying", "created", "processing"]).compare("visible_at", Operator.lte, "now").compare("target", Operator.eq, targetName)
|
|
101
|
-
).and(
|
|
102
|
-
(it3) => it3.compare("id", Operator.eq, primaryEventId)
|
|
103
|
-
)
|
|
104
|
-
)).values({
|
|
105
|
-
// intentionally not retrying
|
|
106
|
-
last_state_change: /* @__PURE__ */ new Date(),
|
|
107
|
-
num_retries: (it) => it.raw("num_retries + 1"),
|
|
108
|
-
log: (it) => it.raw("log || ?::jsonb", { ok: false, errorMessage: `Event target ${targetName} not found, stopping.` }),
|
|
109
|
-
state: "failed",
|
|
110
|
-
resolved_at: /* @__PURE__ */ new Date()
|
|
111
|
-
}).execute(db);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
export {
|
|
115
|
-
EventsRepository
|
|
116
|
-
};
|
|
117
|
-
//# sourceMappingURL=EventsRepository.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EventsRepository.js","sources":["../../../../../packages/engine-actions/src/dispatch/EventsRepository.ts"],"sourcesContent":["import {\n\tClient,\n\tConnection,\n\tLiteral,\n\tLockModifier,\n\tLockType,\n\tOperator,\n\tSelectBuilder,\n\tUpdateBuilder,\n} from '@contember/database'\nimport { EventRow, HandledEvent } from './types'\nimport { Actions } from '@contember/schema'\nimport { eventsToProcessSpecification, eventsToProcessStateSpecification } from '../model/EventsToProcessSpecification'\nimport { notify } from '../utils/notifyChannel'\n\n\nconst ACK_TIMEOUT_MS = 1_000 * 60 * 10 // 10 minutes\nconst DEFAULT_REPEAT_INTERVAL_MS = 5_000 // 5 seconds\nconst DEFAULT_MAX_ATTEMPTS = 10\nconst DEFAULT_BATCH_SIZE = 1\n\nexport class EventsRepository {\n\n\tpublic async fetchBatch(actions: Actions.Schema, db: Client): Promise<FetchBatchResult> {\n\t\tconst primaryEvent = (await this.fetchInternal(db, 1))[0]\n\t\tif (!primaryEvent) {\n\t\t\treturn { ok: false, backoffMs: await this.fetchBackOff(db) }\n\t\t}\n\t\tconst target = actions.targets[primaryEvent.target]\n\t\tif (!target) {\n\t\t\tawait this.markFailedOnUnknownTarget(db, primaryEvent.target, primaryEvent.id)\n\t\t\treturn await this.fetchBatch(actions, db)\n\t\t}\n\t\tconst batchSize = (target.batchSize ?? DEFAULT_BATCH_SIZE) - 1\n\t\tconst batch = batchSize > 0 ? await this.fetchInternal(db, batchSize) : []\n\t\treturn { ok: true, events: [primaryEvent, ...batch], target }\n\t}\n\n\n\tprivate async fetchBackOff(db: Client): Promise<number | undefined> {\n\t\tconst result = await SelectBuilder.create<{ ms: number }>()\n\t\t\t.from('actions_event')\n\t\t\t.match(eventsToProcessStateSpecification)\n\t\t\t.select(it => it.raw('ceil(extract(epoch from visible_at - now()) * 1000)'), 'ms')\n\t\t\t.orderBy('visible_at', 'asc')\n\t\t\t.limit(1)\n\t\t\t.getResult(db)\n\n\t\treturn result.length ? Math.max(0, result[0].ms) : undefined\n\t}\n\n\n\tprivate async fetchInternal(db: Client, limit: number, targetName?: string): Promise<EventRow[]> {\n\t\tconst visibleAt = new Date()\n\t\tvisibleAt.setTime(visibleAt.getTime() + ACK_TIMEOUT_MS)\n\t\treturn await UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.with('events', qb => qb\n\t\t\t\t.select(it => it.raw('*'))\n\t\t\t\t.from('actions_event')\n\t\t\t\t.match(eventsToProcessSpecification)\n\t\t\t\t.where(targetName ? { target: targetName } : {})\n\t\t\t\t.limit(limit)\n\t\t\t\t.lock(LockType.forNoKeyUpdate, LockModifier.skipLocked),\n\t\t\t)\n\t\t\t.values<EventRow>({\n\t\t\t\tstate: 'processing',\n\t\t\t\tlast_state_change: new Date(),\n\t\t\t\tvisible_at: visibleAt,\n\t\t\t})\n\t\t\t.from(it => it.from('events').where(it => it.columnsEq(['events', 'id'], ['actions_event', 'id'])))\n\t\t\t.returning<EventRow>(new Literal('*'))\n\t\t\t.execute(db)\n\t}\n\n\tpublic async persistProcessed(db: Client, events: HandledEvent[]): Promise<[number, number]> {\n\t\treturn await db.transaction(async trx => {\n\t\t\tawait trx.query(Connection.REPEATABLE_READ)\n\t\t\tconst succeed = events.filter(it => it.result.ok)\n\t\t\tawait this.markSucceed(trx, succeed.map(it => it.row))\n\n\t\t\tfor (const event of events) {\n\t\t\t\tif (!event.result.ok) {\n\t\t\t\t\tawait this.markFailed(trx, event)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [succeed.length, events.length - succeed.length]\n\t\t})\n\t}\n\n\tpublic async requeue(db: Client, events: string[]): Promise<void> {\n\t\tawait UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.values<EventRow>({\n\t\t\t\tstate: it => it.raw(`\n\t\t\t\t\tCASE \n\t\t\t\t\tWHEN num_retries = 0 THEN \n\t\t\t\t\t\t?::__SCHEMA__.actions_trigger_state \n\t\t\t\t\tELSE \n\t\t\t\t\t?::__SCHEMA__.actions_trigger_state END\n\t\t\t\t`, 'created', 'retrying'),\n\t\t\t\tlast_state_change: new Date(),\n\t\t\t\tvisible_at: new Date(),\n\t\t\t})\n\t\t\t.where(it => it.in('id', events))\n\t\t\t.execute(db)\n\t}\n\n\tpublic async markStopped(db: Client, events: string[]): Promise<void> {\n\t\tawait UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.values<EventRow>({\n\t\t\t\tstate: 'stopped',\n\t\t\t\tlast_state_change: new Date(),\n\t\t\t\tresolved_at: new Date(),\n\t\t\t})\n\t\t\t.where(it => it.in('id', events))\n\t\t\t.execute(db)\n\t}\n\n\tprivate async markSucceed(db: Client, rows: EventRow[]): Promise<void> {\n\t\tconst now = new Date()\n\t\tawait UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.values<EventRow>({\n\t\t\t\tstate: 'succeed',\n\t\t\t\tnum_retries: it => it.raw('num_retries + 1'),\n\t\t\t\tresolved_at: now,\n\t\t\t\tlast_state_change: now,\n\t\t\t})\n\t\t\t.where(it => it.in('id', rows.map(it => it.id)))\n\t\t\t.execute(db)\n\t}\n\n\tprivate async markFailed(db: Client, event: HandledEvent): Promise<void> {\n\t\tconst numRetries = event.row.num_retries + 1\n\t\tconst now = new Date()\n\t\tconst nextAttempt = new Date()\n\t\tnextAttempt.setTime(nextAttempt.getTime() + (event.target?.initialRepeatIntervalMs ?? DEFAULT_REPEAT_INTERVAL_MS) * Math.pow(2, event.row.num_retries))\n\t\tawait UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.values<EventRow>({\n\t\t\t\tlast_state_change: now,\n\t\t\t\tnum_retries: numRetries,\n\t\t\t\tlog: JSON.stringify([...event.row.log, event.result]) as any,\n\t\t\t\t...(numRetries < (event.target?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS) ? {\n\t\t\t\t\tstate: 'retrying',\n\t\t\t\t\tvisible_at: nextAttempt,\n\t\t\t\t} : {\n\t\t\t\t\tstate: 'failed',\n\t\t\t\t}),\n\t\t\t})\n\t\t\t.where({ id: event.row.id })\n\t\t\t.execute(db)\n\t}\n\n\tprivate async markFailedOnUnknownTarget(db: Client, targetName: string, primaryEventId: string) {\n\t\tawait UpdateBuilder.create()\n\t\t\t.table('actions_event')\n\t\t\t.where(it => it.or(it => it\n\t\t\t\t.and(it => it\n\t\t\t\t\t.in('state', ['retrying', 'created', 'processing'])\n\t\t\t\t\t.compare('visible_at', Operator.lte, 'now')\n\t\t\t\t\t.compare('target', Operator.eq, targetName),\n\t\t\t\t)\n\t\t\t\t.and(it => it\n\t\t\t\t\t.compare('id', Operator.eq, primaryEventId),\n\t\t\t\t),\n\t\t\t))\n\t\t\t.values<EventRow>({\n\t\t\t\t// intentionally not retrying\n\t\t\t\tlast_state_change: new Date(),\n\t\t\t\tnum_retries: it => it.raw('num_retries + 1'),\n\t\t\t\tlog: it => it.raw('log || ?::jsonb', { ok: false, errorMessage: `Event target ${targetName} not found, stopping.` }),\n\t\t\t\tstate: 'failed',\n\t\t\t\tresolved_at: new Date(),\n\t\t\t})\n\t\t\t.execute(db)\n\t}\n}\n\nexport type FetchBatchResult =\n\t| { ok: true; events: EventRow[]; target: Actions.AnyTarget }\n\t| { ok: false; backoffMs?: number }\n"],"names":["UpdateBuilder","it"],"mappings":"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"}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const Database = require("@contember/database");
|
|
4
|
-
const notifyChannel = require("../utils/notifyChannel.cjs");
|
|
5
|
-
class ProjectDispatcherFactory {
|
|
6
|
-
constructor(dispatcher) {
|
|
7
|
-
this.dispatcher = dispatcher;
|
|
8
|
-
}
|
|
9
|
-
create({ db, contentSchemaResolver, projectSlug }) {
|
|
10
|
-
return new ProjectDispatcher(this.dispatcher, db, contentSchemaResolver, projectSlug);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
class ProjectDispatcher {
|
|
14
|
-
constructor(dispatcher, db, contentSchemaResolver, projectSlug) {
|
|
15
|
-
this.dispatcher = dispatcher;
|
|
16
|
-
this.db = db;
|
|
17
|
-
this.contentSchemaResolver = contentSchemaResolver;
|
|
18
|
-
this.projectSlug = projectSlug;
|
|
19
|
-
}
|
|
20
|
-
async run({ logger, onError, onClose }) {
|
|
21
|
-
return await new Promise(async (resolve, reject) => {
|
|
22
|
-
let resolvePending = () => {
|
|
23
|
-
};
|
|
24
|
-
let rejectPending = (e) => {
|
|
25
|
-
};
|
|
26
|
-
const resolvePendingRef = () => {
|
|
27
|
-
resolvePending();
|
|
28
|
-
};
|
|
29
|
-
let pendingError = void 0;
|
|
30
|
-
const rejectPendingRef = (e) => {
|
|
31
|
-
pendingError = e;
|
|
32
|
-
rejectPending(e);
|
|
33
|
-
};
|
|
34
|
-
let succeedTotal = 0;
|
|
35
|
-
let failedTotal = 0;
|
|
36
|
-
let aborted = false;
|
|
37
|
-
try {
|
|
38
|
-
await this.db.scope(async (db) => {
|
|
39
|
-
const listener = await new Database.Listener(db.client, notifyChannel.NOTIFY_CHANNEL_NAME, (project) => {
|
|
40
|
-
if (project === this.projectSlug) {
|
|
41
|
-
resolvePendingRef();
|
|
42
|
-
}
|
|
43
|
-
}).run({ onError: rejectPendingRef, onClose: resolvePendingRef });
|
|
44
|
-
resolve({
|
|
45
|
-
end: async () => {
|
|
46
|
-
aborted = true;
|
|
47
|
-
await listener.end();
|
|
48
|
-
logger.info("Worker terminated", {
|
|
49
|
-
succeed: succeedTotal,
|
|
50
|
-
failed: failedTotal
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
try {
|
|
55
|
-
while (!aborted) {
|
|
56
|
-
const { succeed, failed, backoffMs } = await this.dispatcher.processBatch({
|
|
57
|
-
db,
|
|
58
|
-
contentSchemaResolver: this.contentSchemaResolver,
|
|
59
|
-
logger
|
|
60
|
-
});
|
|
61
|
-
succeedTotal += succeed;
|
|
62
|
-
failedTotal += failed;
|
|
63
|
-
if (pendingError) {
|
|
64
|
-
throw pendingError;
|
|
65
|
-
}
|
|
66
|
-
if (backoffMs !== 0) {
|
|
67
|
-
await new Promise((resolve2, reject2) => {
|
|
68
|
-
let cleanup = () => {
|
|
69
|
-
};
|
|
70
|
-
if (backoffMs !== void 0) {
|
|
71
|
-
const timeoutHandle = setTimeout(resolve2, backoffMs);
|
|
72
|
-
cleanup = () => clearTimeout(timeoutHandle);
|
|
73
|
-
}
|
|
74
|
-
resolvePending = () => {
|
|
75
|
-
resolve2();
|
|
76
|
-
cleanup();
|
|
77
|
-
};
|
|
78
|
-
rejectPending = (e) => {
|
|
79
|
-
reject2(e);
|
|
80
|
-
cleanup();
|
|
81
|
-
};
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
onClose?.();
|
|
86
|
-
} catch (e) {
|
|
87
|
-
await listener.end();
|
|
88
|
-
onError(e);
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
} catch (e) {
|
|
92
|
-
reject(e);
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
exports.ProjectDispatcher = ProjectDispatcher;
|
|
98
|
-
exports.ProjectDispatcherFactory = ProjectDispatcherFactory;
|
|
99
|
-
//# sourceMappingURL=ProjectDispatcher.cjs.map
|