@contember/engine-actions 2.1.0-beta.2 → 2.2.0-alpha.1
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/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js.map +1 -1
- package/dist/development/src/ActionsExecutionContainerHookFactory.cjs.map +1 -1
- package/dist/development/src/ActionsExecutionContainerHookFactory.js.map +1 -1
- package/dist/development/src/ListenerStoreProvider.cjs.map +1 -1
- package/dist/development/src/ListenerStoreProvider.js.map +1 -1
- package/dist/development/src/authorization/ActionsPermissionsFactory.cjs.map +1 -1
- package/dist/development/src/authorization/ActionsPermissionsFactory.js.map +1 -1
- package/dist/development/src/dispatch/DispatchWorkerSupervisor.cjs.map +1 -1
- package/dist/development/src/dispatch/DispatchWorkerSupervisor.js.map +1 -1
- package/dist/development/src/dispatch/EventDispatcher.cjs.map +1 -1
- package/dist/development/src/dispatch/EventDispatcher.js.map +1 -1
- package/dist/development/src/dispatch/EventsRepository.cjs.map +1 -1
- package/dist/development/src/dispatch/EventsRepository.js.map +1 -1
- package/dist/development/src/dispatch/LazyDispatchWorker.cjs.map +1 -1
- package/dist/development/src/dispatch/LazyDispatchWorker.js.map +1 -1
- package/dist/development/src/dispatch/ProjectDispatcher.cjs.map +1 -1
- package/dist/development/src/dispatch/ProjectDispatcher.js.map +1 -1
- package/dist/development/src/dispatch/TargetHandlerResolver.cjs.map +1 -1
- package/dist/development/src/dispatch/TargetHandlerResolver.js.map +1 -1
- package/dist/development/src/dispatch/WebhookTargetHandler.cjs.map +1 -1
- package/dist/development/src/dispatch/WebhookTargetHandler.js.map +1 -1
- package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.cjs.map +1 -1
- package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.js.map +1 -1
- package/dist/development/src/graphql/http/ActionsContextResolver.cjs.map +1 -1
- package/dist/development/src/graphql/http/ActionsContextResolver.js.map +1 -1
- package/dist/development/src/graphql/http/ActionsGraphQLHandlerFactory.cjs.map +1 -1
- package/dist/development/src/graphql/http/ActionsGraphQLHandlerFactory.js.map +1 -1
- package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.cjs.map +1 -1
- package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.js.map +1 -1
- package/dist/development/src/graphql/resolvers/ResolversFactory.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/ResolversFactory.js.map +1 -1
- package/dist/development/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js.map +1 -1
- package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.js.map +1 -1
- package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js.map +1 -1
- package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.js.map +1 -1
- package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -1
- package/dist/development/src/graphql/resolvers/query/VariablesQueryResolver.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/query/VariablesQueryResolver.js.map +1 -1
- package/dist/development/src/migrations/index.cjs.map +1 -1
- package/dist/development/src/migrations/index.js.map +1 -1
- package/dist/development/src/model/EventByIdQuery.cjs.map +1 -1
- package/dist/development/src/model/EventByIdQuery.js.map +1 -1
- package/dist/development/src/model/EventsInProcessingQuery.cjs.map +1 -1
- package/dist/development/src/model/EventsInProcessingQuery.js.map +1 -1
- package/dist/development/src/model/EventsToProcessQuery.cjs.map +1 -1
- package/dist/development/src/model/EventsToProcessQuery.js.map +1 -1
- package/dist/development/src/model/FailedEventsQuery.cjs.map +1 -1
- package/dist/development/src/model/FailedEventsQuery.js.map +1 -1
- package/dist/development/src/model/VariablesManager.cjs.map +1 -1
- package/dist/development/src/model/VariablesManager.js.map +1 -1
- package/dist/development/src/triggers/TriggerHandler.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerHandler.js.map +1 -1
- package/dist/development/src/triggers/TriggerIndirectChangesFetcher.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerIndirectChangesFetcher.js.map +1 -1
- package/dist/development/src/triggers/TriggerListenersBuilder.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerListenersBuilder.js.map +1 -1
- package/dist/development/src/triggers/TriggerListenersFactory.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerListenersFactory.js.map +1 -1
- package/dist/development/src/triggers/TriggerListenersStore.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerListenersStore.js.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadBuilder.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadBuilder.js.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadManager.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadManager.js.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadPersister.js.map +1 -1
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.js.map +1 -1
- package/dist/production/src/ActionsExecutionContainerHookFactory.cjs.map +1 -1
- package/dist/production/src/ActionsExecutionContainerHookFactory.js.map +1 -1
- package/dist/production/src/ListenerStoreProvider.cjs.map +1 -1
- package/dist/production/src/ListenerStoreProvider.js.map +1 -1
- package/dist/production/src/authorization/ActionsPermissionsFactory.cjs.map +1 -1
- package/dist/production/src/authorization/ActionsPermissionsFactory.js.map +1 -1
- package/dist/production/src/dispatch/DispatchWorkerSupervisor.cjs.map +1 -1
- package/dist/production/src/dispatch/DispatchWorkerSupervisor.js.map +1 -1
- package/dist/production/src/dispatch/EventDispatcher.cjs.map +1 -1
- package/dist/production/src/dispatch/EventDispatcher.js.map +1 -1
- package/dist/production/src/dispatch/EventsRepository.cjs.map +1 -1
- package/dist/production/src/dispatch/EventsRepository.js.map +1 -1
- package/dist/production/src/dispatch/LazyDispatchWorker.cjs.map +1 -1
- package/dist/production/src/dispatch/LazyDispatchWorker.js.map +1 -1
- package/dist/production/src/dispatch/ProjectDispatcher.cjs.map +1 -1
- package/dist/production/src/dispatch/ProjectDispatcher.js.map +1 -1
- package/dist/production/src/dispatch/TargetHandlerResolver.cjs.map +1 -1
- package/dist/production/src/dispatch/TargetHandlerResolver.js.map +1 -1
- package/dist/production/src/dispatch/WebhookTargetHandler.cjs.map +1 -1
- package/dist/production/src/dispatch/WebhookTargetHandler.js.map +1 -1
- package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.cjs.map +1 -1
- package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.js.map +1 -1
- package/dist/production/src/graphql/http/ActionsContextResolver.cjs.map +1 -1
- package/dist/production/src/graphql/http/ActionsContextResolver.js.map +1 -1
- package/dist/production/src/graphql/http/ActionsGraphQLHandlerFactory.cjs.map +1 -1
- package/dist/production/src/graphql/http/ActionsGraphQLHandlerFactory.js.map +1 -1
- package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.cjs.map +1 -1
- package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.js.map +1 -1
- package/dist/production/src/graphql/resolvers/ResolversFactory.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/ResolversFactory.js.map +1 -1
- package/dist/production/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js.map +1 -1
- package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.js.map +1 -1
- package/dist/production/src/graphql/resolvers/mutation/SetVariablesMutationResolver.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js.map +1 -1
- package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.js.map +1 -1
- package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -1
- package/dist/production/src/graphql/resolvers/query/VariablesQueryResolver.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/query/VariablesQueryResolver.js.map +1 -1
- package/dist/production/src/migrations/index.cjs.map +1 -1
- package/dist/production/src/migrations/index.js.map +1 -1
- package/dist/production/src/model/EventByIdQuery.cjs.map +1 -1
- package/dist/production/src/model/EventByIdQuery.js.map +1 -1
- package/dist/production/src/model/EventsInProcessingQuery.cjs.map +1 -1
- package/dist/production/src/model/EventsInProcessingQuery.js.map +1 -1
- package/dist/production/src/model/EventsToProcessQuery.cjs.map +1 -1
- package/dist/production/src/model/EventsToProcessQuery.js.map +1 -1
- package/dist/production/src/model/FailedEventsQuery.cjs.map +1 -1
- package/dist/production/src/model/FailedEventsQuery.js.map +1 -1
- package/dist/production/src/model/VariablesManager.cjs.map +1 -1
- package/dist/production/src/model/VariablesManager.js.map +1 -1
- package/dist/production/src/triggers/TriggerHandler.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerHandler.js.map +1 -1
- package/dist/production/src/triggers/TriggerIndirectChangesFetcher.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerIndirectChangesFetcher.js.map +1 -1
- package/dist/production/src/triggers/TriggerListenersBuilder.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerListenersBuilder.js.map +1 -1
- package/dist/production/src/triggers/TriggerListenersFactory.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerListenersFactory.js.map +1 -1
- package/dist/production/src/triggers/TriggerListenersStore.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerListenersStore.js.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadBuilder.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadBuilder.js.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadManager.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadManager.js.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadPersister.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/ActionsExecutionContainerHookFactory.d.ts +1 -1
- package/dist/types/ActionsExecutionContainerHookFactory.d.ts.map +1 -1
- package/dist/types/ListenerStoreProvider.d.ts +1 -1
- package/dist/types/ListenerStoreProvider.d.ts.map +1 -1
- package/dist/types/authorization/index.d.ts +3 -3
- package/dist/types/authorization/index.d.ts.map +1 -1
- package/dist/types/dispatch/DispatchWorkerSupervisor.d.ts +1 -1
- package/dist/types/dispatch/DispatchWorkerSupervisor.d.ts.map +1 -1
- package/dist/types/dispatch/EventDispatcher.d.ts +3 -3
- package/dist/types/dispatch/EventDispatcher.d.ts.map +1 -1
- package/dist/types/dispatch/EventsRepository.d.ts +1 -1
- package/dist/types/dispatch/EventsRepository.d.ts.map +1 -1
- package/dist/types/dispatch/LazyDispatchWorker.d.ts +1 -1
- package/dist/types/dispatch/LazyDispatchWorker.d.ts.map +1 -1
- package/dist/types/dispatch/ProjectDispatcher.d.ts +1 -1
- package/dist/types/dispatch/ProjectDispatcher.d.ts.map +1 -1
- package/dist/types/dispatch/TargetHandlerResolver.d.ts +2 -2
- package/dist/types/dispatch/TargetHandlerResolver.d.ts.map +1 -1
- package/dist/types/dispatch/WebhookTargetHandler.d.ts +2 -2
- package/dist/types/dispatch/WebhookTargetHandler.d.ts.map +1 -1
- package/dist/types/dispatch/types.d.ts +2 -2
- package/dist/types/dispatch/types.d.ts.map +1 -1
- package/dist/types/graphql/http/ActionsApiMiddlewareFactory.d.ts +3 -3
- package/dist/types/graphql/http/ActionsApiMiddlewareFactory.d.ts.map +1 -1
- package/dist/types/graphql/http/ActionsContextResolver.d.ts +1 -1
- package/dist/types/graphql/http/ActionsContextResolver.d.ts.map +1 -1
- package/dist/types/graphql/http/ActionsGraphQLHandlerFactory.d.ts +2 -2
- package/dist/types/graphql/http/ActionsGraphQLHandlerFactory.d.ts.map +1 -1
- package/dist/types/graphql/http/ActionsWebsocketControllerFactory.d.ts +2 -2
- package/dist/types/graphql/http/ActionsWebsocketControllerFactory.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/ResolversFactory.d.ts +4 -4
- package/dist/types/graphql/resolvers/ResolversFactory.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/index.d.ts +2 -2
- package/dist/types/graphql/resolvers/index.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/mutation/ProcessBatchMutationResolver.d.ts +3 -3
- package/dist/types/graphql/resolvers/mutation/ProcessBatchMutationResolver.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/mutation/RetryEventMutationResolver.d.ts +3 -3
- package/dist/types/graphql/resolvers/mutation/RetryEventMutationResolver.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/mutation/SetVariablesMutationResolver.d.ts +3 -3
- package/dist/types/graphql/resolvers/mutation/SetVariablesMutationResolver.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/mutation/StopEventMutationResolver.d.ts +3 -3
- package/dist/types/graphql/resolvers/mutation/StopEventMutationResolver.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/mutation/index.d.ts +4 -4
- package/dist/types/graphql/resolvers/mutation/index.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/query/EventsQueryResolver.d.ts +2 -2
- package/dist/types/graphql/resolvers/query/EventsQueryResolver.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/query/VariablesQueryResolver.d.ts +3 -3
- package/dist/types/graphql/resolvers/query/VariablesQueryResolver.d.ts.map +1 -1
- package/dist/types/graphql/resolvers/query/index.d.ts +1 -1
- package/dist/types/graphql/resolvers/query/index.d.ts.map +1 -1
- package/dist/types/index.d.ts +3 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/model/EventByIdQuery.d.ts +1 -1
- package/dist/types/model/EventByIdQuery.d.ts.map +1 -1
- package/dist/types/model/EventsInProcessingQuery.d.ts +2 -2
- package/dist/types/model/EventsInProcessingQuery.d.ts.map +1 -1
- package/dist/types/model/EventsToProcessQuery.d.ts +2 -2
- package/dist/types/model/EventsToProcessQuery.d.ts.map +1 -1
- package/dist/types/model/FailedEventsQuery.d.ts +2 -2
- package/dist/types/model/FailedEventsQuery.d.ts.map +1 -1
- package/dist/types/model/VariablesManager.d.ts +1 -1
- package/dist/types/model/VariablesManager.d.ts.map +1 -1
- package/dist/types/triggers/TriggerHandler.d.ts +3 -3
- package/dist/types/triggers/TriggerHandler.d.ts.map +1 -1
- package/dist/types/triggers/TriggerIndirectChangesFetcher.d.ts +1 -1
- package/dist/types/triggers/TriggerIndirectChangesFetcher.d.ts.map +1 -1
- package/dist/types/triggers/TriggerListeners.d.ts +1 -1
- package/dist/types/triggers/TriggerListeners.d.ts.map +1 -1
- package/dist/types/triggers/TriggerListenersBuilder.d.ts +1 -1
- package/dist/types/triggers/TriggerListenersBuilder.d.ts.map +1 -1
- package/dist/types/triggers/TriggerListenersFactory.d.ts +1 -1
- package/dist/types/triggers/TriggerListenersFactory.d.ts.map +1 -1
- package/dist/types/triggers/TriggerListenersStore.d.ts +1 -1
- package/dist/types/triggers/TriggerListenersStore.d.ts.map +1 -1
- package/dist/types/triggers/TriggerPayloadBuilder.d.ts +1 -1
- package/dist/types/triggers/TriggerPayloadBuilder.d.ts.map +1 -1
- package/dist/types/triggers/TriggerPayloadManager.d.ts +4 -4
- package/dist/types/triggers/TriggerPayloadManager.d.ts.map +1 -1
- package/dist/types/triggers/index.d.ts +7 -7
- package/dist/types/triggers/index.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +15 -15
- package/src/ActionsExecutionContainerHookFactory.ts +4 -4
- package/src/ListenerStoreProvider.ts +1 -1
- package/src/authorization/ActionsPermissionsFactory.ts +1 -1
- package/src/authorization/index.ts +3 -3
- package/src/dispatch/DispatchWorkerSupervisor.ts +2 -2
- package/src/dispatch/EventDispatcher.ts +4 -4
- package/src/dispatch/EventsRepository.ts +3 -3
- package/src/dispatch/LazyDispatchWorker.ts +1 -1
- package/src/dispatch/ProjectDispatcher.ts +2 -2
- package/src/dispatch/TargetHandlerResolver.ts +3 -3
- package/src/dispatch/WebhookTargetHandler.ts +3 -3
- package/src/dispatch/types.ts +2 -2
- package/src/graphql/http/ActionsApiMiddlewareFactory.ts +4 -4
- package/src/graphql/http/ActionsContextResolver.ts +1 -1
- package/src/graphql/http/ActionsGraphQLHandlerFactory.ts +3 -2
- package/src/graphql/http/ActionsWebsocketControllerFactory.ts +2 -2
- package/src/graphql/resolvers/ResolversFactory.ts +10 -5
- package/src/graphql/resolvers/index.ts +2 -2
- package/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.ts +4 -4
- package/src/graphql/resolvers/mutation/RetryEventMutationResolver.ts +5 -5
- package/src/graphql/resolvers/mutation/SetVariablesMutationResolver.ts +4 -4
- package/src/graphql/resolvers/mutation/StopEventMutationResolver.ts +4 -4
- package/src/graphql/resolvers/mutation/index.ts +4 -4
- package/src/graphql/resolvers/query/EventsQueryResolver.ts +8 -8
- package/src/graphql/resolvers/query/VariablesQueryResolver.ts +4 -4
- package/src/graphql/resolvers/query/index.ts +1 -1
- package/src/index.ts +29 -23
- package/src/migrations/index.ts +3 -3
- package/src/model/EventByIdQuery.ts +1 -1
- package/src/model/EventsInProcessingQuery.ts +2 -2
- package/src/model/EventsToProcessQuery.ts +3 -3
- package/src/model/FailedEventsQuery.ts +2 -2
- package/src/model/VariablesManager.ts +3 -3
- package/src/triggers/TriggerHandler.ts +3 -3
- package/src/triggers/TriggerIndirectChangesFetcher.ts +1 -1
- package/src/triggers/TriggerListeners.ts +1 -1
- package/src/triggers/TriggerListenersBuilder.ts +4 -4
- package/src/triggers/TriggerListenersFactory.ts +2 -2
- package/src/triggers/TriggerListenersStore.ts +1 -1
- package/src/triggers/TriggerPayloadBuilder.ts +3 -3
- package/src/triggers/TriggerPayloadManager.ts +4 -4
- package/src/triggers/TriggerPayloadPersister.ts +2 -2
- package/src/triggers/index.ts +7 -7
- package/tests/cases/unit/generator.test.ts +1 -1
- package/tests/cases/unit/lazyDispatchWorker.test.ts +2 -2
- package/tests/cases/unit/webhookHandler.test.ts +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../packages/engine-actions/src/index.ts"],"sourcesContent":["import { Plugin } from '@contember/engine-plugins'\nimport { migrationsGroup } from './migrations'\nimport { ActionsExecutionContainerHookFactory } from './ActionsExecutionContainerHookFactory'\nimport { ListenerStoreProvider } from './ListenerStoreProvider'\nimport { MigrationGroup } from '@contember/database-migrations'\nimport { MasterContainerBuilder, MasterContainerHook } from '@contember/engine-http'\nimport { ActionsApiMiddlewareFactory } from './graphql/http/ActionsApiMiddlewareFactory'\nimport { ActionsGraphQLHandlerFactory } from './graphql/http/ActionsGraphQLHandlerFactory'\nimport { ResolversFactory } from './graphql/resolvers/ResolversFactory'\nimport {\n\tEventsQueryResolver,\n\tProcessBatchMutationResolver,\n\tRetryEventMutationResolver,\n\tSetVariablesMutationResolver,\n\tStopEventMutationResolver,\n} from './graphql/resolvers'\nimport { EventDispatcher } from './dispatch/EventDispatcher'\nimport { EventsRepository } from './dispatch/EventsRepository'\nimport { TargetHandlerResolver } from './dispatch/TargetHandlerResolver'\nimport { WebhookTargetHandler } from './dispatch/WebhookTargetHandler'\nimport { ActionsContextResolver } from './graphql/http/ActionsContextResolver'\nimport { ActionsWebsocketControllerFactory } from './graphql/http/ActionsWebsocketControllerFactory'\nimport { DispatchWorkerSupervisorFactory } from './dispatch/DispatchWorkerSupervisor'\nimport { LazyDispatchWorker } from './dispatch/LazyDispatchWorker'\nimport { ProjectDispatcherFactory } from './dispatch/ProjectDispatcher'\nimport { VariablesQueryResolver } from './graphql/resolvers/query/VariablesQueryResolver'\nimport { VariablesManager } from './model/VariablesManager'\nimport { AccessEvaluator, Authorizator } from '@contember/authorization'\nimport { ActionsPermissionsFactory } from './authorization'\nimport { WebhookFetcherNative } from './dispatch/WebhookFetcher'\n\nexport {
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../packages/engine-actions/src/index.ts"],"sourcesContent":["import { Plugin } from '@contember/engine-plugins'\nimport { migrationsGroup } from './migrations/index.js'\nimport { ActionsExecutionContainerHookFactory } from './ActionsExecutionContainerHookFactory.js'\nimport { ListenerStoreProvider } from './ListenerStoreProvider.js'\nimport { MigrationGroup } from '@contember/database-migrations'\nimport { MasterContainerBuilder, MasterContainerHook } from '@contember/engine-http'\nimport { ActionsApiMiddlewareFactory } from './graphql/http/ActionsApiMiddlewareFactory.js'\nimport { ActionsGraphQLHandlerFactory } from './graphql/http/ActionsGraphQLHandlerFactory.js'\nimport { ResolversFactory } from './graphql/resolvers/ResolversFactory.js'\nimport {\n\tEventsQueryResolver,\n\tProcessBatchMutationResolver,\n\tRetryEventMutationResolver,\n\tSetVariablesMutationResolver,\n\tStopEventMutationResolver,\n} from './graphql/resolvers/index.js'\nimport { EventDispatcher } from './dispatch/EventDispatcher.js'\nimport { EventsRepository } from './dispatch/EventsRepository.js'\nimport { TargetHandlerResolver } from './dispatch/TargetHandlerResolver.js'\nimport { WebhookTargetHandler } from './dispatch/WebhookTargetHandler.js'\nimport { ActionsContextResolver } from './graphql/http/ActionsContextResolver.js'\nimport { ActionsWebsocketControllerFactory } from './graphql/http/ActionsWebsocketControllerFactory.js'\nimport { DispatchWorkerSupervisorFactory } from './dispatch/DispatchWorkerSupervisor.js'\nimport { LazyDispatchWorker } from './dispatch/LazyDispatchWorker.js'\nimport { ProjectDispatcherFactory } from './dispatch/ProjectDispatcher.js'\nimport { VariablesQueryResolver } from './graphql/resolvers/query/VariablesQueryResolver.js'\nimport { VariablesManager } from './model/VariablesManager.js'\nimport { AccessEvaluator, Authorizator } from '@contember/authorization'\nimport { ActionsPermissionsFactory } from './authorization/index.js'\nimport { WebhookFetcherNative } from './dispatch/WebhookFetcher.js'\n\nexport {\n\tTriggerHandler,\n\tTriggerIndirectChangesFetcher,\n\tTriggerListenersFactory,\n\tTriggerListenersStore,\n\tTriggerPayloadManager,\n} from './triggers/index.js'\nexport { ActionsExecutionContainerHookFactory } from './ActionsExecutionContainerHookFactory.js'\nexport { ListenerStoreProvider } from './ListenerStoreProvider.js'\n\nexport default class ActionsPlugin implements Plugin {\n\tname = 'contember/actions'\n\n\tgetSystemMigrations(): MigrationGroup {\n\t\treturn migrationsGroup\n\t}\n\n\tgetExecutionContainerHook() {\n\t\tconst hookFactory = new ActionsExecutionContainerHookFactory(new ListenerStoreProvider())\n\t\treturn hookFactory.create()\n\t}\n\n\tgetMasterContainerHook() {\n\t\tconst hook: MasterContainerHook = (builder: MasterContainerBuilder) => {\n\t\t\treturn builder\n\t\t\t\t.addService('actions_variableManager', () => {\n\t\t\t\t\treturn new VariablesManager()\n\t\t\t\t})\n\t\t\t\t.addService('actions_eventRepository', () => {\n\t\t\t\t\treturn new EventsRepository()\n\t\t\t\t})\n\t\t\t\t.addService('actions_eventDispatcher', ({ actions_eventRepository, actions_variableManager }) => {\n\t\t\t\t\tconst webhookTargetHandler = new WebhookTargetHandler(new WebhookFetcherNative())\n\t\t\t\t\tconst targetHandlerResolver = new TargetHandlerResolver(webhookTargetHandler)\n\t\t\t\t\treturn new EventDispatcher(actions_eventRepository, actions_variableManager, targetHandlerResolver)\n\t\t\t\t})\n\t\t\t\t.addService('actions_dispatchWorkerSupervisorFactory', ({ actions_eventDispatcher }) => {\n\t\t\t\t\tconst projectDispatcherFactory = new ProjectDispatcherFactory(actions_eventDispatcher)\n\t\t\t\t\treturn new DispatchWorkerSupervisorFactory(projectDispatcherFactory)\n\t\t\t\t})\n\t\t\t\t.addService('actions_authorizator', () => {\n\t\t\t\t\treturn new Authorizator.Default(new AccessEvaluator.PermissionEvaluator(new ActionsPermissionsFactory().create()))\n\t\t\t\t})\n\t\t\t\t.setupService(\n\t\t\t\t\t'application',\n\t\t\t\t\t(\n\t\t\t\t\t\tit,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprojectContextResolver,\n\t\t\t\t\t\t\tdebugMode,\n\t\t\t\t\t\t\tactions_eventRepository,\n\t\t\t\t\t\t\tactions_eventDispatcher,\n\t\t\t\t\t\t\tactions_dispatchWorkerSupervisorFactory,\n\t\t\t\t\t\t\tactions_variableManager,\n\t\t\t\t\t\t\tactions_authorizator,\n\t\t\t\t\t\t},\n\t\t\t\t\t) => {\n\t\t\t\t\t\tconst handlerFactory = new ActionsGraphQLHandlerFactory()\n\t\t\t\t\t\tconst eventsQueryResolver = new EventsQueryResolver()\n\t\t\t\t\t\tconst processBatchMutationResolver = new ProcessBatchMutationResolver(actions_eventDispatcher)\n\t\t\t\t\t\tconst variablesQueryResolver = new VariablesQueryResolver(actions_variableManager)\n\t\t\t\t\t\tconst setVariablesMutationResolver = new SetVariablesMutationResolver(actions_variableManager)\n\t\t\t\t\t\tconst resolversFactory = new ResolversFactory(\n\t\t\t\t\t\t\teventsQueryResolver,\n\t\t\t\t\t\t\tprocessBatchMutationResolver,\n\t\t\t\t\t\t\tvariablesQueryResolver,\n\t\t\t\t\t\t\tsetVariablesMutationResolver,\n\t\t\t\t\t\t\tnew RetryEventMutationResolver(actions_eventRepository),\n\t\t\t\t\t\t\tnew StopEventMutationResolver(actions_eventRepository),\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\tconst actionsContextResolver = new ActionsContextResolver(debugMode, projectContextResolver)\n\t\t\t\t\t\tconst actionsMiddlewareFactory = new ActionsApiMiddlewareFactory(\n\t\t\t\t\t\t\tactionsContextResolver,\n\t\t\t\t\t\t\thandlerFactory.create(resolversFactory),\n\t\t\t\t\t\t\tactions_authorizator,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst actionsWebsocketMiddlewareFactory = new ActionsWebsocketControllerFactory(\n\t\t\t\t\t\t\tdebugMode,\n\t\t\t\t\t\t\tactionsContextResolver,\n\t\t\t\t\t\t\tactions_dispatchWorkerSupervisorFactory,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tit.addRoute('actions', '/actions/:projectSlug', actionsMiddlewareFactory.create())\n\t\t\t\t\t\tit.addWebsocketRoute('actions', '/actions/_worker', actionsWebsocketMiddlewareFactory.create())\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\t.setupService(\n\t\t\t\t\t'applicationWorkers',\n\t\t\t\t\t(it, { actions_dispatchWorkerSupervisorFactory, projectGroupContainer, projectGroupContainerResolver, serverConfig }) => {\n\t\t\t\t\t\tif (!(serverConfig as any).projectGroup) {\n\t\t\t\t\t\t\tit.registerWorker(this.name, actions_dispatchWorkerSupervisorFactory.create(projectGroupContainer))\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tit.registerWorker(this.name, new LazyDispatchWorker(projectGroupContainerResolver, actions_dispatchWorkerSupervisorFactory))\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t) as unknown as MasterContainerBuilder\n\t\t}\n\t\treturn hook\n\t}\n}\n"],"names":["migrationsGroup","ActionsExecutionContainerHookFactory","ListenerStoreProvider","VariablesManager","EventsRepository","WebhookTargetHandler","WebhookFetcherNative","TargetHandlerResolver","EventDispatcher","ProjectDispatcherFactory","DispatchWorkerSupervisorFactory","Authorizator","AccessEvaluator","ActionsPermissionsFactory","ActionsGraphQLHandlerFactory","EventsQueryResolver","ProcessBatchMutationResolver","VariablesQueryResolver","SetVariablesMutationResolver","ResolversFactory","RetryEventMutationResolver","StopEventMutationResolver","ActionsContextResolver","ActionsApiMiddlewareFactory","ActionsWebsocketControllerFactory","LazyDispatchWorker"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,MAAqB,cAAgC;AAAA,EAArD,cAAA;AACC,kBAAA,MAAA,QAAO,mBAAA;AAAA,EAAA;AAAA,EAEP,sBAAsC;AACrC,WAAOA,MAAAA;AAAAA,EACR;AAAA,EAEA,4BAA4B;AAC3B,UAAM,cAAc,IAAIC,0EAAqC,IAAIC,sBAAAA,uBAAuB;AACxF,WAAO,YAAY,OAAA;AAAA,EACpB;AAAA,EAEA,yBAAyB;AACxB,UAAM,OAA4B,CAAC,YAAoC;AACtE,aAAO,QACL,WAAW,2BAA2B,MAAM;AAC5C,eAAO,IAAIC,iBAAAA,iBAAA;AAAA,MACZ,CAAC,EACA,WAAW,2BAA2B,MAAM;AAC5C,eAAO,IAAIC,iBAAAA,iBAAA;AAAA,MACZ,CAAC,EACA,WAAW,2BAA2B,CAAC,EAAE,yBAAyB,8BAA8B;AAChG,cAAM,uBAAuB,IAAIC,0CAAqB,IAAIC,eAAAA,sBAAsB;AAChF,cAAM,wBAAwB,IAAIC,sBAAAA,sBAAsB,oBAAoB;AAC5E,eAAO,IAAIC,gBAAAA,gBAAgB,yBAAyB,yBAAyB,qBAAqB;AAAA,MACnG,CAAC,EACA,WAAW,2CAA2C,CAAC,EAAE,8BAA8B;AACvF,cAAM,2BAA2B,IAAIC,kBAAAA,yBAAyB,uBAAuB;AACrF,eAAO,IAAIC,yBAAAA,gCAAgC,wBAAwB;AAAA,MACpE,CAAC,EACA,WAAW,wBAAwB,MAAM;AACzC,eAAO,IAAIC,cAAAA,aAAa,QAAQ,IAAIC,cAAAA,gBAAgB,oBAAoB,IAAIC,0BAAAA,0BAAA,EAA4B,OAAA,CAAQ,CAAC;AAAA,MAClH,CAAC,EACA;AAAA,QACA;AAAA,QACA,CACC,IACA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,MAEG;AACJ,gBAAM,iBAAiB,IAAIC,0DAAA;AAC3B,gBAAM,sBAAsB,IAAIC,wCAAA;AAChC,gBAAM,+BAA+B,IAAIC,6BAAAA,6BAA6B,uBAAuB;AAC7F,gBAAM,yBAAyB,IAAIC,uBAAAA,uBAAuB,uBAAuB;AACjF,gBAAM,+BAA+B,IAAIC,6BAAAA,6BAA6B,uBAAuB;AAC7F,gBAAM,mBAAmB,IAAIC,iBAAAA;AAAAA,YAC5B;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,IAAIC,2BAAAA,2BAA2B,uBAAuB;AAAA,YACtD,IAAIC,0BAAAA,0BAA0B,uBAAuB;AAAA,UAAA;AAGtD,gBAAM,yBAAyB,IAAIC,8CAAuB,WAAW,sBAAsB;AAC3F,gBAAM,2BAA2B,IAAIC,4BAAAA;AAAAA,YACpC;AAAA,YACA,eAAe,OAAO,gBAAgB;AAAA,YACtC;AAAA,UAAA;AAED,gBAAM,oCAAoC,IAAIC,kCAAAA;AAAAA,YAC7C;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAED,aAAG,SAAS,WAAW,yBAAyB,yBAAyB,QAAQ;AACjF,aAAG,kBAAkB,WAAW,oBAAoB,kCAAkC,QAAQ;AAAA,QAC/F;AAAA,MAAA,EAEA;AAAA,QACA;AAAA,QACA,CAAC,IAAI,EAAE,yCAAyC,uBAAuB,+BAA+B,mBAAmB;AACxH,cAAI,CAAE,aAAqB,cAAc;AACxC,eAAG,eAAe,KAAK,MAAM,wCAAwC,OAAO,qBAAqB,CAAC;AAAA,UACnG,OAAO;AACN,eAAG,eAAe,KAAK,MAAM,IAAIC,sCAAmB,+BAA+B,uCAAuC,CAAC;AAAA,UAC5H;AAAA,QACD;AAAA,MAAA;AAAA,IAEH;AACA,WAAO;AAAA,EACR;AACD;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../packages/engine-actions/src/index.ts"],"sourcesContent":["import { Plugin } from '@contember/engine-plugins'\nimport { migrationsGroup } from './migrations'\nimport { ActionsExecutionContainerHookFactory } from './ActionsExecutionContainerHookFactory'\nimport { ListenerStoreProvider } from './ListenerStoreProvider'\nimport { MigrationGroup } from '@contember/database-migrations'\nimport { MasterContainerBuilder, MasterContainerHook } from '@contember/engine-http'\nimport { ActionsApiMiddlewareFactory } from './graphql/http/ActionsApiMiddlewareFactory'\nimport { ActionsGraphQLHandlerFactory } from './graphql/http/ActionsGraphQLHandlerFactory'\nimport { ResolversFactory } from './graphql/resolvers/ResolversFactory'\nimport {\n\tEventsQueryResolver,\n\tProcessBatchMutationResolver,\n\tRetryEventMutationResolver,\n\tSetVariablesMutationResolver,\n\tStopEventMutationResolver,\n} from './graphql/resolvers'\nimport { EventDispatcher } from './dispatch/EventDispatcher'\nimport { EventsRepository } from './dispatch/EventsRepository'\nimport { TargetHandlerResolver } from './dispatch/TargetHandlerResolver'\nimport { WebhookTargetHandler } from './dispatch/WebhookTargetHandler'\nimport { ActionsContextResolver } from './graphql/http/ActionsContextResolver'\nimport { ActionsWebsocketControllerFactory } from './graphql/http/ActionsWebsocketControllerFactory'\nimport { DispatchWorkerSupervisorFactory } from './dispatch/DispatchWorkerSupervisor'\nimport { LazyDispatchWorker } from './dispatch/LazyDispatchWorker'\nimport { ProjectDispatcherFactory } from './dispatch/ProjectDispatcher'\nimport { VariablesQueryResolver } from './graphql/resolvers/query/VariablesQueryResolver'\nimport { VariablesManager } from './model/VariablesManager'\nimport { AccessEvaluator, Authorizator } from '@contember/authorization'\nimport { ActionsPermissionsFactory } from './authorization'\nimport { WebhookFetcherNative } from './dispatch/WebhookFetcher'\n\nexport {
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../packages/engine-actions/src/index.ts"],"sourcesContent":["import { Plugin } from '@contember/engine-plugins'\nimport { migrationsGroup } from './migrations/index.js'\nimport { ActionsExecutionContainerHookFactory } from './ActionsExecutionContainerHookFactory.js'\nimport { ListenerStoreProvider } from './ListenerStoreProvider.js'\nimport { MigrationGroup } from '@contember/database-migrations'\nimport { MasterContainerBuilder, MasterContainerHook } from '@contember/engine-http'\nimport { ActionsApiMiddlewareFactory } from './graphql/http/ActionsApiMiddlewareFactory.js'\nimport { ActionsGraphQLHandlerFactory } from './graphql/http/ActionsGraphQLHandlerFactory.js'\nimport { ResolversFactory } from './graphql/resolvers/ResolversFactory.js'\nimport {\n\tEventsQueryResolver,\n\tProcessBatchMutationResolver,\n\tRetryEventMutationResolver,\n\tSetVariablesMutationResolver,\n\tStopEventMutationResolver,\n} from './graphql/resolvers/index.js'\nimport { EventDispatcher } from './dispatch/EventDispatcher.js'\nimport { EventsRepository } from './dispatch/EventsRepository.js'\nimport { TargetHandlerResolver } from './dispatch/TargetHandlerResolver.js'\nimport { WebhookTargetHandler } from './dispatch/WebhookTargetHandler.js'\nimport { ActionsContextResolver } from './graphql/http/ActionsContextResolver.js'\nimport { ActionsWebsocketControllerFactory } from './graphql/http/ActionsWebsocketControllerFactory.js'\nimport { DispatchWorkerSupervisorFactory } from './dispatch/DispatchWorkerSupervisor.js'\nimport { LazyDispatchWorker } from './dispatch/LazyDispatchWorker.js'\nimport { ProjectDispatcherFactory } from './dispatch/ProjectDispatcher.js'\nimport { VariablesQueryResolver } from './graphql/resolvers/query/VariablesQueryResolver.js'\nimport { VariablesManager } from './model/VariablesManager.js'\nimport { AccessEvaluator, Authorizator } from '@contember/authorization'\nimport { ActionsPermissionsFactory } from './authorization/index.js'\nimport { WebhookFetcherNative } from './dispatch/WebhookFetcher.js'\n\nexport {\n\tTriggerHandler,\n\tTriggerIndirectChangesFetcher,\n\tTriggerListenersFactory,\n\tTriggerListenersStore,\n\tTriggerPayloadManager,\n} from './triggers/index.js'\nexport { ActionsExecutionContainerHookFactory } from './ActionsExecutionContainerHookFactory.js'\nexport { ListenerStoreProvider } from './ListenerStoreProvider.js'\n\nexport default class ActionsPlugin implements Plugin {\n\tname = 'contember/actions'\n\n\tgetSystemMigrations(): MigrationGroup {\n\t\treturn migrationsGroup\n\t}\n\n\tgetExecutionContainerHook() {\n\t\tconst hookFactory = new ActionsExecutionContainerHookFactory(new ListenerStoreProvider())\n\t\treturn hookFactory.create()\n\t}\n\n\tgetMasterContainerHook() {\n\t\tconst hook: MasterContainerHook = (builder: MasterContainerBuilder) => {\n\t\t\treturn builder\n\t\t\t\t.addService('actions_variableManager', () => {\n\t\t\t\t\treturn new VariablesManager()\n\t\t\t\t})\n\t\t\t\t.addService('actions_eventRepository', () => {\n\t\t\t\t\treturn new EventsRepository()\n\t\t\t\t})\n\t\t\t\t.addService('actions_eventDispatcher', ({ actions_eventRepository, actions_variableManager }) => {\n\t\t\t\t\tconst webhookTargetHandler = new WebhookTargetHandler(new WebhookFetcherNative())\n\t\t\t\t\tconst targetHandlerResolver = new TargetHandlerResolver(webhookTargetHandler)\n\t\t\t\t\treturn new EventDispatcher(actions_eventRepository, actions_variableManager, targetHandlerResolver)\n\t\t\t\t})\n\t\t\t\t.addService('actions_dispatchWorkerSupervisorFactory', ({ actions_eventDispatcher }) => {\n\t\t\t\t\tconst projectDispatcherFactory = new ProjectDispatcherFactory(actions_eventDispatcher)\n\t\t\t\t\treturn new DispatchWorkerSupervisorFactory(projectDispatcherFactory)\n\t\t\t\t})\n\t\t\t\t.addService('actions_authorizator', () => {\n\t\t\t\t\treturn new Authorizator.Default(new AccessEvaluator.PermissionEvaluator(new ActionsPermissionsFactory().create()))\n\t\t\t\t})\n\t\t\t\t.setupService(\n\t\t\t\t\t'application',\n\t\t\t\t\t(\n\t\t\t\t\t\tit,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprojectContextResolver,\n\t\t\t\t\t\t\tdebugMode,\n\t\t\t\t\t\t\tactions_eventRepository,\n\t\t\t\t\t\t\tactions_eventDispatcher,\n\t\t\t\t\t\t\tactions_dispatchWorkerSupervisorFactory,\n\t\t\t\t\t\t\tactions_variableManager,\n\t\t\t\t\t\t\tactions_authorizator,\n\t\t\t\t\t\t},\n\t\t\t\t\t) => {\n\t\t\t\t\t\tconst handlerFactory = new ActionsGraphQLHandlerFactory()\n\t\t\t\t\t\tconst eventsQueryResolver = new EventsQueryResolver()\n\t\t\t\t\t\tconst processBatchMutationResolver = new ProcessBatchMutationResolver(actions_eventDispatcher)\n\t\t\t\t\t\tconst variablesQueryResolver = new VariablesQueryResolver(actions_variableManager)\n\t\t\t\t\t\tconst setVariablesMutationResolver = new SetVariablesMutationResolver(actions_variableManager)\n\t\t\t\t\t\tconst resolversFactory = new ResolversFactory(\n\t\t\t\t\t\t\teventsQueryResolver,\n\t\t\t\t\t\t\tprocessBatchMutationResolver,\n\t\t\t\t\t\t\tvariablesQueryResolver,\n\t\t\t\t\t\t\tsetVariablesMutationResolver,\n\t\t\t\t\t\t\tnew RetryEventMutationResolver(actions_eventRepository),\n\t\t\t\t\t\t\tnew StopEventMutationResolver(actions_eventRepository),\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\tconst actionsContextResolver = new ActionsContextResolver(debugMode, projectContextResolver)\n\t\t\t\t\t\tconst actionsMiddlewareFactory = new ActionsApiMiddlewareFactory(\n\t\t\t\t\t\t\tactionsContextResolver,\n\t\t\t\t\t\t\thandlerFactory.create(resolversFactory),\n\t\t\t\t\t\t\tactions_authorizator,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst actionsWebsocketMiddlewareFactory = new ActionsWebsocketControllerFactory(\n\t\t\t\t\t\t\tdebugMode,\n\t\t\t\t\t\t\tactionsContextResolver,\n\t\t\t\t\t\t\tactions_dispatchWorkerSupervisorFactory,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tit.addRoute('actions', '/actions/:projectSlug', actionsMiddlewareFactory.create())\n\t\t\t\t\t\tit.addWebsocketRoute('actions', '/actions/_worker', actionsWebsocketMiddlewareFactory.create())\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t\t.setupService(\n\t\t\t\t\t'applicationWorkers',\n\t\t\t\t\t(it, { actions_dispatchWorkerSupervisorFactory, projectGroupContainer, projectGroupContainerResolver, serverConfig }) => {\n\t\t\t\t\t\tif (!(serverConfig as any).projectGroup) {\n\t\t\t\t\t\t\tit.registerWorker(this.name, actions_dispatchWorkerSupervisorFactory.create(projectGroupContainer))\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tit.registerWorker(this.name, new LazyDispatchWorker(projectGroupContainerResolver, actions_dispatchWorkerSupervisorFactory))\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t) as unknown as MasterContainerBuilder\n\t\t}\n\t\treturn hook\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,MAAqB,cAAgC;AAAA,EAArD,cAAA;AACC,kBAAA,MAAA,QAAO,mBAAA;AAAA,EAAA;AAAA,EAEP,sBAAsC;AACrC,WAAO;AAAA,EACR;AAAA,EAEA,4BAA4B;AAC3B,UAAM,cAAc,IAAI,qCAAqC,IAAI,uBAAuB;AACxF,WAAO,YAAY,OAAA;AAAA,EACpB;AAAA,EAEA,yBAAyB;AACxB,UAAM,OAA4B,CAAC,YAAoC;AACtE,aAAO,QACL,WAAW,2BAA2B,MAAM;AAC5C,eAAO,IAAI,iBAAA;AAAA,MACZ,CAAC,EACA,WAAW,2BAA2B,MAAM;AAC5C,eAAO,IAAI,iBAAA;AAAA,MACZ,CAAC,EACA,WAAW,2BAA2B,CAAC,EAAE,yBAAyB,8BAA8B;AAChG,cAAM,uBAAuB,IAAI,qBAAqB,IAAI,sBAAsB;AAChF,cAAM,wBAAwB,IAAI,sBAAsB,oBAAoB;AAC5E,eAAO,IAAI,gBAAgB,yBAAyB,yBAAyB,qBAAqB;AAAA,MACnG,CAAC,EACA,WAAW,2CAA2C,CAAC,EAAE,8BAA8B;AACvF,cAAM,2BAA2B,IAAI,yBAAyB,uBAAuB;AACrF,eAAO,IAAI,gCAAgC,wBAAwB;AAAA,MACpE,CAAC,EACA,WAAW,wBAAwB,MAAM;AACzC,eAAO,IAAI,aAAa,QAAQ,IAAI,gBAAgB,oBAAoB,IAAI,0BAAA,EAA4B,OAAA,CAAQ,CAAC;AAAA,MAClH,CAAC,EACA;AAAA,QACA;AAAA,QACA,CACC,IACA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,MAEG;AACJ,gBAAM,iBAAiB,IAAI,6BAAA;AAC3B,gBAAM,sBAAsB,IAAI,oBAAA;AAChC,gBAAM,+BAA+B,IAAI,6BAA6B,uBAAuB;AAC7F,gBAAM,yBAAyB,IAAI,uBAAuB,uBAAuB;AACjF,gBAAM,+BAA+B,IAAI,6BAA6B,uBAAuB;AAC7F,gBAAM,mBAAmB,IAAI;AAAA,YAC5B;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,IAAI,2BAA2B,uBAAuB;AAAA,YACtD,IAAI,0BAA0B,uBAAuB;AAAA,UAAA;AAGtD,gBAAM,yBAAyB,IAAI,uBAAuB,WAAW,sBAAsB;AAC3F,gBAAM,2BAA2B,IAAI;AAAA,YACpC;AAAA,YACA,eAAe,OAAO,gBAAgB;AAAA,YACtC;AAAA,UAAA;AAED,gBAAM,oCAAoC,IAAI;AAAA,YAC7C;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAED,aAAG,SAAS,WAAW,yBAAyB,yBAAyB,QAAQ;AACjF,aAAG,kBAAkB,WAAW,oBAAoB,kCAAkC,QAAQ;AAAA,QAC/F;AAAA,MAAA,EAEA;AAAA,QACA;AAAA,QACA,CAAC,IAAI,EAAE,yCAAyC,uBAAuB,+BAA+B,mBAAmB;AACxH,cAAI,CAAE,aAAqB,cAAc;AACxC,eAAG,eAAe,KAAK,MAAM,wCAAwC,OAAO,qBAAqB,CAAC;AAAA,UACnG,OAAO;AACN,eAAG,eAAe,KAAK,MAAM,IAAI,mBAAmB,+BAA+B,uCAAuC,CAAC;AAAA,UAC5H;AAAA,QACD;AAAA,MAAA;AAAA,IAEH;AACA,WAAO;AAAA,EACR;AACD;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsExecutionContainerHookFactory.cjs","sources":["../../../../packages/engine-actions/src/ActionsExecutionContainerHookFactory.ts"],"sourcesContent":["import { TriggerHandler, TriggerIndirectChangesFetcher, TriggerPayloadManager } from './triggers'\nimport { ListenerStoreProvider } from './ListenerStoreProvider'\nimport { TriggerPayloadBuilder } from './triggers/TriggerPayloadBuilder'\nimport { TriggerPayloadPersister } from './triggers/TriggerPayloadPersister'\nimport { ExecutionContainerHook } from '@contember/engine-content-api'\n\nexport class ActionsExecutionContainerHookFactory {\n\tconstructor(\n\t\tprivate readonly listenerStoreProvider: ListenerStoreProvider,\n\t) {\n\t}\n\n\tcreate(): ExecutionContainerHook {\n\t\treturn builder => {\n\t\t\treturn builder.setupService(\n\t\t\t\t'mapperFactory',\n\t\t\t\t(\n\t\t\t\t\tmapperFactory,\n\t\t\t\t\t{ whereBuilder, schema, pathFactory, systemSchema, providers, stage, project, schemaMeta, joinBuilder, userInfo, triggeredActionsCollector },\n\t\t\t\t) => {\n\t\t\t\t\tmapperFactory.hooks.push(mapper => {\n\t\t\t\t\t\tconst triggerPayloadPersister = new TriggerPayloadPersister(\n\t\t\t\t\t\t\tmapper,\n\t\t\t\t\t\t\tmapper.db.forSchema(systemSchema),\n\t\t\t\t\t\t\tproviders,\n\t\t\t\t\t\t\tproject.slug,\n\t\t\t\t\t\t\tstage.id,\n\t\t\t\t\t\t\tschemaMeta.id,\n\t\t\t\t\t\t\tmapper.identityId,\n\t\t\t\t\t\t\tuserInfo,\n\t\t\t\t\t\t\ttriggeredActionsCollector,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst triggerPayloadBuilder = new TriggerPayloadBuilder(mapper)\n\t\t\t\t\t\tconst payloadManager = new TriggerPayloadManager(triggerPayloadBuilder, triggerPayloadPersister)\n\t\t\t\t\t\tconst changesFetcher = new TriggerIndirectChangesFetcher(schema.model, mapper, whereBuilder, joinBuilder, pathFactory)\n\t\t\t\t\t\tconst listenersStore = this.listenerStoreProvider.getListenerStore(schema)\n\t\t\t\t\t\tconst triggerHandler = new TriggerHandler(payloadManager, listenersStore, changesFetcher)\n\t\t\t\t\t\ttriggerHandler.attach(mapper.eventManager)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t}\n}\n"],"names":["TriggerPayloadPersister","TriggerPayloadBuilder","TriggerPayloadManager","TriggerIndirectChangesFetcher","TriggerHandler"],"mappings":";;;;;;;;AAMO,MAAM,qCAAqC;AAAA,EACjD,YACkB,uBAChB;AADgB,SAAA,wBAAA;AAAA,EAElB;AAAA,EAEA,SAAiC;AAChC,WAAO,CAAA,YAAW;AACjB,aAAO,QAAQ;AAAA,QACd;AAAA,QACA,CACC,eACA,EAAE,cAAc,QAAQ,aAAa,cAAc,WAAW,OAAO,SAAS,YAAY,aAAa,UAAU,gCAC7G;AACJ,wBAAc,MAAM,KAAK,CAAA,WAAU;AAClC,kBAAM,0BAA0B,IAAIA,wBAAAA;AAAAA,cACnC;AAAA,cACA,OAAO,GAAG,UAAU,YAAY;AAAA,cAChC;AAAA,cACA,QAAQ;AAAA,cACR,MAAM;AAAA,cACN,WAAW;AAAA,cACX,OAAO;AAAA,cACP;AAAA,cACA;AAAA,YAAA;AAED,kBAAM,wBAAwB,IAAIC,sBAAAA,sBAAsB,MAAM;AAC9D,kBAAM,iBAAiB,IAAIC,4CAAsB,uBAAuB,uBAAuB;AAC/F,kBAAM,iBAAiB,IAAIC,8BAAAA,8BAA8B,OAAO,OAAO,QAAQ,cAAc,aAAa,WAAW;AACrH,kBAAM,iBAAiB,KAAK,sBAAsB,iBAAiB,MAAM;AACzE,kBAAM,iBAAiB,IAAIC,eAAAA,eAAe,gBAAgB,gBAAgB,cAAc;AACxF,2BAAe,OAAO,OAAO,YAAY;AAAA,UAC1C,CAAC;AAAA,QACF;AAAA,MAAA;AAAA,IAEF;AAAA,EACD;AACD;;"}
|
|
1
|
+
{"version":3,"file":"ActionsExecutionContainerHookFactory.cjs","sources":["../../../../packages/engine-actions/src/ActionsExecutionContainerHookFactory.ts"],"sourcesContent":["import { TriggerHandler, TriggerIndirectChangesFetcher, TriggerPayloadManager } from './triggers/index.js'\nimport { ListenerStoreProvider } from './ListenerStoreProvider.js'\nimport { TriggerPayloadBuilder } from './triggers/TriggerPayloadBuilder.js'\nimport { TriggerPayloadPersister } from './triggers/TriggerPayloadPersister.js'\nimport { ExecutionContainerHook } from '@contember/engine-content-api'\n\nexport class ActionsExecutionContainerHookFactory {\n\tconstructor(\n\t\tprivate readonly listenerStoreProvider: ListenerStoreProvider,\n\t) {\n\t}\n\n\tcreate(): ExecutionContainerHook {\n\t\treturn builder => {\n\t\t\treturn builder.setupService(\n\t\t\t\t'mapperFactory',\n\t\t\t\t(\n\t\t\t\t\tmapperFactory,\n\t\t\t\t\t{ whereBuilder, schema, pathFactory, systemSchema, providers, stage, project, schemaMeta, joinBuilder, userInfo, triggeredActionsCollector },\n\t\t\t\t) => {\n\t\t\t\t\tmapperFactory.hooks.push(mapper => {\n\t\t\t\t\t\tconst triggerPayloadPersister = new TriggerPayloadPersister(\n\t\t\t\t\t\t\tmapper,\n\t\t\t\t\t\t\tmapper.db.forSchema(systemSchema),\n\t\t\t\t\t\t\tproviders,\n\t\t\t\t\t\t\tproject.slug,\n\t\t\t\t\t\t\tstage.id,\n\t\t\t\t\t\t\tschemaMeta.id,\n\t\t\t\t\t\t\tmapper.identityId,\n\t\t\t\t\t\t\tuserInfo,\n\t\t\t\t\t\t\ttriggeredActionsCollector,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst triggerPayloadBuilder = new TriggerPayloadBuilder(mapper)\n\t\t\t\t\t\tconst payloadManager = new TriggerPayloadManager(triggerPayloadBuilder, triggerPayloadPersister)\n\t\t\t\t\t\tconst changesFetcher = new TriggerIndirectChangesFetcher(schema.model, mapper, whereBuilder, joinBuilder, pathFactory)\n\t\t\t\t\t\tconst listenersStore = this.listenerStoreProvider.getListenerStore(schema)\n\t\t\t\t\t\tconst triggerHandler = new TriggerHandler(payloadManager, listenersStore, changesFetcher)\n\t\t\t\t\t\ttriggerHandler.attach(mapper.eventManager)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t}\n}\n"],"names":["TriggerPayloadPersister","TriggerPayloadBuilder","TriggerPayloadManager","TriggerIndirectChangesFetcher","TriggerHandler"],"mappings":";;;;;;;;AAMO,MAAM,qCAAqC;AAAA,EACjD,YACkB,uBAChB;AADgB,SAAA,wBAAA;AAAA,EAElB;AAAA,EAEA,SAAiC;AAChC,WAAO,CAAA,YAAW;AACjB,aAAO,QAAQ;AAAA,QACd;AAAA,QACA,CACC,eACA,EAAE,cAAc,QAAQ,aAAa,cAAc,WAAW,OAAO,SAAS,YAAY,aAAa,UAAU,gCAC7G;AACJ,wBAAc,MAAM,KAAK,CAAA,WAAU;AAClC,kBAAM,0BAA0B,IAAIA,wBAAAA;AAAAA,cACnC;AAAA,cACA,OAAO,GAAG,UAAU,YAAY;AAAA,cAChC;AAAA,cACA,QAAQ;AAAA,cACR,MAAM;AAAA,cACN,WAAW;AAAA,cACX,OAAO;AAAA,cACP;AAAA,cACA;AAAA,YAAA;AAED,kBAAM,wBAAwB,IAAIC,sBAAAA,sBAAsB,MAAM;AAC9D,kBAAM,iBAAiB,IAAIC,4CAAsB,uBAAuB,uBAAuB;AAC/F,kBAAM,iBAAiB,IAAIC,8BAAAA,8BAA8B,OAAO,OAAO,QAAQ,cAAc,aAAa,WAAW;AACrH,kBAAM,iBAAiB,KAAK,sBAAsB,iBAAiB,MAAM;AACzE,kBAAM,iBAAiB,IAAIC,eAAAA,eAAe,gBAAgB,gBAAgB,cAAc;AACxF,2BAAe,OAAO,OAAO,YAAY;AAAA,UAC1C,CAAC;AAAA,QACF;AAAA,MAAA;AAAA,IAEF;AAAA,EACD;AACD;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsExecutionContainerHookFactory.js","sources":["../../../../packages/engine-actions/src/ActionsExecutionContainerHookFactory.ts"],"sourcesContent":["import { TriggerHandler, TriggerIndirectChangesFetcher, TriggerPayloadManager } from './triggers'\nimport { ListenerStoreProvider } from './ListenerStoreProvider'\nimport { TriggerPayloadBuilder } from './triggers/TriggerPayloadBuilder'\nimport { TriggerPayloadPersister } from './triggers/TriggerPayloadPersister'\nimport { ExecutionContainerHook } from '@contember/engine-content-api'\n\nexport class ActionsExecutionContainerHookFactory {\n\tconstructor(\n\t\tprivate readonly listenerStoreProvider: ListenerStoreProvider,\n\t) {\n\t}\n\n\tcreate(): ExecutionContainerHook {\n\t\treturn builder => {\n\t\t\treturn builder.setupService(\n\t\t\t\t'mapperFactory',\n\t\t\t\t(\n\t\t\t\t\tmapperFactory,\n\t\t\t\t\t{ whereBuilder, schema, pathFactory, systemSchema, providers, stage, project, schemaMeta, joinBuilder, userInfo, triggeredActionsCollector },\n\t\t\t\t) => {\n\t\t\t\t\tmapperFactory.hooks.push(mapper => {\n\t\t\t\t\t\tconst triggerPayloadPersister = new TriggerPayloadPersister(\n\t\t\t\t\t\t\tmapper,\n\t\t\t\t\t\t\tmapper.db.forSchema(systemSchema),\n\t\t\t\t\t\t\tproviders,\n\t\t\t\t\t\t\tproject.slug,\n\t\t\t\t\t\t\tstage.id,\n\t\t\t\t\t\t\tschemaMeta.id,\n\t\t\t\t\t\t\tmapper.identityId,\n\t\t\t\t\t\t\tuserInfo,\n\t\t\t\t\t\t\ttriggeredActionsCollector,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst triggerPayloadBuilder = new TriggerPayloadBuilder(mapper)\n\t\t\t\t\t\tconst payloadManager = new TriggerPayloadManager(triggerPayloadBuilder, triggerPayloadPersister)\n\t\t\t\t\t\tconst changesFetcher = new TriggerIndirectChangesFetcher(schema.model, mapper, whereBuilder, joinBuilder, pathFactory)\n\t\t\t\t\t\tconst listenersStore = this.listenerStoreProvider.getListenerStore(schema)\n\t\t\t\t\t\tconst triggerHandler = new TriggerHandler(payloadManager, listenersStore, changesFetcher)\n\t\t\t\t\t\ttriggerHandler.attach(mapper.eventManager)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;;;;AAMO,MAAM,qCAAqC;AAAA,EACjD,YACkB,uBAChB;AADgB,SAAA,wBAAA;AAAA,EAElB;AAAA,EAEA,SAAiC;AAChC,WAAO,CAAA,YAAW;AACjB,aAAO,QAAQ;AAAA,QACd;AAAA,QACA,CACC,eACA,EAAE,cAAc,QAAQ,aAAa,cAAc,WAAW,OAAO,SAAS,YAAY,aAAa,UAAU,gCAC7G;AACJ,wBAAc,MAAM,KAAK,CAAA,WAAU;AAClC,kBAAM,0BAA0B,IAAI;AAAA,cACnC;AAAA,cACA,OAAO,GAAG,UAAU,YAAY;AAAA,cAChC;AAAA,cACA,QAAQ;AAAA,cACR,MAAM;AAAA,cACN,WAAW;AAAA,cACX,OAAO;AAAA,cACP;AAAA,cACA;AAAA,YAAA;AAED,kBAAM,wBAAwB,IAAI,sBAAsB,MAAM;AAC9D,kBAAM,iBAAiB,IAAI,sBAAsB,uBAAuB,uBAAuB;AAC/F,kBAAM,iBAAiB,IAAI,8BAA8B,OAAO,OAAO,QAAQ,cAAc,aAAa,WAAW;AACrH,kBAAM,iBAAiB,KAAK,sBAAsB,iBAAiB,MAAM;AACzE,kBAAM,iBAAiB,IAAI,eAAe,gBAAgB,gBAAgB,cAAc;AACxF,2BAAe,OAAO,OAAO,YAAY;AAAA,UAC1C,CAAC;AAAA,QACF;AAAA,MAAA;AAAA,IAEF;AAAA,EACD;AACD;"}
|
|
1
|
+
{"version":3,"file":"ActionsExecutionContainerHookFactory.js","sources":["../../../../packages/engine-actions/src/ActionsExecutionContainerHookFactory.ts"],"sourcesContent":["import { TriggerHandler, TriggerIndirectChangesFetcher, TriggerPayloadManager } from './triggers/index.js'\nimport { ListenerStoreProvider } from './ListenerStoreProvider.js'\nimport { TriggerPayloadBuilder } from './triggers/TriggerPayloadBuilder.js'\nimport { TriggerPayloadPersister } from './triggers/TriggerPayloadPersister.js'\nimport { ExecutionContainerHook } from '@contember/engine-content-api'\n\nexport class ActionsExecutionContainerHookFactory {\n\tconstructor(\n\t\tprivate readonly listenerStoreProvider: ListenerStoreProvider,\n\t) {\n\t}\n\n\tcreate(): ExecutionContainerHook {\n\t\treturn builder => {\n\t\t\treturn builder.setupService(\n\t\t\t\t'mapperFactory',\n\t\t\t\t(\n\t\t\t\t\tmapperFactory,\n\t\t\t\t\t{ whereBuilder, schema, pathFactory, systemSchema, providers, stage, project, schemaMeta, joinBuilder, userInfo, triggeredActionsCollector },\n\t\t\t\t) => {\n\t\t\t\t\tmapperFactory.hooks.push(mapper => {\n\t\t\t\t\t\tconst triggerPayloadPersister = new TriggerPayloadPersister(\n\t\t\t\t\t\t\tmapper,\n\t\t\t\t\t\t\tmapper.db.forSchema(systemSchema),\n\t\t\t\t\t\t\tproviders,\n\t\t\t\t\t\t\tproject.slug,\n\t\t\t\t\t\t\tstage.id,\n\t\t\t\t\t\t\tschemaMeta.id,\n\t\t\t\t\t\t\tmapper.identityId,\n\t\t\t\t\t\t\tuserInfo,\n\t\t\t\t\t\t\ttriggeredActionsCollector,\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst triggerPayloadBuilder = new TriggerPayloadBuilder(mapper)\n\t\t\t\t\t\tconst payloadManager = new TriggerPayloadManager(triggerPayloadBuilder, triggerPayloadPersister)\n\t\t\t\t\t\tconst changesFetcher = new TriggerIndirectChangesFetcher(schema.model, mapper, whereBuilder, joinBuilder, pathFactory)\n\t\t\t\t\t\tconst listenersStore = this.listenerStoreProvider.getListenerStore(schema)\n\t\t\t\t\t\tconst triggerHandler = new TriggerHandler(payloadManager, listenersStore, changesFetcher)\n\t\t\t\t\t\ttriggerHandler.attach(mapper.eventManager)\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;;;;AAMO,MAAM,qCAAqC;AAAA,EACjD,YACkB,uBAChB;AADgB,SAAA,wBAAA;AAAA,EAElB;AAAA,EAEA,SAAiC;AAChC,WAAO,CAAA,YAAW;AACjB,aAAO,QAAQ;AAAA,QACd;AAAA,QACA,CACC,eACA,EAAE,cAAc,QAAQ,aAAa,cAAc,WAAW,OAAO,SAAS,YAAY,aAAa,UAAU,gCAC7G;AACJ,wBAAc,MAAM,KAAK,CAAA,WAAU;AAClC,kBAAM,0BAA0B,IAAI;AAAA,cACnC;AAAA,cACA,OAAO,GAAG,UAAU,YAAY;AAAA,cAChC;AAAA,cACA,QAAQ;AAAA,cACR,MAAM;AAAA,cACN,WAAW;AAAA,cACX,OAAO;AAAA,cACP;AAAA,cACA;AAAA,YAAA;AAED,kBAAM,wBAAwB,IAAI,sBAAsB,MAAM;AAC9D,kBAAM,iBAAiB,IAAI,sBAAsB,uBAAuB,uBAAuB;AAC/F,kBAAM,iBAAiB,IAAI,8BAA8B,OAAO,OAAO,QAAQ,cAAc,aAAa,WAAW;AACrH,kBAAM,iBAAiB,KAAK,sBAAsB,iBAAiB,MAAM;AACzE,kBAAM,iBAAiB,IAAI,eAAe,gBAAgB,gBAAgB,cAAc;AACxF,2BAAe,OAAO,OAAO,YAAY;AAAA,UAC1C,CAAC;AAAA,QACF;AAAA,MAAA;AAAA,IAEF;AAAA,EACD;AACD;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListenerStoreProvider.cjs","sources":["../../../../packages/engine-actions/src/ListenerStoreProvider.ts"],"sourcesContent":["import { TriggerListenersFactory, TriggerListenersStore } from './triggers'\nimport { Schema } from '@contember/schema'\n\nexport class ListenerStoreProvider {\n\tprivate listenersStoreCache = new WeakMap<Schema, TriggerListenersStore>()\n\n\tpublic getListenerStore(schema: Schema): TriggerListenersStore {\n\t\tconst currentStore = this.listenersStoreCache.get(schema)\n\t\tif (currentStore) {\n\t\t\treturn currentStore\n\t\t}\n\t\tconst listenersFactory = new TriggerListenersFactory(schema)\n\t\tconst newStore = listenersFactory.create()\n\t\tthis.listenersStoreCache.set(schema, newStore)\n\t\treturn newStore\n\t}\n}\n"],"names":["TriggerListenersFactory"],"mappings":";;;;;;;;AAGO,MAAM,sBAAsB;AAAA,EAA5B,cAAA;AACN,kBAAA,MAAQ,2CAA0B,QAAA,CAAuC;AAAA,EAAA;AAAA,EAElE,iBAAiB,QAAuC;AAC9D,UAAM,eAAe,KAAK,oBAAoB,IAAI,MAAM;AACxD,QAAI,cAAc;AACjB,aAAO;AAAA,IACR;AACA,UAAM,mBAAmB,IAAIA,wBAAAA,wBAAwB,MAAM;AAC3D,UAAM,WAAW,iBAAiB,OAAA;AAClC,SAAK,oBAAoB,IAAI,QAAQ,QAAQ;AAC7C,WAAO;AAAA,EACR;AACD;;"}
|
|
1
|
+
{"version":3,"file":"ListenerStoreProvider.cjs","sources":["../../../../packages/engine-actions/src/ListenerStoreProvider.ts"],"sourcesContent":["import { TriggerListenersFactory, TriggerListenersStore } from './triggers/index.js'\nimport { Schema } from '@contember/schema'\n\nexport class ListenerStoreProvider {\n\tprivate listenersStoreCache = new WeakMap<Schema, TriggerListenersStore>()\n\n\tpublic getListenerStore(schema: Schema): TriggerListenersStore {\n\t\tconst currentStore = this.listenersStoreCache.get(schema)\n\t\tif (currentStore) {\n\t\t\treturn currentStore\n\t\t}\n\t\tconst listenersFactory = new TriggerListenersFactory(schema)\n\t\tconst newStore = listenersFactory.create()\n\t\tthis.listenersStoreCache.set(schema, newStore)\n\t\treturn newStore\n\t}\n}\n"],"names":["TriggerListenersFactory"],"mappings":";;;;;;;;AAGO,MAAM,sBAAsB;AAAA,EAA5B,cAAA;AACN,kBAAA,MAAQ,2CAA0B,QAAA,CAAuC;AAAA,EAAA;AAAA,EAElE,iBAAiB,QAAuC;AAC9D,UAAM,eAAe,KAAK,oBAAoB,IAAI,MAAM;AACxD,QAAI,cAAc;AACjB,aAAO;AAAA,IACR;AACA,UAAM,mBAAmB,IAAIA,wBAAAA,wBAAwB,MAAM;AAC3D,UAAM,WAAW,iBAAiB,OAAA;AAClC,SAAK,oBAAoB,IAAI,QAAQ,QAAQ;AAC7C,WAAO;AAAA,EACR;AACD;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListenerStoreProvider.js","sources":["../../../../packages/engine-actions/src/ListenerStoreProvider.ts"],"sourcesContent":["import { TriggerListenersFactory, TriggerListenersStore } from './triggers'\nimport { Schema } from '@contember/schema'\n\nexport class ListenerStoreProvider {\n\tprivate listenersStoreCache = new WeakMap<Schema, TriggerListenersStore>()\n\n\tpublic getListenerStore(schema: Schema): TriggerListenersStore {\n\t\tconst currentStore = this.listenersStoreCache.get(schema)\n\t\tif (currentStore) {\n\t\t\treturn currentStore\n\t\t}\n\t\tconst listenersFactory = new TriggerListenersFactory(schema)\n\t\tconst newStore = listenersFactory.create()\n\t\tthis.listenersStoreCache.set(schema, newStore)\n\t\treturn newStore\n\t}\n}\n"],"names":[],"mappings":";;;;;;AAGO,MAAM,sBAAsB;AAAA,EAA5B,cAAA;AACN,kBAAA,MAAQ,2CAA0B,QAAA,CAAuC;AAAA,EAAA;AAAA,EAElE,iBAAiB,QAAuC;AAC9D,UAAM,eAAe,KAAK,oBAAoB,IAAI,MAAM;AACxD,QAAI,cAAc;AACjB,aAAO;AAAA,IACR;AACA,UAAM,mBAAmB,IAAI,wBAAwB,MAAM;AAC3D,UAAM,WAAW,iBAAiB,OAAA;AAClC,SAAK,oBAAoB,IAAI,QAAQ,QAAQ;AAC7C,WAAO;AAAA,EACR;AACD;"}
|
|
1
|
+
{"version":3,"file":"ListenerStoreProvider.js","sources":["../../../../packages/engine-actions/src/ListenerStoreProvider.ts"],"sourcesContent":["import { TriggerListenersFactory, TriggerListenersStore } from './triggers/index.js'\nimport { Schema } from '@contember/schema'\n\nexport class ListenerStoreProvider {\n\tprivate listenersStoreCache = new WeakMap<Schema, TriggerListenersStore>()\n\n\tpublic getListenerStore(schema: Schema): TriggerListenersStore {\n\t\tconst currentStore = this.listenersStoreCache.get(schema)\n\t\tif (currentStore) {\n\t\t\treturn currentStore\n\t\t}\n\t\tconst listenersFactory = new TriggerListenersFactory(schema)\n\t\tconst newStore = listenersFactory.create()\n\t\tthis.listenersStoreCache.set(schema, newStore)\n\t\treturn newStore\n\t}\n}\n"],"names":[],"mappings":";;;;;;AAGO,MAAM,sBAAsB;AAAA,EAA5B,cAAA;AACN,kBAAA,MAAQ,2CAA0B,QAAA,CAAuC;AAAA,EAAA;AAAA,EAElE,iBAAiB,QAAuC;AAC9D,UAAM,eAAe,KAAK,oBAAoB,IAAI,MAAM;AACxD,QAAI,cAAc;AACjB,aAAO;AAAA,IACR;AACA,UAAM,mBAAmB,IAAI,wBAAwB,MAAM;AAC3D,UAAM,WAAW,iBAAiB,OAAA;AAClC,SAAK,oBAAoB,IAAI,QAAQ,QAAQ;AAC7C,WAAO;AAAA,EACR;AACD;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsPermissionsFactory.cjs","sources":["../../../../../packages/engine-actions/src/authorization/ActionsPermissionsFactory.ts"],"sourcesContent":["import { Permissions } from '@contember/authorization'\nimport { ProjectRole } from '@contember/schema'\nimport { ActionsAuthorizationActions } from './ActionsAuthorizationActions'\n\nexport class ActionsPermissionsFactory {\n\tpublic create(): Permissions {\n\t\tconst permissions = new Permissions()\n\t\tpermissions.allow(ProjectRole.ADMIN, { resource: Permissions.ALL, privilege: Permissions.ALL })\n\t\tpermissions.allow(ProjectRole.DEPLOYER, ActionsAuthorizationActions.VARIABLES_SET)\n\t\tpermissions.allow(ProjectRole.DEPLOYER, ActionsAuthorizationActions.VARIABLES_VIEW)\n\n\t\treturn permissions\n\t}\n}\n"],"names":["Permissions","ProjectRole","ActionsAuthorizationActions"],"mappings":";;;;;AAIO,MAAM,0BAA0B;AAAA,EAC/B,SAAsB;AAC5B,UAAM,cAAc,IAAIA,0BAAA;AACxB,gBAAY,MAAMC,mBAAY,OAAO,EAAE,UAAUD,cAAAA,YAAY,KAAK,WAAWA,cAAAA,YAAY,IAAA,CAAK;AAC9F,gBAAY,MAAMC,OAAAA,YAAY,UAAUC,4BAAAA,4BAA4B,aAAa;AACjF,gBAAY,MAAMD,OAAAA,YAAY,UAAUC,4BAAAA,4BAA4B,cAAc;AAElF,WAAO;AAAA,EACR;AACD;;"}
|
|
1
|
+
{"version":3,"file":"ActionsPermissionsFactory.cjs","sources":["../../../../../packages/engine-actions/src/authorization/ActionsPermissionsFactory.ts"],"sourcesContent":["import { Permissions } from '@contember/authorization'\nimport { ProjectRole } from '@contember/schema'\nimport { ActionsAuthorizationActions } from './ActionsAuthorizationActions.js'\n\nexport class ActionsPermissionsFactory {\n\tpublic create(): Permissions {\n\t\tconst permissions = new Permissions()\n\t\tpermissions.allow(ProjectRole.ADMIN, { resource: Permissions.ALL, privilege: Permissions.ALL })\n\t\tpermissions.allow(ProjectRole.DEPLOYER, ActionsAuthorizationActions.VARIABLES_SET)\n\t\tpermissions.allow(ProjectRole.DEPLOYER, ActionsAuthorizationActions.VARIABLES_VIEW)\n\n\t\treturn permissions\n\t}\n}\n"],"names":["Permissions","ProjectRole","ActionsAuthorizationActions"],"mappings":";;;;;AAIO,MAAM,0BAA0B;AAAA,EAC/B,SAAsB;AAC5B,UAAM,cAAc,IAAIA,0BAAA;AACxB,gBAAY,MAAMC,mBAAY,OAAO,EAAE,UAAUD,cAAAA,YAAY,KAAK,WAAWA,cAAAA,YAAY,IAAA,CAAK;AAC9F,gBAAY,MAAMC,OAAAA,YAAY,UAAUC,4BAAAA,4BAA4B,aAAa;AACjF,gBAAY,MAAMD,OAAAA,YAAY,UAAUC,4BAAAA,4BAA4B,cAAc;AAElF,WAAO;AAAA,EACR;AACD;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsPermissionsFactory.js","sources":["../../../../../packages/engine-actions/src/authorization/ActionsPermissionsFactory.ts"],"sourcesContent":["import { Permissions } from '@contember/authorization'\nimport { ProjectRole } from '@contember/schema'\nimport { ActionsAuthorizationActions } from './ActionsAuthorizationActions'\n\nexport class ActionsPermissionsFactory {\n\tpublic create(): Permissions {\n\t\tconst permissions = new Permissions()\n\t\tpermissions.allow(ProjectRole.ADMIN, { resource: Permissions.ALL, privilege: Permissions.ALL })\n\t\tpermissions.allow(ProjectRole.DEPLOYER, ActionsAuthorizationActions.VARIABLES_SET)\n\t\tpermissions.allow(ProjectRole.DEPLOYER, ActionsAuthorizationActions.VARIABLES_VIEW)\n\n\t\treturn permissions\n\t}\n}\n"],"names":[],"mappings":";;;AAIO,MAAM,0BAA0B;AAAA,EAC/B,SAAsB;AAC5B,UAAM,cAAc,IAAI,YAAA;AACxB,gBAAY,MAAM,YAAY,OAAO,EAAE,UAAU,YAAY,KAAK,WAAW,YAAY,IAAA,CAAK;AAC9F,gBAAY,MAAM,YAAY,UAAU,4BAA4B,aAAa;AACjF,gBAAY,MAAM,YAAY,UAAU,4BAA4B,cAAc;AAElF,WAAO;AAAA,EACR;AACD;"}
|
|
1
|
+
{"version":3,"file":"ActionsPermissionsFactory.js","sources":["../../../../../packages/engine-actions/src/authorization/ActionsPermissionsFactory.ts"],"sourcesContent":["import { Permissions } from '@contember/authorization'\nimport { ProjectRole } from '@contember/schema'\nimport { ActionsAuthorizationActions } from './ActionsAuthorizationActions.js'\n\nexport class ActionsPermissionsFactory {\n\tpublic create(): Permissions {\n\t\tconst permissions = new Permissions()\n\t\tpermissions.allow(ProjectRole.ADMIN, { resource: Permissions.ALL, privilege: Permissions.ALL })\n\t\tpermissions.allow(ProjectRole.DEPLOYER, ActionsAuthorizationActions.VARIABLES_SET)\n\t\tpermissions.allow(ProjectRole.DEPLOYER, ActionsAuthorizationActions.VARIABLES_VIEW)\n\n\t\treturn permissions\n\t}\n}\n"],"names":[],"mappings":";;;AAIO,MAAM,0BAA0B;AAAA,EAC/B,SAAsB;AAC5B,UAAM,cAAc,IAAI,YAAA;AACxB,gBAAY,MAAM,YAAY,OAAO,EAAE,UAAU,YAAY,KAAK,WAAW,YAAY,IAAA,CAAK;AAC9F,gBAAY,MAAM,YAAY,UAAU,4BAA4B,aAAa;AACjF,gBAAY,MAAM,YAAY,UAAU,4BAA4B,cAAc;AAElF,WAAO;AAAA,EACR;AACD;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DispatchWorkerSupervisor.cjs","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\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(\n\t\t\tnew AcquiringListener(\n\t\t\t\ttenantContainer.databaseContext.client,\n\t\t\t\t'project_updated',\n\t\t\t\tasync () => {\n\t\t\t\t\tlogger.debug('Project config change detected, reloading dispatch workers')\n\t\t\t\t\tawait endProjectWorkers()\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait startWorkers(true)\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tlogger.error(e, { message: 'Dispatch workers reload failed, terminating' })\n\t\t\t\t\t\tawait endAll()\n\t\t\t\t\t\tonError(e)\n\t\t\t\t\t}\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":["Supervisor","ImplementationException","AcquiringListener"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DispatchWorkerSupervisor.cjs","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.js'\nimport { Logger } from '@contember/logger'\nimport { ImplementationException } from '../ImplementationException.js'\n\nexport class DispatchWorkerSupervisorFactory {\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(\n\t\t\tnew AcquiringListener(\n\t\t\t\ttenantContainer.databaseContext.client,\n\t\t\t\t'project_updated',\n\t\t\t\tasync () => {\n\t\t\t\t\tlogger.debug('Project config change detected, reloading dispatch workers')\n\t\t\t\t\tawait endProjectWorkers()\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait startWorkers(true)\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tlogger.error(e, { message: 'Dispatch workers reload failed, terminating' })\n\t\t\t\t\t\tawait endAll()\n\t\t\t\t\t\tonError(e)\n\t\t\t\t\t}\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":["Supervisor","ImplementationException","AcquiringListener"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
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\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(\n\t\t\tnew AcquiringListener(\n\t\t\t\ttenantContainer.databaseContext.client,\n\t\t\t\t'project_updated',\n\t\t\t\tasync () => {\n\t\t\t\t\tlogger.debug('Project config change detected, reloading dispatch workers')\n\t\t\t\t\tawait endProjectWorkers()\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait startWorkers(true)\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tlogger.error(e, { message: 'Dispatch workers reload failed, terminating' })\n\t\t\t\t\t\tawait endAll()\n\t\t\t\t\t\tonError(e)\n\t\t\t\t\t}\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
|
+
{"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.js'\nimport { Logger } from '@contember/logger'\nimport { ImplementationException } from '../ImplementationException.js'\n\nexport class DispatchWorkerSupervisorFactory {\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(\n\t\t\tnew AcquiringListener(\n\t\t\t\ttenantContainer.databaseContext.client,\n\t\t\t\t'project_updated',\n\t\t\t\tasync () => {\n\t\t\t\t\tlogger.debug('Project config change detected, reloading dispatch workers')\n\t\t\t\t\tawait endProjectWorkers()\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait startWorkers(true)\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tlogger.error(e, { message: 'Dispatch workers reload failed, terminating' })\n\t\t\t\t\t\tawait endAll()\n\t\t\t\t\t\tonError(e)\n\t\t\t\t\t}\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 +1 @@
|
|
|
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\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\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":";;AAoBO,MAAM,gBAAgB;AAAA,EAC5B,YACkB,kBACA,kBACA,gBAChB;AAHgB,SAAA,mBAAA;AACA,SAAA,mBAAA;AACA,SAAA,iBAAA;AAAA,EAElB;AAAA,EAEA,MAAM,aAAa,EAAE,IAAI,uBAAuB,UAAyD;AACxG,UAAM,UAAU,MAAM,sBAAsB,UAAU,EAAE,IAAI,WAAW,KAAA,CAAM,GAAG;AAChF,UAAM,QAAQ,MAAM,KAAK,iBAAiB,WAAW,OAAO,SAAS,GAAG,MAAM;AAC9E,UAAM,UAAU,KAAK,OAAA,EAAS,SAAA,EAAW,UAAU,CAAC;AACpD,UAAM,cAAc,OAAO,MAAM,EAAE,KAAK,2BAA2B,SAAS;AAC5E,QAAI,CAAC,MAAM,IAAI;AACd,kBAAY,MAAM,sBAAsB;AAAA,QACvC,WAAW,MAAM,aAAa;AAAA,MAAA,CAC9B;AACD,aAAO,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,MAAM,UAAA;AAAA,IAClD;AACA,UAAM,EAAE,QAAQ,OAAA,IAAW;AAC3B,QAAI;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;AAC/D,YAAM,gBAAgB,MAAM,QAAQ,OAAO,EAAE,QAAQ,QAAQ,QAAQ,aAAa,WAAW;AAC7F,YAAM,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,EAAA;AAAA,IACtC,SAAS,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,iBAAA;AAAA,MAAiB,EACnD;AACF,YAAM,KAAK,iBAAiB,iBAAiB,GAAG,QAAQ,YAAY;AAEpE,aAAO,EAAE,SAAS,GAAG,QAAQ,MAAM,OAAO,QAAQ,WAAW,EAAA;AAAA,IAC9D;AAAA,EACD;AACD;;"}
|
|
1
|
+
{"version":3,"file":"EventDispatcher.cjs","sources":["../../../../../packages/engine-actions/src/dispatch/EventDispatcher.ts"],"sourcesContent":["import { EventsRepository } from './EventsRepository.js'\nimport { TargetHandlerResolver } from './TargetHandlerResolver.js'\nimport { HandledEvent } from './types.js'\nimport { Logger } from '@contember/logger'\nimport { ContentSchemaResolver } from '@contember/engine-http'\nimport { DatabaseContext } from '@contember/engine-system-api'\nimport { VariablesManager } from '../model/VariablesManager.js'\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\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":";;AAoBO,MAAM,gBAAgB;AAAA,EAC5B,YACkB,kBACA,kBACA,gBAChB;AAHgB,SAAA,mBAAA;AACA,SAAA,mBAAA;AACA,SAAA,iBAAA;AAAA,EAElB;AAAA,EAEA,MAAM,aAAa,EAAE,IAAI,uBAAuB,UAAyD;AACxG,UAAM,UAAU,MAAM,sBAAsB,UAAU,EAAE,IAAI,WAAW,KAAA,CAAM,GAAG;AAChF,UAAM,QAAQ,MAAM,KAAK,iBAAiB,WAAW,OAAO,SAAS,GAAG,MAAM;AAC9E,UAAM,UAAU,KAAK,OAAA,EAAS,SAAA,EAAW,UAAU,CAAC;AACpD,UAAM,cAAc,OAAO,MAAM,EAAE,KAAK,2BAA2B,SAAS;AAC5E,QAAI,CAAC,MAAM,IAAI;AACd,kBAAY,MAAM,sBAAsB;AAAA,QACvC,WAAW,MAAM,aAAa;AAAA,MAAA,CAC9B;AACD,aAAO,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,MAAM,UAAA;AAAA,IAClD;AACA,UAAM,EAAE,QAAQ,OAAA,IAAW;AAC3B,QAAI;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;AAC/D,YAAM,gBAAgB,MAAM,QAAQ,OAAO,EAAE,QAAQ,QAAQ,QAAQ,aAAa,WAAW;AAC7F,YAAM,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,EAAA;AAAA,IACtC,SAAS,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,iBAAA;AAAA,MAAiB,EACnD;AACF,YAAM,KAAK,iBAAiB,iBAAiB,GAAG,QAAQ,YAAY;AAEpE,aAAO,EAAE,SAAS,GAAG,QAAQ,MAAM,OAAO,QAAQ,WAAW,EAAA;AAAA,IAC9D;AAAA,EACD;AACD;;"}
|
|
@@ -1 +1 @@
|
|
|
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\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\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":"AAoBO,MAAM,gBAAgB;AAAA,EAC5B,YACkB,kBACA,kBACA,gBAChB;AAHgB,SAAA,mBAAA;AACA,SAAA,mBAAA;AACA,SAAA,iBAAA;AAAA,EAElB;AAAA,EAEA,MAAM,aAAa,EAAE,IAAI,uBAAuB,UAAyD;AACxG,UAAM,UAAU,MAAM,sBAAsB,UAAU,EAAE,IAAI,WAAW,KAAA,CAAM,GAAG;AAChF,UAAM,QAAQ,MAAM,KAAK,iBAAiB,WAAW,OAAO,SAAS,GAAG,MAAM;AAC9E,UAAM,UAAU,KAAK,OAAA,EAAS,SAAA,EAAW,UAAU,CAAC;AACpD,UAAM,cAAc,OAAO,MAAM,EAAE,KAAK,2BAA2B,SAAS;AAC5E,QAAI,CAAC,MAAM,IAAI;AACd,kBAAY,MAAM,sBAAsB;AAAA,QACvC,WAAW,MAAM,aAAa;AAAA,MAAA,CAC9B;AACD,aAAO,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,MAAM,UAAA;AAAA,IAClD;AACA,UAAM,EAAE,QAAQ,OAAA,IAAW;AAC3B,QAAI;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;AAC/D,YAAM,gBAAgB,MAAM,QAAQ,OAAO,EAAE,QAAQ,QAAQ,QAAQ,aAAa,WAAW;AAC7F,YAAM,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,EAAA;AAAA,IACtC,SAAS,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,iBAAA;AAAA,MAAiB,EACnD;AACF,YAAM,KAAK,iBAAiB,iBAAiB,GAAG,QAAQ,YAAY;AAEpE,aAAO,EAAE,SAAS,GAAG,QAAQ,MAAM,OAAO,QAAQ,WAAW,EAAA;AAAA,IAC9D;AAAA,EACD;AACD;"}
|
|
1
|
+
{"version":3,"file":"EventDispatcher.js","sources":["../../../../../packages/engine-actions/src/dispatch/EventDispatcher.ts"],"sourcesContent":["import { EventsRepository } from './EventsRepository.js'\nimport { TargetHandlerResolver } from './TargetHandlerResolver.js'\nimport { HandledEvent } from './types.js'\nimport { Logger } from '@contember/logger'\nimport { ContentSchemaResolver } from '@contember/engine-http'\nimport { DatabaseContext } from '@contember/engine-system-api'\nimport { VariablesManager } from '../model/VariablesManager.js'\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\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":"AAoBO,MAAM,gBAAgB;AAAA,EAC5B,YACkB,kBACA,kBACA,gBAChB;AAHgB,SAAA,mBAAA;AACA,SAAA,mBAAA;AACA,SAAA,iBAAA;AAAA,EAElB;AAAA,EAEA,MAAM,aAAa,EAAE,IAAI,uBAAuB,UAAyD;AACxG,UAAM,UAAU,MAAM,sBAAsB,UAAU,EAAE,IAAI,WAAW,KAAA,CAAM,GAAG;AAChF,UAAM,QAAQ,MAAM,KAAK,iBAAiB,WAAW,OAAO,SAAS,GAAG,MAAM;AAC9E,UAAM,UAAU,KAAK,OAAA,EAAS,SAAA,EAAW,UAAU,CAAC;AACpD,UAAM,cAAc,OAAO,MAAM,EAAE,KAAK,2BAA2B,SAAS;AAC5E,QAAI,CAAC,MAAM,IAAI;AACd,kBAAY,MAAM,sBAAsB;AAAA,QACvC,WAAW,MAAM,aAAa;AAAA,MAAA,CAC9B;AACD,aAAO,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,MAAM,UAAA;AAAA,IAClD;AACA,UAAM,EAAE,QAAQ,OAAA,IAAW;AAC3B,QAAI;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;AAC/D,YAAM,gBAAgB,MAAM,QAAQ,OAAO,EAAE,QAAQ,QAAQ,QAAQ,aAAa,WAAW;AAC7F,YAAM,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,EAAA;AAAA,IACtC,SAAS,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,iBAAA;AAAA,MAAiB,EACnD;AACF,YAAM,KAAK,iBAAiB,iBAAiB,GAAG,QAAQ,YAAY;AAEpE,aAAO,EAAE,SAAS,GAAG,QAAQ,MAAM,OAAO,QAAQ,WAAW,EAAA;AAAA,IAC9D;AAAA,EACD;AACD;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventsRepository.cjs","sources":["../../../../../packages/engine-actions/src/dispatch/EventsRepository.ts"],"sourcesContent":["import { Client, Connection, Literal, LockModifier, LockType, Operator, SelectBuilder, UpdateBuilder } 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\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\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\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\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 =>\n\t\t\t\tqb\n\t\t\t\t\t.select(it => it.raw('*'))\n\t\t\t\t\t.from('actions_event')\n\t\t\t\t\t.match(eventsToProcessSpecification)\n\t\t\t\t\t.where(targetName ? { target: targetName } : {})\n\t\t\t\t\t.limit(limit)\n\t\t\t\t\t.lock(LockType.forNoKeyUpdate, LockModifier.skipLocked))\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 =>\n\t\t\t\t\tit.raw(\n\t\t\t\t\t\t`\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`,\n\t\t\t\t\t\t'created',\n\t\t\t\t\t\t'retrying',\n\t\t\t\t\t),\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(\n\t\t\tnextAttempt.getTime() + (event.target?.initialRepeatIntervalMs ?? DEFAULT_REPEAT_INTERVAL_MS) * Math.pow(2, event.row.num_retries),\n\t\t)\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\t? {\n\t\t\t\t\t\tstate: 'retrying',\n\t\t\t\t\t\tvisible_at: nextAttempt,\n\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\tstate: 'failed',\n\t\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 =>\n\t\t\t\tit.or(it =>\n\t\t\t\t\tit\n\t\t\t\t\t\t.and(it =>\n\t\t\t\t\t\t\tit\n\t\t\t\t\t\t\t\t.in('state', ['retrying', 'created', 'processing'])\n\t\t\t\t\t\t\t\t.compare('visible_at', Operator.lte, 'now')\n\t\t\t\t\t\t\t\t.compare('target', Operator.eq, targetName)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.and(it =>\n\t\t\t\t\t\t\tit\n\t\t\t\t\t\t\t\t.compare('id', Operator.eq, primaryEventId)\n\t\t\t\t\t\t)\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
|
+
{"version":3,"file":"EventsRepository.cjs","sources":["../../../../../packages/engine-actions/src/dispatch/EventsRepository.ts"],"sourcesContent":["import { Client, Connection, Literal, LockModifier, LockType, Operator, SelectBuilder, UpdateBuilder } from '@contember/database'\nimport { EventRow, HandledEvent } from './types.js'\nimport { Actions } from '@contember/schema'\nimport { eventsToProcessSpecification, eventsToProcessStateSpecification } from '../model/EventsToProcessSpecification.js'\nimport { notify } from '../utils/notifyChannel.js'\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\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\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\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 =>\n\t\t\t\tqb\n\t\t\t\t\t.select(it => it.raw('*'))\n\t\t\t\t\t.from('actions_event')\n\t\t\t\t\t.match(eventsToProcessSpecification)\n\t\t\t\t\t.where(targetName ? { target: targetName } : {})\n\t\t\t\t\t.limit(limit)\n\t\t\t\t\t.lock(LockType.forNoKeyUpdate, LockModifier.skipLocked))\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 =>\n\t\t\t\t\tit.raw(\n\t\t\t\t\t\t`\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`,\n\t\t\t\t\t\t'created',\n\t\t\t\t\t\t'retrying',\n\t\t\t\t\t),\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(\n\t\t\tnextAttempt.getTime() + (event.target?.initialRepeatIntervalMs ?? DEFAULT_REPEAT_INTERVAL_MS) * Math.pow(2, event.row.num_retries),\n\t\t)\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\t? {\n\t\t\t\t\t\tstate: 'retrying',\n\t\t\t\t\t\tvisible_at: nextAttempt,\n\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\tstate: 'failed',\n\t\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 =>\n\t\t\t\tit.or(it =>\n\t\t\t\t\tit\n\t\t\t\t\t\t.and(it =>\n\t\t\t\t\t\t\tit\n\t\t\t\t\t\t\t\t.in('state', ['retrying', 'created', 'processing'])\n\t\t\t\t\t\t\t\t.compare('visible_at', Operator.lte, 'now')\n\t\t\t\t\t\t\t\t.compare('target', Operator.eq, targetName)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.and(it =>\n\t\t\t\t\t\t\tit\n\t\t\t\t\t\t\t\t.compare('id', Operator.eq, primaryEventId)\n\t\t\t\t\t\t)\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventsRepository.js","sources":["../../../../../packages/engine-actions/src/dispatch/EventsRepository.ts"],"sourcesContent":["import { Client, Connection, Literal, LockModifier, LockType, Operator, SelectBuilder, UpdateBuilder } 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\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\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\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\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 =>\n\t\t\t\tqb\n\t\t\t\t\t.select(it => it.raw('*'))\n\t\t\t\t\t.from('actions_event')\n\t\t\t\t\t.match(eventsToProcessSpecification)\n\t\t\t\t\t.where(targetName ? { target: targetName } : {})\n\t\t\t\t\t.limit(limit)\n\t\t\t\t\t.lock(LockType.forNoKeyUpdate, LockModifier.skipLocked))\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 =>\n\t\t\t\t\tit.raw(\n\t\t\t\t\t\t`\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`,\n\t\t\t\t\t\t'created',\n\t\t\t\t\t\t'retrying',\n\t\t\t\t\t),\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(\n\t\t\tnextAttempt.getTime() + (event.target?.initialRepeatIntervalMs ?? DEFAULT_REPEAT_INTERVAL_MS) * Math.pow(2, event.row.num_retries),\n\t\t)\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\t? {\n\t\t\t\t\t\tstate: 'retrying',\n\t\t\t\t\t\tvisible_at: nextAttempt,\n\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\tstate: 'failed',\n\t\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 =>\n\t\t\t\tit.or(it =>\n\t\t\t\t\tit\n\t\t\t\t\t\t.and(it =>\n\t\t\t\t\t\t\tit\n\t\t\t\t\t\t\t\t.in('state', ['retrying', 'created', 'processing'])\n\t\t\t\t\t\t\t\t.compare('visible_at', Operator.lte, 'now')\n\t\t\t\t\t\t\t\t.compare('target', Operator.eq, targetName)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.and(it =>\n\t\t\t\t\t\t\tit\n\t\t\t\t\t\t\t\t.compare('id', Operator.eq, primaryEventId)\n\t\t\t\t\t\t)\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":";;AAMA,MAAM,iBAAiB,MAAQ,KAAK;AACpC,MAAM,6BAA6B;AACnC,MAAM,uBAAuB;AAC7B,MAAM,qBAAqB;AAEpB,MAAM,iBAAiB;AAAA,EAC7B,MAAa,WAAW,SAAyB,IAAuC;AACvF,UAAM,gBAAgB,MAAM,KAAK,cAAc,IAAI,CAAC,GAAG,CAAC;AACxD,QAAI,CAAC,cAAc;AAClB,aAAO,EAAE,IAAI,OAAO,WAAW,MAAM,KAAK,aAAa,EAAE,EAAA;AAAA,IAC1D;AACA,UAAM,SAAS,QAAQ,QAAQ,aAAa,MAAM;AAClD,QAAI,CAAC,QAAQ;AACZ,YAAM,KAAK,0BAA0B,IAAI,aAAa,QAAQ,aAAa,EAAE;AAC7E,aAAO,MAAM,KAAK,WAAW,SAAS,EAAE;AAAA,IACzC;AACA,UAAM,aAAa,OAAO,aAAa,sBAAsB;AAC7D,UAAM,QAAQ,YAAY,IAAI,MAAM,KAAK,cAAc,IAAI,SAAS,IAAI,CAAA;AACxE,WAAO,EAAE,IAAI,MAAM,QAAQ,CAAC,cAAc,GAAG,KAAK,GAAG,OAAA;AAAA,EACtD;AAAA,EAEA,MAAc,aAAa,IAAyC;AACnE,UAAM,SAAS,MAAM,cAAc,OAAA,EACjC,KAAK,eAAe,EACpB,MAAM,iCAAiC,EACvC,OAAO,CAAA,OAAM,GAAG,IAAI,qDAAqD,GAAG,IAAI,EAChF,QAAQ,cAAc,KAAK,EAC3B,MAAM,CAAC,EACP,UAAU,EAAE;AAEd,WAAO,OAAO,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,IAAI;AAAA,EACpD;AAAA,EAEA,MAAc,cAAc,IAAY,OAAe,YAA0C;AAChG,UAAM,gCAAgB,KAAA;AACtB,cAAU,QAAQ,UAAU,QAAA,IAAY,cAAc;AACtD,WAAO,MAAMA,gBAAc,OAAA,EACzB,MAAM,eAAe,EACrB,KAAK,UAAU,QACf,GACE,OAAO,QAAM,GAAG,IAAI,GAAG,CAAC,EACxB,KAAK,eAAe,EACpB,MAAM,4BAA4B,EAClC,MAAM,aAAa,EAAE,QAAQ,WAAA,IAAe,EAAE,EAC9C,MAAM,KAAK,EACX,KAAK,SAAS,gBAAgB,aAAa,UAAU,CAAC,EACxD,OAAiB;AAAA,MACjB,OAAO;AAAA,MACP,uCAAuB,KAAA;AAAA,MACvB,YAAY;AAAA,IAAA,CACZ,EACA,KAAK,CAAA,OAAM,GAAG,KAAK,QAAQ,EAAE,MAAM,CAAAC,QAAMA,IAAG,UAAU,CAAC,UAAU,IAAI,GAAG,CAAC,iBAAiB,IAAI,CAAC,CAAC,CAAC,EACjG,UAAoB,IAAI,QAAQ,GAAG,CAAC,EACpC,QAAQ,EAAE;AAAA,EACb;AAAA,EAEA,MAAa,iBAAiB,IAAY,QAAmD;AAC5F,WAAO,MAAM,GAAG,YAAY,OAAM,QAAO;AACxC,YAAM,IAAI,MAAM,WAAW,eAAe;AAC1C,YAAM,UAAU,OAAO,OAAO,CAAA,OAAM,GAAG,OAAO,EAAE;AAChD,YAAM,KAAK,YAAY,KAAK,QAAQ,IAAI,CAAA,OAAM,GAAG,GAAG,CAAC;AAErD,iBAAW,SAAS,QAAQ;AAC3B,YAAI,CAAC,MAAM,OAAO,IAAI;AACrB,gBAAM,KAAK,WAAW,KAAK,KAAK;AAAA,QACjC;AAAA,MACD;AACA,aAAO,CAAC,QAAQ,QAAQ,OAAO,SAAS,QAAQ,MAAM;AAAA,IACvD,CAAC;AAAA,EACF;AAAA,EAEA,MAAa,QAAQ,IAAY,QAAiC;AACjE,UAAMD,gBAAc,OAAA,EAClB,MAAM,eAAe,EACrB,OAAiB;AAAA,MACjB,OAAO,QACN,GAAG;AAAA,QACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,uCAAuB,KAAA;AAAA,MACvB,gCAAgB,KAAA;AAAA,IAAK,CACrB,EACA,MAAM,CAAA,OAAM,GAAG,GAAG,MAAM,MAAM,CAAC,EAC/B,QAAQ,EAAE;AAAA,EACb;AAAA,EAEA,MAAa,YAAY,IAAY,QAAiC;AACrE,UAAMA,gBAAc,OAAA,EAClB,MAAM,eAAe,EACrB,OAAiB;AAAA,MACjB,OAAO;AAAA,MACP,uCAAuB,KAAA;AAAA,MACvB,iCAAiB,KAAA;AAAA,IAAK,CACtB,EACA,MAAM,CAAA,OAAM,GAAG,GAAG,MAAM,MAAM,CAAC,EAC/B,QAAQ,EAAE;AAAA,EACb;AAAA,EAEA,MAAc,YAAY,IAAY,MAAiC;AACtE,UAAM,0BAAU,KAAA;AAChB,UAAMA,gBAAc,OAAA,EAClB,MAAM,eAAe,EACrB,OAAiB;AAAA,MACjB,OAAO;AAAA,MACP,aAAa,CAAA,OAAM,GAAG,IAAI,iBAAiB;AAAA,MAC3C,aAAa;AAAA,MACb,mBAAmB;AAAA,IAAA,CACnB,EACA,MAAM,CAAA,OAAM,GAAG,GAAG,MAAM,KAAK,IAAI,CAAAC,QAAMA,IAAG,EAAE,CAAC,CAAC,EAC9C,QAAQ,EAAE;AAAA,EACb;AAAA,EAEA,MAAc,WAAW,IAAY,OAAoC;AACxE,UAAM,aAAa,MAAM,IAAI,cAAc;AAC3C,UAAM,0BAAU,KAAA;AAChB,UAAM,kCAAkB,KAAA;AACxB,gBAAY;AAAA,MACX,YAAY,QAAA,KAAa,MAAM,QAAQ,2BAA2B,8BAA8B,KAAK,IAAI,GAAG,MAAM,IAAI,WAAW;AAAA,IAAA;AAElI,UAAMD,gBAAc,OAAA,EAClB,MAAM,eAAe,EACrB,OAAiB;AAAA,MACjB,mBAAmB;AAAA,MACnB,aAAa;AAAA,MACb,KAAK,KAAK,UAAU,CAAC,GAAG,MAAM,IAAI,KAAK,MAAM,MAAM,CAAC;AAAA,MACpD,GAAI,cAAc,MAAM,QAAQ,eAAe,wBAC5C;AAAA,QACD,OAAO;AAAA,QACP,YAAY;AAAA,MAAA,IAEX;AAAA,QACD,OAAO;AAAA,MAAA;AAAA,IACR,CACD,EACA,MAAM,EAAE,IAAI,MAAM,IAAI,GAAA,CAAI,EAC1B,QAAQ,EAAE;AAAA,EACb;AAAA,EAEA,MAAc,0BAA0B,IAAY,YAAoB,gBAAwB;AAC/F,UAAMA,gBAAc,OAAA,EAClB,MAAM,eAAe,EACrB;AAAA,MAAM,QACN,GAAG;AAAA,QAAG,CAAAC,QACLA,IACE;AAAA,UAAI,CAAAA,QACJA,IACE,GAAG,SAAS,CAAC,YAAY,WAAW,YAAY,CAAC,EACjD,QAAQ,cAAc,SAAS,KAAK,KAAK,EACzC,QAAQ,UAAU,SAAS,IAAI,UAAU;AAAA,QAAA,EAE3C;AAAA,UAAI,CAAAA,QACJA,IACE,QAAQ,MAAM,SAAS,IAAI,cAAc;AAAA,QAAA;AAAA,MAC5C;AAAA,IACF,EAEA,OAAiB;AAAA;AAAA,MAEjB,uCAAuB,KAAA;AAAA,MACvB,aAAa,CAAA,OAAM,GAAG,IAAI,iBAAiB;AAAA,MAC3C,KAAK,CAAA,OAAM,GAAG,IAAI,mBAAmB,EAAE,IAAI,OAAO,cAAc,gBAAgB,UAAU,wBAAA,CAAyB;AAAA,MACnH,OAAO;AAAA,MACP,iCAAiB,KAAA;AAAA,IAAK,CACtB,EACA,QAAQ,EAAE;AAAA,EACb;AACD;"}
|
|
1
|
+
{"version":3,"file":"EventsRepository.js","sources":["../../../../../packages/engine-actions/src/dispatch/EventsRepository.ts"],"sourcesContent":["import { Client, Connection, Literal, LockModifier, LockType, Operator, SelectBuilder, UpdateBuilder } from '@contember/database'\nimport { EventRow, HandledEvent } from './types.js'\nimport { Actions } from '@contember/schema'\nimport { eventsToProcessSpecification, eventsToProcessStateSpecification } from '../model/EventsToProcessSpecification.js'\nimport { notify } from '../utils/notifyChannel.js'\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\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\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\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 =>\n\t\t\t\tqb\n\t\t\t\t\t.select(it => it.raw('*'))\n\t\t\t\t\t.from('actions_event')\n\t\t\t\t\t.match(eventsToProcessSpecification)\n\t\t\t\t\t.where(targetName ? { target: targetName } : {})\n\t\t\t\t\t.limit(limit)\n\t\t\t\t\t.lock(LockType.forNoKeyUpdate, LockModifier.skipLocked))\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 =>\n\t\t\t\t\tit.raw(\n\t\t\t\t\t\t`\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`,\n\t\t\t\t\t\t'created',\n\t\t\t\t\t\t'retrying',\n\t\t\t\t\t),\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(\n\t\t\tnextAttempt.getTime() + (event.target?.initialRepeatIntervalMs ?? DEFAULT_REPEAT_INTERVAL_MS) * Math.pow(2, event.row.num_retries),\n\t\t)\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\t? {\n\t\t\t\t\t\tstate: 'retrying',\n\t\t\t\t\t\tvisible_at: nextAttempt,\n\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\tstate: 'failed',\n\t\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 =>\n\t\t\t\tit.or(it =>\n\t\t\t\t\tit\n\t\t\t\t\t\t.and(it =>\n\t\t\t\t\t\t\tit\n\t\t\t\t\t\t\t\t.in('state', ['retrying', 'created', 'processing'])\n\t\t\t\t\t\t\t\t.compare('visible_at', Operator.lte, 'now')\n\t\t\t\t\t\t\t\t.compare('target', Operator.eq, targetName)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.and(it =>\n\t\t\t\t\t\t\tit\n\t\t\t\t\t\t\t\t.compare('id', Operator.eq, primaryEventId)\n\t\t\t\t\t\t)\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LazyDispatchWorker.cjs","sources":["../../../../../packages/engine-actions/src/dispatch/LazyDispatchWorker.ts"],"sourcesContent":["import { Runnable, RunnableArgs, Running, Supervisor, SupervisorOptions } from '@contember/engine-common'\nimport { ProjectGroupContainerResolver } from '@contember/engine-http'\nimport { DispatchWorkerSupervisorFactory } from './DispatchWorkerSupervisor'\n\nexport class LazyDispatchWorker implements Runnable {\n\tconstructor(\n\t\tprivate readonly projectGroupContainerResolver: ProjectGroupContainerResolver,\n\t\tprivate readonly supervisorFactory: DispatchWorkerSupervisorFactory,\n\t\tprivate readonly supervisorOptions: SupervisorOptions = { startupMax: 10 },\n\t) {\n\t}\n\n\tpublic async run({ logger, onError }: RunnableArgs): Promise<Running> {\n\t\tconst running = new Map<string | undefined, Promise<Running | undefined>>()\n\t\tlet aborted = false\n\n\t\tconst unlisten = this.projectGroupContainerResolver.on('create', ({ container, slug }) => {\n\t\t\tconst groupLabel = slug ?? '<default>'\n\t\t\tconst childLogger = logger.child({ projectGroup: groupLabel })\n\t\t\tchildLogger.debug(`Starting dispatch worker for project group ${groupLabel}`)\n\n\t\t\tconst supervised = new Supervisor(\n\t\t\t\tthis.supervisorFactory.create(container),\n\t\t\t\tthis.supervisorOptions,\n\t\t\t)\n\t\t\tconst runningPromise: Promise<Running | undefined> = supervised.run({\n\t\t\t\tlogger: childLogger,\n\t\t\t\tonError: e => {\n\t\t\t\t\tif (aborted) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tchildLogger.error(e, { message: `Dispatch worker for project group ${groupLabel} crashed` })\n\t\t\t\t\tonError(e)\n\t\t\t\t},\n\t\t\t}).catch(e => {\n\t\t\t\tif (!aborted) {\n\t\t\t\t\tchildLogger.error(e, { message: `Failed to start dispatch worker for project group ${groupLabel}` })\n\t\t\t\t\tonError(e)\n\t\t\t\t}\n\t\t\t\treturn undefined\n\t\t\t})\n\t\t\trunning.set(slug, runningPromise)\n\n\t\t\treturn () => {\n\t\t\t\trunning.delete(slug)\n\t\t\t\t;(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst r = await runningPromise\n\t\t\t\t\t\tawait r?.end()\n\t\t\t\t\t} catch {\n\t\t\t\t\t}\n\t\t\t\t})()\n\t\t\t}\n\t\t})\n\n\t\treturn {\n\t\t\tend: async () => {\n\t\t\t\taborted = true\n\t\t\t\tunlisten()\n\t\t\t\tconst all = [...running.values()]\n\t\t\t\trunning.clear()\n\t\t\t\tawait Promise.allSettled(all.map(async p => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst r = await p\n\t\t\t\t\t\tawait r?.end()\n\t\t\t\t\t} catch {\n\t\t\t\t\t}\n\t\t\t\t}))\n\t\t\t},\n\t\t}\n\t}\n}\n"],"names":["Supervisor"],"mappings":";;;AAIO,MAAM,mBAAuC;AAAA,EACnD,YACkB,+BACA,mBACA,oBAAuC,EAAE,YAAY,MACrE;AAHgB,SAAA,gCAAA;AACA,SAAA,oBAAA;AACA,SAAA,oBAAA;AAAA,EAElB;AAAA,EAEA,MAAa,IAAI,EAAE,QAAQ,WAA2C;AACrE,UAAM,8BAAc,IAAA;AACpB,QAAI,UAAU;AAEd,UAAM,WAAW,KAAK,8BAA8B,GAAG,UAAU,CAAC,EAAE,WAAW,WAAW;AACzF,YAAM,aAAa,QAAQ;AAC3B,YAAM,cAAc,OAAO,MAAM,EAAE,cAAc,YAAY;AAC7D,kBAAY,MAAM,8CAA8C,UAAU,EAAE;AAE5E,YAAM,aAAa,IAAIA,aAAAA;AAAAA,QACtB,KAAK,kBAAkB,OAAO,SAAS;AAAA,QACvC,KAAK;AAAA,MAAA;AAEN,YAAM,iBAA+C,WAAW,IAAI;AAAA,QACnE,QAAQ;AAAA,QACR,SAAS,CAAA,MAAK;AACb,cAAI,SAAS;AACZ;AAAA,UACD;AACA,sBAAY,MAAM,GAAG,EAAE,SAAS,qCAAqC,UAAU,YAAY;AAC3F,kBAAQ,CAAC;AAAA,QACV;AAAA,MAAA,CACA,EAAE,MAAM,CAAA,MAAK;AACb,YAAI,CAAC,SAAS;AACb,sBAAY,MAAM,GAAG,EAAE,SAAS,qDAAqD,UAAU,IAAI;AACnG,kBAAQ,CAAC;AAAA,QACV;AACA,eAAO;AAAA,MACR,CAAC;AACD,cAAQ,IAAI,MAAM,cAAc;AAEhC,aAAO,MAAM;AACZ,gBAAQ,OAAO,IAAI;AAClB,SAAC,YAAY;AACb,cAAI;AACH,kBAAM,IAAI,MAAM;AAChB,kBAAM,GAAG,IAAA;AAAA,UACV,QAAQ;AAAA,UACR;AAAA,QACD,GAAA;AAAA,MACD;AAAA,IACD,CAAC;AAED,WAAO;AAAA,MACN,KAAK,YAAY;AAChB,kBAAU;AACV,iBAAA;AACA,cAAM,MAAM,CAAC,GAAG,QAAQ,QAAQ;AAChC,gBAAQ,MAAA;AACR,cAAM,QAAQ,WAAW,IAAI,IAAI,OAAM,MAAK;AAC3C,cAAI;AACH,kBAAM,IAAI,MAAM;AAChB,kBAAM,GAAG,IAAA;AAAA,UACV,QAAQ;AAAA,UACR;AAAA,QACD,CAAC,CAAC;AAAA,MACH;AAAA,IAAA;AAAA,EAEF;AACD;;"}
|
|
1
|
+
{"version":3,"file":"LazyDispatchWorker.cjs","sources":["../../../../../packages/engine-actions/src/dispatch/LazyDispatchWorker.ts"],"sourcesContent":["import { Runnable, RunnableArgs, Running, Supervisor, SupervisorOptions } from '@contember/engine-common'\nimport { ProjectGroupContainerResolver } from '@contember/engine-http'\nimport { DispatchWorkerSupervisorFactory } from './DispatchWorkerSupervisor.js'\n\nexport class LazyDispatchWorker implements Runnable {\n\tconstructor(\n\t\tprivate readonly projectGroupContainerResolver: ProjectGroupContainerResolver,\n\t\tprivate readonly supervisorFactory: DispatchWorkerSupervisorFactory,\n\t\tprivate readonly supervisorOptions: SupervisorOptions = { startupMax: 10 },\n\t) {\n\t}\n\n\tpublic async run({ logger, onError }: RunnableArgs): Promise<Running> {\n\t\tconst running = new Map<string | undefined, Promise<Running | undefined>>()\n\t\tlet aborted = false\n\n\t\tconst unlisten = this.projectGroupContainerResolver.on('create', ({ container, slug }) => {\n\t\t\tconst groupLabel = slug ?? '<default>'\n\t\t\tconst childLogger = logger.child({ projectGroup: groupLabel })\n\t\t\tchildLogger.debug(`Starting dispatch worker for project group ${groupLabel}`)\n\n\t\t\tconst supervised = new Supervisor(\n\t\t\t\tthis.supervisorFactory.create(container),\n\t\t\t\tthis.supervisorOptions,\n\t\t\t)\n\t\t\tconst runningPromise: Promise<Running | undefined> = supervised.run({\n\t\t\t\tlogger: childLogger,\n\t\t\t\tonError: e => {\n\t\t\t\t\tif (aborted) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tchildLogger.error(e, { message: `Dispatch worker for project group ${groupLabel} crashed` })\n\t\t\t\t\tonError(e)\n\t\t\t\t},\n\t\t\t}).catch(e => {\n\t\t\t\tif (!aborted) {\n\t\t\t\t\tchildLogger.error(e, { message: `Failed to start dispatch worker for project group ${groupLabel}` })\n\t\t\t\t\tonError(e)\n\t\t\t\t}\n\t\t\t\treturn undefined\n\t\t\t})\n\t\t\trunning.set(slug, runningPromise)\n\n\t\t\treturn () => {\n\t\t\t\trunning.delete(slug)\n\t\t\t\t;(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst r = await runningPromise\n\t\t\t\t\t\tawait r?.end()\n\t\t\t\t\t} catch {\n\t\t\t\t\t}\n\t\t\t\t})()\n\t\t\t}\n\t\t})\n\n\t\treturn {\n\t\t\tend: async () => {\n\t\t\t\taborted = true\n\t\t\t\tunlisten()\n\t\t\t\tconst all = [...running.values()]\n\t\t\t\trunning.clear()\n\t\t\t\tawait Promise.allSettled(all.map(async p => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst r = await p\n\t\t\t\t\t\tawait r?.end()\n\t\t\t\t\t} catch {\n\t\t\t\t\t}\n\t\t\t\t}))\n\t\t\t},\n\t\t}\n\t}\n}\n"],"names":["Supervisor"],"mappings":";;;AAIO,MAAM,mBAAuC;AAAA,EACnD,YACkB,+BACA,mBACA,oBAAuC,EAAE,YAAY,MACrE;AAHgB,SAAA,gCAAA;AACA,SAAA,oBAAA;AACA,SAAA,oBAAA;AAAA,EAElB;AAAA,EAEA,MAAa,IAAI,EAAE,QAAQ,WAA2C;AACrE,UAAM,8BAAc,IAAA;AACpB,QAAI,UAAU;AAEd,UAAM,WAAW,KAAK,8BAA8B,GAAG,UAAU,CAAC,EAAE,WAAW,WAAW;AACzF,YAAM,aAAa,QAAQ;AAC3B,YAAM,cAAc,OAAO,MAAM,EAAE,cAAc,YAAY;AAC7D,kBAAY,MAAM,8CAA8C,UAAU,EAAE;AAE5E,YAAM,aAAa,IAAIA,aAAAA;AAAAA,QACtB,KAAK,kBAAkB,OAAO,SAAS;AAAA,QACvC,KAAK;AAAA,MAAA;AAEN,YAAM,iBAA+C,WAAW,IAAI;AAAA,QACnE,QAAQ;AAAA,QACR,SAAS,CAAA,MAAK;AACb,cAAI,SAAS;AACZ;AAAA,UACD;AACA,sBAAY,MAAM,GAAG,EAAE,SAAS,qCAAqC,UAAU,YAAY;AAC3F,kBAAQ,CAAC;AAAA,QACV;AAAA,MAAA,CACA,EAAE,MAAM,CAAA,MAAK;AACb,YAAI,CAAC,SAAS;AACb,sBAAY,MAAM,GAAG,EAAE,SAAS,qDAAqD,UAAU,IAAI;AACnG,kBAAQ,CAAC;AAAA,QACV;AACA,eAAO;AAAA,MACR,CAAC;AACD,cAAQ,IAAI,MAAM,cAAc;AAEhC,aAAO,MAAM;AACZ,gBAAQ,OAAO,IAAI;AAClB,SAAC,YAAY;AACb,cAAI;AACH,kBAAM,IAAI,MAAM;AAChB,kBAAM,GAAG,IAAA;AAAA,UACV,QAAQ;AAAA,UACR;AAAA,QACD,GAAA;AAAA,MACD;AAAA,IACD,CAAC;AAED,WAAO;AAAA,MACN,KAAK,YAAY;AAChB,kBAAU;AACV,iBAAA;AACA,cAAM,MAAM,CAAC,GAAG,QAAQ,QAAQ;AAChC,gBAAQ,MAAA;AACR,cAAM,QAAQ,WAAW,IAAI,IAAI,OAAM,MAAK;AAC3C,cAAI;AACH,kBAAM,IAAI,MAAM;AAChB,kBAAM,GAAG,IAAA;AAAA,UACV,QAAQ;AAAA,UACR;AAAA,QACD,CAAC,CAAC;AAAA,MACH;AAAA,IAAA;AAAA,EAEF;AACD;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LazyDispatchWorker.js","sources":["../../../../../packages/engine-actions/src/dispatch/LazyDispatchWorker.ts"],"sourcesContent":["import { Runnable, RunnableArgs, Running, Supervisor, SupervisorOptions } from '@contember/engine-common'\nimport { ProjectGroupContainerResolver } from '@contember/engine-http'\nimport { DispatchWorkerSupervisorFactory } from './DispatchWorkerSupervisor'\n\nexport class LazyDispatchWorker implements Runnable {\n\tconstructor(\n\t\tprivate readonly projectGroupContainerResolver: ProjectGroupContainerResolver,\n\t\tprivate readonly supervisorFactory: DispatchWorkerSupervisorFactory,\n\t\tprivate readonly supervisorOptions: SupervisorOptions = { startupMax: 10 },\n\t) {\n\t}\n\n\tpublic async run({ logger, onError }: RunnableArgs): Promise<Running> {\n\t\tconst running = new Map<string | undefined, Promise<Running | undefined>>()\n\t\tlet aborted = false\n\n\t\tconst unlisten = this.projectGroupContainerResolver.on('create', ({ container, slug }) => {\n\t\t\tconst groupLabel = slug ?? '<default>'\n\t\t\tconst childLogger = logger.child({ projectGroup: groupLabel })\n\t\t\tchildLogger.debug(`Starting dispatch worker for project group ${groupLabel}`)\n\n\t\t\tconst supervised = new Supervisor(\n\t\t\t\tthis.supervisorFactory.create(container),\n\t\t\t\tthis.supervisorOptions,\n\t\t\t)\n\t\t\tconst runningPromise: Promise<Running | undefined> = supervised.run({\n\t\t\t\tlogger: childLogger,\n\t\t\t\tonError: e => {\n\t\t\t\t\tif (aborted) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tchildLogger.error(e, { message: `Dispatch worker for project group ${groupLabel} crashed` })\n\t\t\t\t\tonError(e)\n\t\t\t\t},\n\t\t\t}).catch(e => {\n\t\t\t\tif (!aborted) {\n\t\t\t\t\tchildLogger.error(e, { message: `Failed to start dispatch worker for project group ${groupLabel}` })\n\t\t\t\t\tonError(e)\n\t\t\t\t}\n\t\t\t\treturn undefined\n\t\t\t})\n\t\t\trunning.set(slug, runningPromise)\n\n\t\t\treturn () => {\n\t\t\t\trunning.delete(slug)\n\t\t\t\t;(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst r = await runningPromise\n\t\t\t\t\t\tawait r?.end()\n\t\t\t\t\t} catch {\n\t\t\t\t\t}\n\t\t\t\t})()\n\t\t\t}\n\t\t})\n\n\t\treturn {\n\t\t\tend: async () => {\n\t\t\t\taborted = true\n\t\t\t\tunlisten()\n\t\t\t\tconst all = [...running.values()]\n\t\t\t\trunning.clear()\n\t\t\t\tawait Promise.allSettled(all.map(async p => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst r = await p\n\t\t\t\t\t\tawait r?.end()\n\t\t\t\t\t} catch {\n\t\t\t\t\t}\n\t\t\t\t}))\n\t\t\t},\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";AAIO,MAAM,mBAAuC;AAAA,EACnD,YACkB,+BACA,mBACA,oBAAuC,EAAE,YAAY,MACrE;AAHgB,SAAA,gCAAA;AACA,SAAA,oBAAA;AACA,SAAA,oBAAA;AAAA,EAElB;AAAA,EAEA,MAAa,IAAI,EAAE,QAAQ,WAA2C;AACrE,UAAM,8BAAc,IAAA;AACpB,QAAI,UAAU;AAEd,UAAM,WAAW,KAAK,8BAA8B,GAAG,UAAU,CAAC,EAAE,WAAW,WAAW;AACzF,YAAM,aAAa,QAAQ;AAC3B,YAAM,cAAc,OAAO,MAAM,EAAE,cAAc,YAAY;AAC7D,kBAAY,MAAM,8CAA8C,UAAU,EAAE;AAE5E,YAAM,aAAa,IAAI;AAAA,QACtB,KAAK,kBAAkB,OAAO,SAAS;AAAA,QACvC,KAAK;AAAA,MAAA;AAEN,YAAM,iBAA+C,WAAW,IAAI;AAAA,QACnE,QAAQ;AAAA,QACR,SAAS,CAAA,MAAK;AACb,cAAI,SAAS;AACZ;AAAA,UACD;AACA,sBAAY,MAAM,GAAG,EAAE,SAAS,qCAAqC,UAAU,YAAY;AAC3F,kBAAQ,CAAC;AAAA,QACV;AAAA,MAAA,CACA,EAAE,MAAM,CAAA,MAAK;AACb,YAAI,CAAC,SAAS;AACb,sBAAY,MAAM,GAAG,EAAE,SAAS,qDAAqD,UAAU,IAAI;AACnG,kBAAQ,CAAC;AAAA,QACV;AACA,eAAO;AAAA,MACR,CAAC;AACD,cAAQ,IAAI,MAAM,cAAc;AAEhC,aAAO,MAAM;AACZ,gBAAQ,OAAO,IAAI;AAClB,SAAC,YAAY;AACb,cAAI;AACH,kBAAM,IAAI,MAAM;AAChB,kBAAM,GAAG,IAAA;AAAA,UACV,QAAQ;AAAA,UACR;AAAA,QACD,GAAA;AAAA,MACD;AAAA,IACD,CAAC;AAED,WAAO;AAAA,MACN,KAAK,YAAY;AAChB,kBAAU;AACV,iBAAA;AACA,cAAM,MAAM,CAAC,GAAG,QAAQ,QAAQ;AAChC,gBAAQ,MAAA;AACR,cAAM,QAAQ,WAAW,IAAI,IAAI,OAAM,MAAK;AAC3C,cAAI;AACH,kBAAM,IAAI,MAAM;AAChB,kBAAM,GAAG,IAAA;AAAA,UACV,QAAQ;AAAA,UACR;AAAA,QACD,CAAC,CAAC;AAAA,MACH;AAAA,IAAA;AAAA,EAEF;AACD;"}
|
|
1
|
+
{"version":3,"file":"LazyDispatchWorker.js","sources":["../../../../../packages/engine-actions/src/dispatch/LazyDispatchWorker.ts"],"sourcesContent":["import { Runnable, RunnableArgs, Running, Supervisor, SupervisorOptions } from '@contember/engine-common'\nimport { ProjectGroupContainerResolver } from '@contember/engine-http'\nimport { DispatchWorkerSupervisorFactory } from './DispatchWorkerSupervisor.js'\n\nexport class LazyDispatchWorker implements Runnable {\n\tconstructor(\n\t\tprivate readonly projectGroupContainerResolver: ProjectGroupContainerResolver,\n\t\tprivate readonly supervisorFactory: DispatchWorkerSupervisorFactory,\n\t\tprivate readonly supervisorOptions: SupervisorOptions = { startupMax: 10 },\n\t) {\n\t}\n\n\tpublic async run({ logger, onError }: RunnableArgs): Promise<Running> {\n\t\tconst running = new Map<string | undefined, Promise<Running | undefined>>()\n\t\tlet aborted = false\n\n\t\tconst unlisten = this.projectGroupContainerResolver.on('create', ({ container, slug }) => {\n\t\t\tconst groupLabel = slug ?? '<default>'\n\t\t\tconst childLogger = logger.child({ projectGroup: groupLabel })\n\t\t\tchildLogger.debug(`Starting dispatch worker for project group ${groupLabel}`)\n\n\t\t\tconst supervised = new Supervisor(\n\t\t\t\tthis.supervisorFactory.create(container),\n\t\t\t\tthis.supervisorOptions,\n\t\t\t)\n\t\t\tconst runningPromise: Promise<Running | undefined> = supervised.run({\n\t\t\t\tlogger: childLogger,\n\t\t\t\tonError: e => {\n\t\t\t\t\tif (aborted) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tchildLogger.error(e, { message: `Dispatch worker for project group ${groupLabel} crashed` })\n\t\t\t\t\tonError(e)\n\t\t\t\t},\n\t\t\t}).catch(e => {\n\t\t\t\tif (!aborted) {\n\t\t\t\t\tchildLogger.error(e, { message: `Failed to start dispatch worker for project group ${groupLabel}` })\n\t\t\t\t\tonError(e)\n\t\t\t\t}\n\t\t\t\treturn undefined\n\t\t\t})\n\t\t\trunning.set(slug, runningPromise)\n\n\t\t\treturn () => {\n\t\t\t\trunning.delete(slug)\n\t\t\t\t;(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst r = await runningPromise\n\t\t\t\t\t\tawait r?.end()\n\t\t\t\t\t} catch {\n\t\t\t\t\t}\n\t\t\t\t})()\n\t\t\t}\n\t\t})\n\n\t\treturn {\n\t\t\tend: async () => {\n\t\t\t\taborted = true\n\t\t\t\tunlisten()\n\t\t\t\tconst all = [...running.values()]\n\t\t\t\trunning.clear()\n\t\t\t\tawait Promise.allSettled(all.map(async p => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst r = await p\n\t\t\t\t\t\tawait r?.end()\n\t\t\t\t\t} catch {\n\t\t\t\t\t}\n\t\t\t\t}))\n\t\t\t},\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";AAIO,MAAM,mBAAuC;AAAA,EACnD,YACkB,+BACA,mBACA,oBAAuC,EAAE,YAAY,MACrE;AAHgB,SAAA,gCAAA;AACA,SAAA,oBAAA;AACA,SAAA,oBAAA;AAAA,EAElB;AAAA,EAEA,MAAa,IAAI,EAAE,QAAQ,WAA2C;AACrE,UAAM,8BAAc,IAAA;AACpB,QAAI,UAAU;AAEd,UAAM,WAAW,KAAK,8BAA8B,GAAG,UAAU,CAAC,EAAE,WAAW,WAAW;AACzF,YAAM,aAAa,QAAQ;AAC3B,YAAM,cAAc,OAAO,MAAM,EAAE,cAAc,YAAY;AAC7D,kBAAY,MAAM,8CAA8C,UAAU,EAAE;AAE5E,YAAM,aAAa,IAAI;AAAA,QACtB,KAAK,kBAAkB,OAAO,SAAS;AAAA,QACvC,KAAK;AAAA,MAAA;AAEN,YAAM,iBAA+C,WAAW,IAAI;AAAA,QACnE,QAAQ;AAAA,QACR,SAAS,CAAA,MAAK;AACb,cAAI,SAAS;AACZ;AAAA,UACD;AACA,sBAAY,MAAM,GAAG,EAAE,SAAS,qCAAqC,UAAU,YAAY;AAC3F,kBAAQ,CAAC;AAAA,QACV;AAAA,MAAA,CACA,EAAE,MAAM,CAAA,MAAK;AACb,YAAI,CAAC,SAAS;AACb,sBAAY,MAAM,GAAG,EAAE,SAAS,qDAAqD,UAAU,IAAI;AACnG,kBAAQ,CAAC;AAAA,QACV;AACA,eAAO;AAAA,MACR,CAAC;AACD,cAAQ,IAAI,MAAM,cAAc;AAEhC,aAAO,MAAM;AACZ,gBAAQ,OAAO,IAAI;AAClB,SAAC,YAAY;AACb,cAAI;AACH,kBAAM,IAAI,MAAM;AAChB,kBAAM,GAAG,IAAA;AAAA,UACV,QAAQ;AAAA,UACR;AAAA,QACD,GAAA;AAAA,MACD;AAAA,IACD,CAAC;AAED,WAAO;AAAA,MACN,KAAK,YAAY;AAChB,kBAAU;AACV,iBAAA;AACA,cAAM,MAAM,CAAC,GAAG,QAAQ,QAAQ;AAChC,gBAAQ,MAAA;AACR,cAAM,QAAQ,WAAW,IAAI,IAAI,OAAM,MAAK;AAC3C,cAAI;AACH,kBAAM,IAAI,MAAM;AAChB,kBAAM,GAAG,IAAA;AAAA,UACV,QAAQ;AAAA,UACR;AAAA,QACD,CAAC,CAAC;AAAA,MACH;AAAA,IAAA;AAAA,EAEF;AACD;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectDispatcher.cjs","sources":["../../../../../packages/engine-actions/src/dispatch/ProjectDispatcher.ts"],"sourcesContent":["import { DatabaseContext } from '@contember/engine-system-api'\nimport { EventDispatcher } from './EventDispatcher'\nimport { ContentSchemaResolver } from '@contember/engine-http'\nimport { Runnable, RunnableArgs, Running } from '@contember/engine-common'\nimport { Listener } from '@contember/database'\nimport { NOTIFY_CHANNEL_NAME } from '../utils/notifyChannel'\n\nexport class ProjectDispatcherFactory {\n\tconstructor(\n\t\tprivate readonly dispatcher: EventDispatcher,\n\t) {\n\t}\n\n\tpublic create(\n\t\t{ db, contentSchemaResolver, projectSlug }: { db: DatabaseContext; contentSchemaResolver: ContentSchemaResolver; projectSlug: string },\n\t): ProjectDispatcher {\n\t\treturn new ProjectDispatcher(this.dispatcher, db, contentSchemaResolver, projectSlug)\n\t}\n}\n\nexport class ProjectDispatcher implements Runnable {\n\tconstructor(\n\t\tprivate readonly dispatcher: EventDispatcher,\n\t\tprivate readonly db: DatabaseContext,\n\t\tprivate readonly contentSchemaResolver: ContentSchemaResolver,\n\t\tprivate readonly projectSlug: string,\n\t) {\n\t}\n\n\tpublic async run({ logger, onError, onClose }: RunnableArgs): Promise<Running> {\n\t\treturn await new Promise<Running>(async (resolve, reject) => {\n\t\t\tlet resolvePending = () => {}\n\t\t\tlet rejectPending = (e: any) => {}\n\n\t\t\tconst resolvePendingRef = () => {\n\t\t\t\tresolvePending()\n\t\t\t}\n\t\t\tlet pendingError: any\n\t\t\tconst rejectPendingRef = (e: any) => {\n\t\t\t\tpendingError = e\n\t\t\t\trejectPending(e)\n\t\t\t}\n\n\t\t\tlet succeedTotal = 0\n\t\t\tlet failedTotal = 0\n\t\t\tlet aborted = false\n\n\t\t\ttry {\n\t\t\t\tawait this.db.scope(async db => {\n\t\t\t\t\tconst listener = await new Listener<string>(db.client, NOTIFY_CHANNEL_NAME, project => {\n\t\t\t\t\t\tif (project === this.projectSlug) {\n\t\t\t\t\t\t\tresolvePendingRef()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\t.run({ onError: rejectPendingRef, onClose: resolvePendingRef })\n\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tend: async () => {\n\t\t\t\t\t\t\taborted = true\n\t\t\t\t\t\t\tawait listener.end()\n\t\t\t\t\t\t\tlogger.info('Worker terminated', {\n\t\t\t\t\t\t\t\tsucceed: succeedTotal,\n\t\t\t\t\t\t\t\tfailed: failedTotal,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\twhile (!aborted) {\n\t\t\t\t\t\t\tconst { succeed, failed, backoffMs } = await this.dispatcher.processBatch({\n\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\tcontentSchemaResolver: this.contentSchemaResolver,\n\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tsucceedTotal += succeed\n\t\t\t\t\t\t\tfailedTotal += failed\n\n\t\t\t\t\t\t\t// listener error occurred during batch processing, rethrow\n\t\t\t\t\t\t\tif (pendingError) {\n\t\t\t\t\t\t\t\tthrow pendingError\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// queue is empty, wait\n\t\t\t\t\t\t\tif (backoffMs !== 0) {\n\t\t\t\t\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\t\t\t\t\tlet cleanup = () => {\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (backoffMs !== undefined) {\n\t\t\t\t\t\t\t\t\t\tconst timeoutHandle = setTimeout(resolve, backoffMs)\n\t\t\t\t\t\t\t\t\t\tcleanup = () => clearTimeout(timeoutHandle)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tresolvePending = () => {\n\t\t\t\t\t\t\t\t\t\tresolve()\n\t\t\t\t\t\t\t\t\t\tcleanup()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\trejectPending = e => {\n\t\t\t\t\t\t\t\t\t\treject(e)\n\t\t\t\t\t\t\t\t\t\tcleanup()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonClose?.()\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tawait listener.end()\n\t\t\t\t\t\tonError(e)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t} catch (e) {\n\t\t\t\treject(e)\n\t\t\t}\n\t\t})\n\t}\n}\n"],"names":["Listener","NOTIFY_CHANNEL_NAME","resolve","reject"],"mappings":";;;;AAOO,MAAM,yBAAyB;AAAA,EACrC,YACkB,YAChB;AADgB,SAAA,aAAA;AAAA,EAElB;AAAA,EAEO,OACN,EAAE,IAAI,uBAAuB,eACT;AACpB,WAAO,IAAI,kBAAkB,KAAK,YAAY,IAAI,uBAAuB,WAAW;AAAA,EACrF;AACD;AAEO,MAAM,kBAAsC;AAAA,EAClD,YACkB,YACA,IACA,uBACA,aAChB;AAJgB,SAAA,aAAA;AACA,SAAA,KAAA;AACA,SAAA,wBAAA;AACA,SAAA,cAAA;AAAA,EAElB;AAAA,EAEA,MAAa,IAAI,EAAE,QAAQ,SAAS,WAA2C;AAC9E,WAAO,MAAM,IAAI,QAAiB,OAAO,SAAS,WAAW;AAC5D,UAAI,iBAAiB,MAAM;AAAA,MAAC;AAC5B,UAAI,gBAAgB,CAAC,MAAW;AAAA,MAAC;AAEjC,YAAM,oBAAoB,MAAM;AAC/B,uBAAA;AAAA,MACD;AACA,UAAI;AACJ,YAAM,mBAAmB,CAAC,MAAW;AACpC,uBAAe;AACf,sBAAc,CAAC;AAAA,MAChB;AAEA,UAAI,eAAe;AACnB,UAAI,cAAc;AAClB,UAAI,UAAU;AAEd,UAAI;AACH,cAAM,KAAK,GAAG,MAAM,OAAM,OAAM;AAC/B,gBAAM,WAAW,MAAM,IAAIA,SAAAA,SAAiB,GAAG,QAAQC,cAAAA,qBAAqB,CAAA,YAAW;AACtF,gBAAI,YAAY,KAAK,aAAa;AACjC,gCAAA;AAAA,YACD;AAAA,UACD,CAAC,EACC,IAAI,EAAE,SAAS,kBAAkB,SAAS,mBAAmB;AAE/D,kBAAQ;AAAA,YACP,KAAK,YAAY;AAChB,wBAAU;AACV,oBAAM,SAAS,IAAA;AACf,qBAAO,KAAK,qBAAqB;AAAA,gBAChC,SAAS;AAAA,gBACT,QAAQ;AAAA,cAAA,CACR;AAAA,YACF;AAAA,UAAA,CACA;AAED,cAAI;AACH,mBAAO,CAAC,SAAS;AAChB,oBAAM,EAAE,SAAS,QAAQ,UAAA,IAAc,MAAM,KAAK,WAAW,aAAa;AAAA,gBACzE;AAAA,gBACA,uBAAuB,KAAK;AAAA,gBAC5B;AAAA,cAAA,CACA;AACD,8BAAgB;AAChB,6BAAe;AAGf,kBAAI,cAAc;AACjB,sBAAM;AAAA,cACP;AAGA,kBAAI,cAAc,GAAG;AACpB,sBAAM,IAAI,QAAc,CAACC,UAASC,YAAW;AAC5C,sBAAI,UAAU,MAAM;AAAA,kBACpB;AACA,sBAAI,cAAc,QAAW;AAC5B,0BAAM,gBAAgB,WAAWD,UAAS,SAAS;AACnD,8BAAU,MAAM,aAAa,aAAa;AAAA,kBAC3C;AACA,mCAAiB,MAAM;AACtBA,6BAAAA;AACA,4BAAA;AAAA,kBACD;AACA,kCAAgB,CAAA,MAAK;AACpBC,4BAAO,CAAC;AACR,4BAAA;AAAA,kBACD;AAAA,gBACD,CAAC;AAAA,cACF;AAAA,YACD;AACA,sBAAA;AAAA,UACD,SAAS,GAAG;AACX,kBAAM,SAAS,IAAA;AACf,oBAAQ,CAAC;AAAA,UACV;AAAA,QACD,CAAC;AAAA,MACF,SAAS,GAAG;AACX,eAAO,CAAC;AAAA,MACT;AAAA,IACD,CAAC;AAAA,EACF;AACD;;;"}
|
|
1
|
+
{"version":3,"file":"ProjectDispatcher.cjs","sources":["../../../../../packages/engine-actions/src/dispatch/ProjectDispatcher.ts"],"sourcesContent":["import { DatabaseContext } from '@contember/engine-system-api'\nimport { EventDispatcher } from './EventDispatcher.js'\nimport { ContentSchemaResolver } from '@contember/engine-http'\nimport { Runnable, RunnableArgs, Running } from '@contember/engine-common'\nimport { Listener } from '@contember/database'\nimport { NOTIFY_CHANNEL_NAME } from '../utils/notifyChannel.js'\n\nexport class ProjectDispatcherFactory {\n\tconstructor(\n\t\tprivate readonly dispatcher: EventDispatcher,\n\t) {\n\t}\n\n\tpublic create(\n\t\t{ db, contentSchemaResolver, projectSlug }: { db: DatabaseContext; contentSchemaResolver: ContentSchemaResolver; projectSlug: string },\n\t): ProjectDispatcher {\n\t\treturn new ProjectDispatcher(this.dispatcher, db, contentSchemaResolver, projectSlug)\n\t}\n}\n\nexport class ProjectDispatcher implements Runnable {\n\tconstructor(\n\t\tprivate readonly dispatcher: EventDispatcher,\n\t\tprivate readonly db: DatabaseContext,\n\t\tprivate readonly contentSchemaResolver: ContentSchemaResolver,\n\t\tprivate readonly projectSlug: string,\n\t) {\n\t}\n\n\tpublic async run({ logger, onError, onClose }: RunnableArgs): Promise<Running> {\n\t\treturn await new Promise<Running>(async (resolve, reject) => {\n\t\t\tlet resolvePending = () => {}\n\t\t\tlet rejectPending = (e: any) => {}\n\n\t\t\tconst resolvePendingRef = () => {\n\t\t\t\tresolvePending()\n\t\t\t}\n\t\t\tlet pendingError: any\n\t\t\tconst rejectPendingRef = (e: any) => {\n\t\t\t\tpendingError = e\n\t\t\t\trejectPending(e)\n\t\t\t}\n\n\t\t\tlet succeedTotal = 0\n\t\t\tlet failedTotal = 0\n\t\t\tlet aborted = false\n\n\t\t\ttry {\n\t\t\t\tawait this.db.scope(async db => {\n\t\t\t\t\tconst listener = await new Listener<string>(db.client, NOTIFY_CHANNEL_NAME, project => {\n\t\t\t\t\t\tif (project === this.projectSlug) {\n\t\t\t\t\t\t\tresolvePendingRef()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\t.run({ onError: rejectPendingRef, onClose: resolvePendingRef })\n\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tend: async () => {\n\t\t\t\t\t\t\taborted = true\n\t\t\t\t\t\t\tawait listener.end()\n\t\t\t\t\t\t\tlogger.info('Worker terminated', {\n\t\t\t\t\t\t\t\tsucceed: succeedTotal,\n\t\t\t\t\t\t\t\tfailed: failedTotal,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\twhile (!aborted) {\n\t\t\t\t\t\t\tconst { succeed, failed, backoffMs } = await this.dispatcher.processBatch({\n\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\tcontentSchemaResolver: this.contentSchemaResolver,\n\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tsucceedTotal += succeed\n\t\t\t\t\t\t\tfailedTotal += failed\n\n\t\t\t\t\t\t\t// listener error occurred during batch processing, rethrow\n\t\t\t\t\t\t\tif (pendingError) {\n\t\t\t\t\t\t\t\tthrow pendingError\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// queue is empty, wait\n\t\t\t\t\t\t\tif (backoffMs !== 0) {\n\t\t\t\t\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\t\t\t\t\tlet cleanup = () => {\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (backoffMs !== undefined) {\n\t\t\t\t\t\t\t\t\t\tconst timeoutHandle = setTimeout(resolve, backoffMs)\n\t\t\t\t\t\t\t\t\t\tcleanup = () => clearTimeout(timeoutHandle)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tresolvePending = () => {\n\t\t\t\t\t\t\t\t\t\tresolve()\n\t\t\t\t\t\t\t\t\t\tcleanup()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\trejectPending = e => {\n\t\t\t\t\t\t\t\t\t\treject(e)\n\t\t\t\t\t\t\t\t\t\tcleanup()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonClose?.()\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tawait listener.end()\n\t\t\t\t\t\tonError(e)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t} catch (e) {\n\t\t\t\treject(e)\n\t\t\t}\n\t\t})\n\t}\n}\n"],"names":["Listener","NOTIFY_CHANNEL_NAME","resolve","reject"],"mappings":";;;;AAOO,MAAM,yBAAyB;AAAA,EACrC,YACkB,YAChB;AADgB,SAAA,aAAA;AAAA,EAElB;AAAA,EAEO,OACN,EAAE,IAAI,uBAAuB,eACT;AACpB,WAAO,IAAI,kBAAkB,KAAK,YAAY,IAAI,uBAAuB,WAAW;AAAA,EACrF;AACD;AAEO,MAAM,kBAAsC;AAAA,EAClD,YACkB,YACA,IACA,uBACA,aAChB;AAJgB,SAAA,aAAA;AACA,SAAA,KAAA;AACA,SAAA,wBAAA;AACA,SAAA,cAAA;AAAA,EAElB;AAAA,EAEA,MAAa,IAAI,EAAE,QAAQ,SAAS,WAA2C;AAC9E,WAAO,MAAM,IAAI,QAAiB,OAAO,SAAS,WAAW;AAC5D,UAAI,iBAAiB,MAAM;AAAA,MAAC;AAC5B,UAAI,gBAAgB,CAAC,MAAW;AAAA,MAAC;AAEjC,YAAM,oBAAoB,MAAM;AAC/B,uBAAA;AAAA,MACD;AACA,UAAI;AACJ,YAAM,mBAAmB,CAAC,MAAW;AACpC,uBAAe;AACf,sBAAc,CAAC;AAAA,MAChB;AAEA,UAAI,eAAe;AACnB,UAAI,cAAc;AAClB,UAAI,UAAU;AAEd,UAAI;AACH,cAAM,KAAK,GAAG,MAAM,OAAM,OAAM;AAC/B,gBAAM,WAAW,MAAM,IAAIA,SAAAA,SAAiB,GAAG,QAAQC,cAAAA,qBAAqB,CAAA,YAAW;AACtF,gBAAI,YAAY,KAAK,aAAa;AACjC,gCAAA;AAAA,YACD;AAAA,UACD,CAAC,EACC,IAAI,EAAE,SAAS,kBAAkB,SAAS,mBAAmB;AAE/D,kBAAQ;AAAA,YACP,KAAK,YAAY;AAChB,wBAAU;AACV,oBAAM,SAAS,IAAA;AACf,qBAAO,KAAK,qBAAqB;AAAA,gBAChC,SAAS;AAAA,gBACT,QAAQ;AAAA,cAAA,CACR;AAAA,YACF;AAAA,UAAA,CACA;AAED,cAAI;AACH,mBAAO,CAAC,SAAS;AAChB,oBAAM,EAAE,SAAS,QAAQ,UAAA,IAAc,MAAM,KAAK,WAAW,aAAa;AAAA,gBACzE;AAAA,gBACA,uBAAuB,KAAK;AAAA,gBAC5B;AAAA,cAAA,CACA;AACD,8BAAgB;AAChB,6BAAe;AAGf,kBAAI,cAAc;AACjB,sBAAM;AAAA,cACP;AAGA,kBAAI,cAAc,GAAG;AACpB,sBAAM,IAAI,QAAc,CAACC,UAASC,YAAW;AAC5C,sBAAI,UAAU,MAAM;AAAA,kBACpB;AACA,sBAAI,cAAc,QAAW;AAC5B,0BAAM,gBAAgB,WAAWD,UAAS,SAAS;AACnD,8BAAU,MAAM,aAAa,aAAa;AAAA,kBAC3C;AACA,mCAAiB,MAAM;AACtBA,6BAAAA;AACA,4BAAA;AAAA,kBACD;AACA,kCAAgB,CAAA,MAAK;AACpBC,4BAAO,CAAC;AACR,4BAAA;AAAA,kBACD;AAAA,gBACD,CAAC;AAAA,cACF;AAAA,YACD;AACA,sBAAA;AAAA,UACD,SAAS,GAAG;AACX,kBAAM,SAAS,IAAA;AACf,oBAAQ,CAAC;AAAA,UACV;AAAA,QACD,CAAC;AAAA,MACF,SAAS,GAAG;AACX,eAAO,CAAC;AAAA,MACT;AAAA,IACD,CAAC;AAAA,EACF;AACD;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectDispatcher.js","sources":["../../../../../packages/engine-actions/src/dispatch/ProjectDispatcher.ts"],"sourcesContent":["import { DatabaseContext } from '@contember/engine-system-api'\nimport { EventDispatcher } from './EventDispatcher'\nimport { ContentSchemaResolver } from '@contember/engine-http'\nimport { Runnable, RunnableArgs, Running } from '@contember/engine-common'\nimport { Listener } from '@contember/database'\nimport { NOTIFY_CHANNEL_NAME } from '../utils/notifyChannel'\n\nexport class ProjectDispatcherFactory {\n\tconstructor(\n\t\tprivate readonly dispatcher: EventDispatcher,\n\t) {\n\t}\n\n\tpublic create(\n\t\t{ db, contentSchemaResolver, projectSlug }: { db: DatabaseContext; contentSchemaResolver: ContentSchemaResolver; projectSlug: string },\n\t): ProjectDispatcher {\n\t\treturn new ProjectDispatcher(this.dispatcher, db, contentSchemaResolver, projectSlug)\n\t}\n}\n\nexport class ProjectDispatcher implements Runnable {\n\tconstructor(\n\t\tprivate readonly dispatcher: EventDispatcher,\n\t\tprivate readonly db: DatabaseContext,\n\t\tprivate readonly contentSchemaResolver: ContentSchemaResolver,\n\t\tprivate readonly projectSlug: string,\n\t) {\n\t}\n\n\tpublic async run({ logger, onError, onClose }: RunnableArgs): Promise<Running> {\n\t\treturn await new Promise<Running>(async (resolve, reject) => {\n\t\t\tlet resolvePending = () => {}\n\t\t\tlet rejectPending = (e: any) => {}\n\n\t\t\tconst resolvePendingRef = () => {\n\t\t\t\tresolvePending()\n\t\t\t}\n\t\t\tlet pendingError: any\n\t\t\tconst rejectPendingRef = (e: any) => {\n\t\t\t\tpendingError = e\n\t\t\t\trejectPending(e)\n\t\t\t}\n\n\t\t\tlet succeedTotal = 0\n\t\t\tlet failedTotal = 0\n\t\t\tlet aborted = false\n\n\t\t\ttry {\n\t\t\t\tawait this.db.scope(async db => {\n\t\t\t\t\tconst listener = await new Listener<string>(db.client, NOTIFY_CHANNEL_NAME, project => {\n\t\t\t\t\t\tif (project === this.projectSlug) {\n\t\t\t\t\t\t\tresolvePendingRef()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\t.run({ onError: rejectPendingRef, onClose: resolvePendingRef })\n\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tend: async () => {\n\t\t\t\t\t\t\taborted = true\n\t\t\t\t\t\t\tawait listener.end()\n\t\t\t\t\t\t\tlogger.info('Worker terminated', {\n\t\t\t\t\t\t\t\tsucceed: succeedTotal,\n\t\t\t\t\t\t\t\tfailed: failedTotal,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\twhile (!aborted) {\n\t\t\t\t\t\t\tconst { succeed, failed, backoffMs } = await this.dispatcher.processBatch({\n\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\tcontentSchemaResolver: this.contentSchemaResolver,\n\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tsucceedTotal += succeed\n\t\t\t\t\t\t\tfailedTotal += failed\n\n\t\t\t\t\t\t\t// listener error occurred during batch processing, rethrow\n\t\t\t\t\t\t\tif (pendingError) {\n\t\t\t\t\t\t\t\tthrow pendingError\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// queue is empty, wait\n\t\t\t\t\t\t\tif (backoffMs !== 0) {\n\t\t\t\t\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\t\t\t\t\tlet cleanup = () => {\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (backoffMs !== undefined) {\n\t\t\t\t\t\t\t\t\t\tconst timeoutHandle = setTimeout(resolve, backoffMs)\n\t\t\t\t\t\t\t\t\t\tcleanup = () => clearTimeout(timeoutHandle)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tresolvePending = () => {\n\t\t\t\t\t\t\t\t\t\tresolve()\n\t\t\t\t\t\t\t\t\t\tcleanup()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\trejectPending = e => {\n\t\t\t\t\t\t\t\t\t\treject(e)\n\t\t\t\t\t\t\t\t\t\tcleanup()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonClose?.()\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tawait listener.end()\n\t\t\t\t\t\tonError(e)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t} catch (e) {\n\t\t\t\treject(e)\n\t\t\t}\n\t\t})\n\t}\n}\n"],"names":["resolve","reject"],"mappings":";;AAOO,MAAM,yBAAyB;AAAA,EACrC,YACkB,YAChB;AADgB,SAAA,aAAA;AAAA,EAElB;AAAA,EAEO,OACN,EAAE,IAAI,uBAAuB,eACT;AACpB,WAAO,IAAI,kBAAkB,KAAK,YAAY,IAAI,uBAAuB,WAAW;AAAA,EACrF;AACD;AAEO,MAAM,kBAAsC;AAAA,EAClD,YACkB,YACA,IACA,uBACA,aAChB;AAJgB,SAAA,aAAA;AACA,SAAA,KAAA;AACA,SAAA,wBAAA;AACA,SAAA,cAAA;AAAA,EAElB;AAAA,EAEA,MAAa,IAAI,EAAE,QAAQ,SAAS,WAA2C;AAC9E,WAAO,MAAM,IAAI,QAAiB,OAAO,SAAS,WAAW;AAC5D,UAAI,iBAAiB,MAAM;AAAA,MAAC;AAC5B,UAAI,gBAAgB,CAAC,MAAW;AAAA,MAAC;AAEjC,YAAM,oBAAoB,MAAM;AAC/B,uBAAA;AAAA,MACD;AACA,UAAI;AACJ,YAAM,mBAAmB,CAAC,MAAW;AACpC,uBAAe;AACf,sBAAc,CAAC;AAAA,MAChB;AAEA,UAAI,eAAe;AACnB,UAAI,cAAc;AAClB,UAAI,UAAU;AAEd,UAAI;AACH,cAAM,KAAK,GAAG,MAAM,OAAM,OAAM;AAC/B,gBAAM,WAAW,MAAM,IAAI,SAAiB,GAAG,QAAQ,qBAAqB,CAAA,YAAW;AACtF,gBAAI,YAAY,KAAK,aAAa;AACjC,gCAAA;AAAA,YACD;AAAA,UACD,CAAC,EACC,IAAI,EAAE,SAAS,kBAAkB,SAAS,mBAAmB;AAE/D,kBAAQ;AAAA,YACP,KAAK,YAAY;AAChB,wBAAU;AACV,oBAAM,SAAS,IAAA;AACf,qBAAO,KAAK,qBAAqB;AAAA,gBAChC,SAAS;AAAA,gBACT,QAAQ;AAAA,cAAA,CACR;AAAA,YACF;AAAA,UAAA,CACA;AAED,cAAI;AACH,mBAAO,CAAC,SAAS;AAChB,oBAAM,EAAE,SAAS,QAAQ,UAAA,IAAc,MAAM,KAAK,WAAW,aAAa;AAAA,gBACzE;AAAA,gBACA,uBAAuB,KAAK;AAAA,gBAC5B;AAAA,cAAA,CACA;AACD,8BAAgB;AAChB,6BAAe;AAGf,kBAAI,cAAc;AACjB,sBAAM;AAAA,cACP;AAGA,kBAAI,cAAc,GAAG;AACpB,sBAAM,IAAI,QAAc,CAACA,UAASC,YAAW;AAC5C,sBAAI,UAAU,MAAM;AAAA,kBACpB;AACA,sBAAI,cAAc,QAAW;AAC5B,0BAAM,gBAAgB,WAAWD,UAAS,SAAS;AACnD,8BAAU,MAAM,aAAa,aAAa;AAAA,kBAC3C;AACA,mCAAiB,MAAM;AACtBA,6BAAAA;AACA,4BAAA;AAAA,kBACD;AACA,kCAAgB,CAAA,MAAK;AACpBC,4BAAO,CAAC;AACR,4BAAA;AAAA,kBACD;AAAA,gBACD,CAAC;AAAA,cACF;AAAA,YACD;AACA,sBAAA;AAAA,UACD,SAAS,GAAG;AACX,kBAAM,SAAS,IAAA;AACf,oBAAQ,CAAC;AAAA,UACV;AAAA,QACD,CAAC;AAAA,MACF,SAAS,GAAG;AACX,eAAO,CAAC;AAAA,MACT;AAAA,IACD,CAAC;AAAA,EACF;AACD;"}
|
|
1
|
+
{"version":3,"file":"ProjectDispatcher.js","sources":["../../../../../packages/engine-actions/src/dispatch/ProjectDispatcher.ts"],"sourcesContent":["import { DatabaseContext } from '@contember/engine-system-api'\nimport { EventDispatcher } from './EventDispatcher.js'\nimport { ContentSchemaResolver } from '@contember/engine-http'\nimport { Runnable, RunnableArgs, Running } from '@contember/engine-common'\nimport { Listener } from '@contember/database'\nimport { NOTIFY_CHANNEL_NAME } from '../utils/notifyChannel.js'\n\nexport class ProjectDispatcherFactory {\n\tconstructor(\n\t\tprivate readonly dispatcher: EventDispatcher,\n\t) {\n\t}\n\n\tpublic create(\n\t\t{ db, contentSchemaResolver, projectSlug }: { db: DatabaseContext; contentSchemaResolver: ContentSchemaResolver; projectSlug: string },\n\t): ProjectDispatcher {\n\t\treturn new ProjectDispatcher(this.dispatcher, db, contentSchemaResolver, projectSlug)\n\t}\n}\n\nexport class ProjectDispatcher implements Runnable {\n\tconstructor(\n\t\tprivate readonly dispatcher: EventDispatcher,\n\t\tprivate readonly db: DatabaseContext,\n\t\tprivate readonly contentSchemaResolver: ContentSchemaResolver,\n\t\tprivate readonly projectSlug: string,\n\t) {\n\t}\n\n\tpublic async run({ logger, onError, onClose }: RunnableArgs): Promise<Running> {\n\t\treturn await new Promise<Running>(async (resolve, reject) => {\n\t\t\tlet resolvePending = () => {}\n\t\t\tlet rejectPending = (e: any) => {}\n\n\t\t\tconst resolvePendingRef = () => {\n\t\t\t\tresolvePending()\n\t\t\t}\n\t\t\tlet pendingError: any\n\t\t\tconst rejectPendingRef = (e: any) => {\n\t\t\t\tpendingError = e\n\t\t\t\trejectPending(e)\n\t\t\t}\n\n\t\t\tlet succeedTotal = 0\n\t\t\tlet failedTotal = 0\n\t\t\tlet aborted = false\n\n\t\t\ttry {\n\t\t\t\tawait this.db.scope(async db => {\n\t\t\t\t\tconst listener = await new Listener<string>(db.client, NOTIFY_CHANNEL_NAME, project => {\n\t\t\t\t\t\tif (project === this.projectSlug) {\n\t\t\t\t\t\t\tresolvePendingRef()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t\t.run({ onError: rejectPendingRef, onClose: resolvePendingRef })\n\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tend: async () => {\n\t\t\t\t\t\t\taborted = true\n\t\t\t\t\t\t\tawait listener.end()\n\t\t\t\t\t\t\tlogger.info('Worker terminated', {\n\t\t\t\t\t\t\t\tsucceed: succeedTotal,\n\t\t\t\t\t\t\t\tfailed: failedTotal,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\twhile (!aborted) {\n\t\t\t\t\t\t\tconst { succeed, failed, backoffMs } = await this.dispatcher.processBatch({\n\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\tcontentSchemaResolver: this.contentSchemaResolver,\n\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tsucceedTotal += succeed\n\t\t\t\t\t\t\tfailedTotal += failed\n\n\t\t\t\t\t\t\t// listener error occurred during batch processing, rethrow\n\t\t\t\t\t\t\tif (pendingError) {\n\t\t\t\t\t\t\t\tthrow pendingError\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// queue is empty, wait\n\t\t\t\t\t\t\tif (backoffMs !== 0) {\n\t\t\t\t\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\t\t\t\t\tlet cleanup = () => {\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (backoffMs !== undefined) {\n\t\t\t\t\t\t\t\t\t\tconst timeoutHandle = setTimeout(resolve, backoffMs)\n\t\t\t\t\t\t\t\t\t\tcleanup = () => clearTimeout(timeoutHandle)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tresolvePending = () => {\n\t\t\t\t\t\t\t\t\t\tresolve()\n\t\t\t\t\t\t\t\t\t\tcleanup()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\trejectPending = e => {\n\t\t\t\t\t\t\t\t\t\treject(e)\n\t\t\t\t\t\t\t\t\t\tcleanup()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonClose?.()\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tawait listener.end()\n\t\t\t\t\t\tonError(e)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t} catch (e) {\n\t\t\t\treject(e)\n\t\t\t}\n\t\t})\n\t}\n}\n"],"names":["resolve","reject"],"mappings":";;AAOO,MAAM,yBAAyB;AAAA,EACrC,YACkB,YAChB;AADgB,SAAA,aAAA;AAAA,EAElB;AAAA,EAEO,OACN,EAAE,IAAI,uBAAuB,eACT;AACpB,WAAO,IAAI,kBAAkB,KAAK,YAAY,IAAI,uBAAuB,WAAW;AAAA,EACrF;AACD;AAEO,MAAM,kBAAsC;AAAA,EAClD,YACkB,YACA,IACA,uBACA,aAChB;AAJgB,SAAA,aAAA;AACA,SAAA,KAAA;AACA,SAAA,wBAAA;AACA,SAAA,cAAA;AAAA,EAElB;AAAA,EAEA,MAAa,IAAI,EAAE,QAAQ,SAAS,WAA2C;AAC9E,WAAO,MAAM,IAAI,QAAiB,OAAO,SAAS,WAAW;AAC5D,UAAI,iBAAiB,MAAM;AAAA,MAAC;AAC5B,UAAI,gBAAgB,CAAC,MAAW;AAAA,MAAC;AAEjC,YAAM,oBAAoB,MAAM;AAC/B,uBAAA;AAAA,MACD;AACA,UAAI;AACJ,YAAM,mBAAmB,CAAC,MAAW;AACpC,uBAAe;AACf,sBAAc,CAAC;AAAA,MAChB;AAEA,UAAI,eAAe;AACnB,UAAI,cAAc;AAClB,UAAI,UAAU;AAEd,UAAI;AACH,cAAM,KAAK,GAAG,MAAM,OAAM,OAAM;AAC/B,gBAAM,WAAW,MAAM,IAAI,SAAiB,GAAG,QAAQ,qBAAqB,CAAA,YAAW;AACtF,gBAAI,YAAY,KAAK,aAAa;AACjC,gCAAA;AAAA,YACD;AAAA,UACD,CAAC,EACC,IAAI,EAAE,SAAS,kBAAkB,SAAS,mBAAmB;AAE/D,kBAAQ;AAAA,YACP,KAAK,YAAY;AAChB,wBAAU;AACV,oBAAM,SAAS,IAAA;AACf,qBAAO,KAAK,qBAAqB;AAAA,gBAChC,SAAS;AAAA,gBACT,QAAQ;AAAA,cAAA,CACR;AAAA,YACF;AAAA,UAAA,CACA;AAED,cAAI;AACH,mBAAO,CAAC,SAAS;AAChB,oBAAM,EAAE,SAAS,QAAQ,UAAA,IAAc,MAAM,KAAK,WAAW,aAAa;AAAA,gBACzE;AAAA,gBACA,uBAAuB,KAAK;AAAA,gBAC5B;AAAA,cAAA,CACA;AACD,8BAAgB;AAChB,6BAAe;AAGf,kBAAI,cAAc;AACjB,sBAAM;AAAA,cACP;AAGA,kBAAI,cAAc,GAAG;AACpB,sBAAM,IAAI,QAAc,CAACA,UAASC,YAAW;AAC5C,sBAAI,UAAU,MAAM;AAAA,kBACpB;AACA,sBAAI,cAAc,QAAW;AAC5B,0BAAM,gBAAgB,WAAWD,UAAS,SAAS;AACnD,8BAAU,MAAM,aAAa,aAAa;AAAA,kBAC3C;AACA,mCAAiB,MAAM;AACtBA,6BAAAA;AACA,4BAAA;AAAA,kBACD;AACA,kCAAgB,CAAA,MAAK;AACpBC,4BAAO,CAAC;AACR,4BAAA;AAAA,kBACD;AAAA,gBACD,CAAC;AAAA,cACF;AAAA,YACD;AACA,sBAAA;AAAA,UACD,SAAS,GAAG;AACX,kBAAM,SAAS,IAAA;AACf,oBAAQ,CAAC;AAAA,UACV;AAAA,QACD,CAAC;AAAA,MACF,SAAS,GAAG;AACX,eAAO,CAAC;AAAA,MACT;AAAA,IACD,CAAC;AAAA,EACF;AACD;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TargetHandlerResolver.cjs","sources":["../../../../../packages/engine-actions/src/dispatch/TargetHandlerResolver.ts"],"sourcesContent":["import { Actions } from '@contember/schema'\nimport { WebhookTargetHandler } from './WebhookTargetHandler'\nimport { ImplementationException } from '../ImplementationException'\nimport { InvokeHandler } from './types'\n\nexport class TargetHandlerResolver {\n\tconstructor(\n\t\tprivate readonly webhookHandler: WebhookTargetHandler,\n\t) {\n\t}\n\n\tpublic resolveHandler<T extends Actions.AnyTarget>(target: T): InvokeHandler<T> {\n\t\tif (target.type !== 'webhook') {\n\t\t\tthrow new ImplementationException('Invalid trigger invocation type')\n\t\t}\n\t\treturn this.webhookHandler\n\t}\n}\n"],"names":["ImplementationException"],"mappings":";;;AAKO,MAAM,sBAAsB;AAAA,EAClC,YACkB,gBAChB;AADgB,SAAA,iBAAA;AAAA,EAElB;AAAA,EAEO,eAA4C,QAA6B;AAC/E,QAAI,OAAO,SAAS,WAAW;AAC9B,YAAM,IAAIA,wBAAAA,wBAAwB,iCAAiC;AAAA,IACpE;AACA,WAAO,KAAK;AAAA,EACb;AACD;;"}
|
|
1
|
+
{"version":3,"file":"TargetHandlerResolver.cjs","sources":["../../../../../packages/engine-actions/src/dispatch/TargetHandlerResolver.ts"],"sourcesContent":["import { Actions } from '@contember/schema'\nimport { WebhookTargetHandler } from './WebhookTargetHandler.js'\nimport { ImplementationException } from '../ImplementationException.js'\nimport { InvokeHandler } from './types.js'\n\nexport class TargetHandlerResolver {\n\tconstructor(\n\t\tprivate readonly webhookHandler: WebhookTargetHandler,\n\t) {\n\t}\n\n\tpublic resolveHandler<T extends Actions.AnyTarget>(target: T): InvokeHandler<T> {\n\t\tif (target.type !== 'webhook') {\n\t\t\tthrow new ImplementationException('Invalid trigger invocation type')\n\t\t}\n\t\treturn this.webhookHandler\n\t}\n}\n"],"names":["ImplementationException"],"mappings":";;;AAKO,MAAM,sBAAsB;AAAA,EAClC,YACkB,gBAChB;AADgB,SAAA,iBAAA;AAAA,EAElB;AAAA,EAEO,eAA4C,QAA6B;AAC/E,QAAI,OAAO,SAAS,WAAW;AAC9B,YAAM,IAAIA,wBAAAA,wBAAwB,iCAAiC;AAAA,IACpE;AACA,WAAO,KAAK;AAAA,EACb;AACD;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TargetHandlerResolver.js","sources":["../../../../../packages/engine-actions/src/dispatch/TargetHandlerResolver.ts"],"sourcesContent":["import { Actions } from '@contember/schema'\nimport { WebhookTargetHandler } from './WebhookTargetHandler'\nimport { ImplementationException } from '../ImplementationException'\nimport { InvokeHandler } from './types'\n\nexport class TargetHandlerResolver {\n\tconstructor(\n\t\tprivate readonly webhookHandler: WebhookTargetHandler,\n\t) {\n\t}\n\n\tpublic resolveHandler<T extends Actions.AnyTarget>(target: T): InvokeHandler<T> {\n\t\tif (target.type !== 'webhook') {\n\t\t\tthrow new ImplementationException('Invalid trigger invocation type')\n\t\t}\n\t\treturn this.webhookHandler\n\t}\n}\n"],"names":[],"mappings":";AAKO,MAAM,sBAAsB;AAAA,EAClC,YACkB,gBAChB;AADgB,SAAA,iBAAA;AAAA,EAElB;AAAA,EAEO,eAA4C,QAA6B;AAC/E,QAAI,OAAO,SAAS,WAAW;AAC9B,YAAM,IAAI,wBAAwB,iCAAiC;AAAA,IACpE;AACA,WAAO,KAAK;AAAA,EACb;AACD;"}
|
|
1
|
+
{"version":3,"file":"TargetHandlerResolver.js","sources":["../../../../../packages/engine-actions/src/dispatch/TargetHandlerResolver.ts"],"sourcesContent":["import { Actions } from '@contember/schema'\nimport { WebhookTargetHandler } from './WebhookTargetHandler.js'\nimport { ImplementationException } from '../ImplementationException.js'\nimport { InvokeHandler } from './types.js'\n\nexport class TargetHandlerResolver {\n\tconstructor(\n\t\tprivate readonly webhookHandler: WebhookTargetHandler,\n\t) {\n\t}\n\n\tpublic resolveHandler<T extends Actions.AnyTarget>(target: T): InvokeHandler<T> {\n\t\tif (target.type !== 'webhook') {\n\t\t\tthrow new ImplementationException('Invalid trigger invocation type')\n\t\t}\n\t\treturn this.webhookHandler\n\t}\n}\n"],"names":[],"mappings":";AAKO,MAAM,sBAAsB;AAAA,EAClC,YACkB,gBAChB;AADgB,SAAA,iBAAA;AAAA,EAElB;AAAA,EAEO,eAA4C,QAA6B;AAC/E,QAAI,OAAO,SAAS,WAAW;AAC9B,YAAM,IAAI,wBAAwB,iCAAiC;AAAA,IACpE;AACA,WAAO,KAAK;AAAA,EACb;AACD;"}
|