@contember/engine-actions 2.0.0-alpha.9 → 2.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js.map +1 -1
- package/dist/development/src/ActionsExecutionContainerHookFactory.cjs +2 -2
- package/dist/development/src/ActionsExecutionContainerHookFactory.cjs.map +1 -1
- package/dist/development/src/ActionsExecutionContainerHookFactory.js +2 -2
- 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/ActionsAuthorizationActions.cjs.map +1 -1
- package/dist/development/src/authorization/ActionsAuthorizationActions.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 +1 -1
- package/dist/development/src/dispatch/EventDispatcher.cjs.map +1 -1
- package/dist/development/src/dispatch/EventDispatcher.js +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/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/WebhookFetcher.cjs.map +1 -1
- package/dist/development/src/dispatch/WebhookFetcher.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/SetVariablesMutationResolver.cjs.map +1 -1
- package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.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/graphql/schema/actions.graphql.cjs.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/SetVariableCommand.cjs.map +1 -1
- package/dist/development/src/model/SetVariableCommand.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/model/VariablesQuery.cjs.map +1 -1
- package/dist/development/src/model/VariablesQuery.js.map +1 -1
- package/dist/development/src/triggers/TriggerHandler.cjs +2 -2
- package/dist/development/src/triggers/TriggerHandler.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerHandler.js +2 -2
- 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 +4 -4
- package/dist/development/src/triggers/TriggerPayloadBuilder.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadBuilder.js +4 -4
- 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 +3 -0
- package/dist/development/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
- package/dist/development/src/triggers/TriggerPayloadPersister.js +3 -0
- package/dist/development/src/triggers/TriggerPayloadPersister.js.map +1 -1
- package/dist/development/src/utils/map.cjs.map +1 -1
- package/dist/development/src/utils/map.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 +2 -2
- package/dist/production/src/ActionsExecutionContainerHookFactory.cjs.map +1 -1
- package/dist/production/src/ActionsExecutionContainerHookFactory.js +2 -2
- 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/ActionsAuthorizationActions.cjs.map +1 -1
- package/dist/production/src/authorization/ActionsAuthorizationActions.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 +1 -1
- package/dist/production/src/dispatch/EventDispatcher.cjs.map +1 -1
- package/dist/production/src/dispatch/EventDispatcher.js +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/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/WebhookFetcher.cjs.map +1 -1
- package/dist/production/src/dispatch/WebhookFetcher.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/SetVariablesMutationResolver.cjs.map +1 -1
- package/dist/production/src/graphql/resolvers/mutation/SetVariablesMutationResolver.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/graphql/schema/actions.graphql.cjs.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/SetVariableCommand.cjs.map +1 -1
- package/dist/production/src/model/SetVariableCommand.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/model/VariablesQuery.cjs.map +1 -1
- package/dist/production/src/model/VariablesQuery.js.map +1 -1
- package/dist/production/src/triggers/TriggerHandler.cjs +2 -2
- package/dist/production/src/triggers/TriggerHandler.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerHandler.js +2 -2
- 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 +4 -4
- package/dist/production/src/triggers/TriggerPayloadBuilder.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadBuilder.js +4 -4
- 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 +3 -0
- package/dist/production/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
- package/dist/production/src/triggers/TriggerPayloadPersister.js +3 -0
- package/dist/production/src/triggers/TriggerPayloadPersister.js.map +1 -1
- package/dist/production/src/utils/map.cjs.map +1 -1
- package/dist/production/src/utils/map.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/graphql/schema/index.d.ts +71 -39
- package/dist/types/graphql/schema/index.d.ts.map +1 -1
- package/dist/types/triggers/TriggerPayloadPersister.d.ts +2 -2
- package/dist/types/triggers/TriggerPayloadPersister.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/{graphql-actions.codegen.yml → graphql.codegen.yml} +1 -1
- package/package.json +20 -26
- package/src/ActionsExecutionContainerHookFactory.ts +2 -2
- package/src/dispatch/EventDispatcher.ts +1 -1
- package/src/graphql/schema/index.ts +43 -39
- package/src/triggers/TriggerHandler.ts +2 -2
- package/src/triggers/TriggerPayloadBuilder.ts +4 -4
- package/src/triggers/TriggerPayloadPersister.ts +5 -2
- package/tests/cases/unit/generator.test.ts +5 -1
- package/tests/cases/unit/webhookHandler.test.ts +5 -1
- package/tsconfig.settings.json +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookTargetHandler.cjs","sources":["../../../../../packages/engine-actions/src/dispatch/WebhookTargetHandler.ts"],"sourcesContent":["import { Actions, ActionsPayload } from '@contember/schema'\nimport { EventRow, HandledEvent, InvokeHandler, InvokeHandlerArgs } from './types'\nimport { VariablesMap } from '../model/VariablesManager'\nimport * as Typesafe from '@contember/typesafe'\nimport { FetcherResponse, WebhookFetcher } from './WebhookFetcher'\n\nconst DEFAULT_TIMEOUT_MS = 30_000 // 30 seconds\n\nconst ResponseType = Typesafe.noExtraProps(Typesafe.object({\n\tfailures: Typesafe.array(\n\t\tTypesafe.intersection(\n\t\t\tTypesafe.object({\n\t\t\t\teventId: Typesafe.string,\n\t\t\t}),\n\t\t\tTypesafe.partial({\n\t\t\t\terror: Typesafe.string,\n\t\t\t}),\n\t\t),\n\t),\n}))\n\ntype EventResponseFactory = (eventRow: EventRow) => ({ ok: boolean; code?: number; response?: string; errorMessage?: string; durationMs?: number })\n\nexport class WebhookTargetHandler implements InvokeHandler<Actions.WebhookTarget> {\n\tconstructor(\n\t\tprivate readonly fetcher: WebhookFetcher,\n\t) {\n\t}\n\n\tpublic async handle({ target, events, logger, variables }: InvokeHandlerArgs<Actions.WebhookTarget>): Promise<HandledEvent[]> {\n\t\tconst timeoutMs = target.timeoutMs\n\n\t\tconst start = process.hrtime.bigint()\n\t\tconst getDuration = () => Math.floor(Number((process.hrtime.bigint() - start) / BigInt(1_000_000)))\n\n\t\tlet eventResponseFactory: EventResponseFactory\n\t\ttry {\n\n\t\t\tconst response = await this.fetch(timeoutMs ?? DEFAULT_TIMEOUT_MS, target, variables, events)\n\n\t\t\teventResponseFactory = this.createResponseFactory({\n\t\t\t\tresponse: response,\n\t\t\t\tevents,\n\t\t\t})\n\n\t\t} catch (e) {\n\t\t\tlogger.warn(e)\n\t\t\tconst errorMessages = this.extractErrorMessages(e)\n\t\t\tconst result = {\n\t\t\t\tok: false,\n\t\t\t\terrorMessage: errorMessages.length ? errorMessages.join('; ') : undefined,\n\t\t\t\tdurationMs: getDuration(),\n\t\t\t}\n\t\t\teventResponseFactory = () => ({ ok: false, errorMessage: errorMessages.length ? errorMessages.join('; ') : undefined })\n\n\t\t\treturn events.map(it => ({ target, row: it, result }))\n\t\t}\n\t\tconst durationMs = getDuration()\n\n\t\treturn events.map(it => ({ target, row: it, result: { durationMs, ...eventResponseFactory(it) } }))\n\t}\n\n\tprivate createResponseFactory({ response, events }: {\n\t\tresponse: FetcherResponse\n\t\tevents: EventRow[]\n\t}): EventResponseFactory {\n\t\tif (!response.ok) {\n\t\t\treturn () => ({\n\t\t\t\tok: false,\n\t\t\t\tcode: response.status,\n\t\t\t\tresponse: response.responseText,\n\t\t\t\terrorMessage: response.statusText,\n\t\t\t})\n\t\t}\n\n\t\tif (response.responseText.trim() === ''\n\t\t\t|| !response.headers.get('content-type')?.toLowerCase().includes('json')\n\t\t) {\n\t\t\treturn () => ({\n\t\t\t\tok: true,\n\t\t\t\tcode: response.status,\n\t\t\t})\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsedJson = JSON.parse(response.responseText)\n\t\t\tif (parsedJson === null || typeof parsedJson !== 'object' || !('failures' in parsedJson)) {\n\t\t\t\treturn () => ({\n\t\t\t\t\tok: true,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst responseData = ResponseType(parsedJson)\n\t\t\tconst eventsInBatch = new Set(events.map(it => it.id))\n\t\t\tconst failedEvents = Object.fromEntries(responseData.failures?.map(it => [it.eventId, it]) ?? [])\n\t\t\tconst missingEvents = Object.keys(failedEvents).filter(it => !eventsInBatch.has(it))\n\n\t\t\tif (missingEvents.length) {\n\t\t\t\treturn () => ({\n\t\t\t\t\tok: false,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t\tresponse: response.responseText,\n\t\t\t\t\terrorMessage: 'Invalid response: undefined events IDs: ' + missingEvents.join('; '),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn it => {\n\t\t\t\tif (!failedEvents[it.id]) {\n\t\t\t\t\treturn { ok: true, code: response.status }\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t\terrorMessage: failedEvents[it.id].error,\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e: any) {\n\t\t\treturn () => ({\n\t\t\t\tok: false,\n\t\t\t\tcode: response.status,\n\t\t\t\tresponse: response.responseText,\n\t\t\t\terrorMessage: 'Invalid response: ' + e.message,\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate extractErrorMessages(e: unknown): string[] {\n\t\tconst errorMessages = []\n\t\tlet err = e\n\t\twhile (typeof err === 'object' && err !== null && 'message' in err && typeof (err as any).message === 'string') {\n\t\t\terrorMessages.push((err as any).message)\n\t\t\terr = (err as any).cause\n\t\t}\n\t\treturn errorMessages\n\t}\n\n\tprivate async fetch(timeoutMs: number, target: Actions.WebhookTarget, variables: VariablesMap, events: EventRow[]): Promise<FetcherResponse> {\n\t\treturn await withTimeout(timeoutMs, async abortController => {\n\t\t\treturn await this.doFetch(target, variables, abortController, events)\n\t\t})\n\t}\n\n\tprivate async doFetch(target: Actions.WebhookTarget, variables: VariablesMap, abortController: AbortController, events: EventRow[]): Promise<FetcherResponse> {\n\t\tconst resolvedUrl = this.resolveVariables(target.url, variables)\n\t\tconst resolvedHeaders = Object.fromEntries(Object.entries(target.headers ?? {})\n\t\t\t.map(([key, value]) => [key, this.resolveVariables(value, variables)]))\n\n\t\treturn await this.fetcher.fetch(resolvedUrl, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t['User-Agent']: 'Contember Actions',\n\t\t\t\t...resolvedHeaders,\n\t\t\t\t['Content-type']: 'application/json',\n\t\t\t},\n\t\t\tsignal: abortController.signal,\n\t\t\tbody: this.formatBody(events, target),\n\t\t})\n\t}\n\n\tprivate formatBody(events: EventRow[], target: Actions.WebhookTarget): string {\n\t\tconst body = target.body ?? {}\n\t\tconst path = target.payloadPath ?? []\n\t\tlet current: any = body\n\t\tfor (let i = 0; i < path.length; i++) {\n\t\t\tcurrent[path[i]] ??= {}\n\t\t\tcurrent = current[path[i]]\n\t\t}\n\t\tcurrent['events'] = events.map(this.formatEventPayload)\n\t\treturn JSON.stringify(body)\n\t}\n\n\tprivate formatEventPayload(it: EventRow): ActionsPayload.WebhookEvent {\n\t\treturn {\n\t\t\tmeta: {\n\t\t\t\teventId: it.id,\n\t\t\t\ttransactionId: it.transaction_id,\n\t\t\t\tcreatedAt: it.created_at.toISOString(),\n\t\t\t\tlastStateChange: it.last_state_change.toISOString(),\n\t\t\t\tnumRetries: it.num_retries,\n\t\t\t\ttrigger: it.trigger,\n\t\t\t\ttarget: it.target,\n\t\t\t\t// todo: add stage and schema version\n\t\t\t},\n\t\t\t...it.payload,\n\t\t}\n\t}\n\n\tprivate resolveVariables(subject: string, variables: VariablesMap) {\n\t\treturn subject.replace(/\\{\\{([\\w_]+)}}/gm, (_, name) => {\n\t\t\tif (!variables[name]) {\n\t\t\t\tthrow new Error(`Undefined variable ${name}`)\n\t\t\t}\n\t\t\treturn variables[name]\n\t\t})\n\t}\n}\n\nconst withTimeout = async <T>(timeoutMs: number, cb: (abortController: AbortController) => Promise<T>): Promise<T> => {\n\tconst abortController = new AbortController()\n\tconst timeoutId = setTimeout(() => {\n\t\tabortController.abort()\n\t}, timeoutMs)\n\ttry {\n\t\treturn await cb(abortController)\n\t} finally {\n\t\tclearTimeout(timeoutId)\n\t}\n}\n"],"names":["Typesafe"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WebhookTargetHandler.cjs","sources":["../../../../../packages/engine-actions/src/dispatch/WebhookTargetHandler.ts"],"sourcesContent":["import { Actions, ActionsPayload } from '@contember/schema'\nimport { EventRow, HandledEvent, InvokeHandler, InvokeHandlerArgs } from './types'\nimport { VariablesMap } from '../model/VariablesManager'\nimport * as Typesafe from '@contember/typesafe'\nimport { FetcherResponse, WebhookFetcher } from './WebhookFetcher'\n\nconst DEFAULT_TIMEOUT_MS = 30_000 // 30 seconds\n\nconst ResponseType = Typesafe.noExtraProps(Typesafe.object({\n\tfailures: Typesafe.array(\n\t\tTypesafe.intersection(\n\t\t\tTypesafe.object({\n\t\t\t\teventId: Typesafe.string,\n\t\t\t}),\n\t\t\tTypesafe.partial({\n\t\t\t\terror: Typesafe.string,\n\t\t\t}),\n\t\t),\n\t),\n}))\n\ntype EventResponseFactory = (eventRow: EventRow) => ({ ok: boolean; code?: number; response?: string; errorMessage?: string; durationMs?: number })\n\nexport class WebhookTargetHandler implements InvokeHandler<Actions.WebhookTarget> {\n\tconstructor(\n\t\tprivate readonly fetcher: WebhookFetcher,\n\t) {\n\t}\n\n\tpublic async handle({ target, events, logger, variables }: InvokeHandlerArgs<Actions.WebhookTarget>): Promise<HandledEvent[]> {\n\t\tconst timeoutMs = target.timeoutMs\n\n\t\tconst start = process.hrtime.bigint()\n\t\tconst getDuration = () => Math.floor(Number((process.hrtime.bigint() - start) / BigInt(1_000_000)))\n\n\t\tlet eventResponseFactory: EventResponseFactory\n\t\ttry {\n\n\t\t\tconst response = await this.fetch(timeoutMs ?? DEFAULT_TIMEOUT_MS, target, variables, events)\n\n\t\t\teventResponseFactory = this.createResponseFactory({\n\t\t\t\tresponse: response,\n\t\t\t\tevents,\n\t\t\t})\n\n\t\t} catch (e) {\n\t\t\tlogger.warn(e)\n\t\t\tconst errorMessages = this.extractErrorMessages(e)\n\t\t\tconst result = {\n\t\t\t\tok: false,\n\t\t\t\terrorMessage: errorMessages.length ? errorMessages.join('; ') : undefined,\n\t\t\t\tdurationMs: getDuration(),\n\t\t\t}\n\t\t\teventResponseFactory = () => ({ ok: false, errorMessage: errorMessages.length ? errorMessages.join('; ') : undefined })\n\n\t\t\treturn events.map(it => ({ target, row: it, result }))\n\t\t}\n\t\tconst durationMs = getDuration()\n\n\t\treturn events.map(it => ({ target, row: it, result: { durationMs, ...eventResponseFactory(it) } }))\n\t}\n\n\tprivate createResponseFactory({ response, events }: {\n\t\tresponse: FetcherResponse\n\t\tevents: EventRow[]\n\t}): EventResponseFactory {\n\t\tif (!response.ok) {\n\t\t\treturn () => ({\n\t\t\t\tok: false,\n\t\t\t\tcode: response.status,\n\t\t\t\tresponse: response.responseText,\n\t\t\t\terrorMessage: response.statusText,\n\t\t\t})\n\t\t}\n\n\t\tif (response.responseText.trim() === ''\n\t\t\t|| !response.headers.get('content-type')?.toLowerCase().includes('json')\n\t\t) {\n\t\t\treturn () => ({\n\t\t\t\tok: true,\n\t\t\t\tcode: response.status,\n\t\t\t})\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsedJson = JSON.parse(response.responseText)\n\t\t\tif (parsedJson === null || typeof parsedJson !== 'object' || !('failures' in parsedJson)) {\n\t\t\t\treturn () => ({\n\t\t\t\t\tok: true,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst responseData = ResponseType(parsedJson)\n\t\t\tconst eventsInBatch = new Set(events.map(it => it.id))\n\t\t\tconst failedEvents = Object.fromEntries(responseData.failures?.map(it => [it.eventId, it]) ?? [])\n\t\t\tconst missingEvents = Object.keys(failedEvents).filter(it => !eventsInBatch.has(it))\n\n\t\t\tif (missingEvents.length) {\n\t\t\t\treturn () => ({\n\t\t\t\t\tok: false,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t\tresponse: response.responseText,\n\t\t\t\t\terrorMessage: 'Invalid response: undefined events IDs: ' + missingEvents.join('; '),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn it => {\n\t\t\t\tif (!failedEvents[it.id]) {\n\t\t\t\t\treturn { ok: true, code: response.status }\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t\terrorMessage: failedEvents[it.id].error,\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e: any) {\n\t\t\treturn () => ({\n\t\t\t\tok: false,\n\t\t\t\tcode: response.status,\n\t\t\t\tresponse: response.responseText,\n\t\t\t\terrorMessage: 'Invalid response: ' + e.message,\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate extractErrorMessages(e: unknown): string[] {\n\t\tconst errorMessages = []\n\t\tlet err = e\n\t\twhile (typeof err === 'object' && err !== null && 'message' in err && typeof (err as any).message === 'string') {\n\t\t\terrorMessages.push((err as any).message)\n\t\t\terr = (err as any).cause\n\t\t}\n\t\treturn errorMessages\n\t}\n\n\tprivate async fetch(timeoutMs: number, target: Actions.WebhookTarget, variables: VariablesMap, events: EventRow[]): Promise<FetcherResponse> {\n\t\treturn await withTimeout(timeoutMs, async abortController => {\n\t\t\treturn await this.doFetch(target, variables, abortController, events)\n\t\t})\n\t}\n\n\tprivate async doFetch(target: Actions.WebhookTarget, variables: VariablesMap, abortController: AbortController, events: EventRow[]): Promise<FetcherResponse> {\n\t\tconst resolvedUrl = this.resolveVariables(target.url, variables)\n\t\tconst resolvedHeaders = Object.fromEntries(Object.entries(target.headers ?? {})\n\t\t\t.map(([key, value]) => [key, this.resolveVariables(value, variables)]))\n\n\t\treturn await this.fetcher.fetch(resolvedUrl, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t['User-Agent']: 'Contember Actions',\n\t\t\t\t...resolvedHeaders,\n\t\t\t\t['Content-type']: 'application/json',\n\t\t\t},\n\t\t\tsignal: abortController.signal,\n\t\t\tbody: this.formatBody(events, target),\n\t\t})\n\t}\n\n\tprivate formatBody(events: EventRow[], target: Actions.WebhookTarget): string {\n\t\tconst body = target.body ?? {}\n\t\tconst path = target.payloadPath ?? []\n\t\tlet current: any = body\n\t\tfor (let i = 0; i < path.length; i++) {\n\t\t\tcurrent[path[i]] ??= {}\n\t\t\tcurrent = current[path[i]]\n\t\t}\n\t\tcurrent['events'] = events.map(this.formatEventPayload)\n\t\treturn JSON.stringify(body)\n\t}\n\n\tprivate formatEventPayload(it: EventRow): ActionsPayload.WebhookEvent {\n\t\treturn {\n\t\t\tmeta: {\n\t\t\t\teventId: it.id,\n\t\t\t\ttransactionId: it.transaction_id,\n\t\t\t\tcreatedAt: it.created_at.toISOString(),\n\t\t\t\tlastStateChange: it.last_state_change.toISOString(),\n\t\t\t\tnumRetries: it.num_retries,\n\t\t\t\ttrigger: it.trigger,\n\t\t\t\ttarget: it.target,\n\t\t\t\t// todo: add stage and schema version\n\t\t\t},\n\t\t\t...it.payload,\n\t\t}\n\t}\n\n\tprivate resolveVariables(subject: string, variables: VariablesMap) {\n\t\treturn subject.replace(/\\{\\{([\\w_]+)}}/gm, (_, name) => {\n\t\t\tif (!variables[name]) {\n\t\t\t\tthrow new Error(`Undefined variable ${name}`)\n\t\t\t}\n\t\t\treturn variables[name]\n\t\t})\n\t}\n}\n\nconst withTimeout = async <T>(timeoutMs: number, cb: (abortController: AbortController) => Promise<T>): Promise<T> => {\n\tconst abortController = new AbortController()\n\tconst timeoutId = setTimeout(() => {\n\t\tabortController.abort()\n\t}, timeoutMs)\n\ttry {\n\t\treturn await cb(abortController)\n\t} finally {\n\t\tclearTimeout(timeoutId)\n\t}\n}\n"],"names":["Typesafe"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookTargetHandler.js","sources":["../../../../../packages/engine-actions/src/dispatch/WebhookTargetHandler.ts"],"sourcesContent":["import { Actions, ActionsPayload } from '@contember/schema'\nimport { EventRow, HandledEvent, InvokeHandler, InvokeHandlerArgs } from './types'\nimport { VariablesMap } from '../model/VariablesManager'\nimport * as Typesafe from '@contember/typesafe'\nimport { FetcherResponse, WebhookFetcher } from './WebhookFetcher'\n\nconst DEFAULT_TIMEOUT_MS = 30_000 // 30 seconds\n\nconst ResponseType = Typesafe.noExtraProps(Typesafe.object({\n\tfailures: Typesafe.array(\n\t\tTypesafe.intersection(\n\t\t\tTypesafe.object({\n\t\t\t\teventId: Typesafe.string,\n\t\t\t}),\n\t\t\tTypesafe.partial({\n\t\t\t\terror: Typesafe.string,\n\t\t\t}),\n\t\t),\n\t),\n}))\n\ntype EventResponseFactory = (eventRow: EventRow) => ({ ok: boolean; code?: number; response?: string; errorMessage?: string; durationMs?: number })\n\nexport class WebhookTargetHandler implements InvokeHandler<Actions.WebhookTarget> {\n\tconstructor(\n\t\tprivate readonly fetcher: WebhookFetcher,\n\t) {\n\t}\n\n\tpublic async handle({ target, events, logger, variables }: InvokeHandlerArgs<Actions.WebhookTarget>): Promise<HandledEvent[]> {\n\t\tconst timeoutMs = target.timeoutMs\n\n\t\tconst start = process.hrtime.bigint()\n\t\tconst getDuration = () => Math.floor(Number((process.hrtime.bigint() - start) / BigInt(1_000_000)))\n\n\t\tlet eventResponseFactory: EventResponseFactory\n\t\ttry {\n\n\t\t\tconst response = await this.fetch(timeoutMs ?? DEFAULT_TIMEOUT_MS, target, variables, events)\n\n\t\t\teventResponseFactory = this.createResponseFactory({\n\t\t\t\tresponse: response,\n\t\t\t\tevents,\n\t\t\t})\n\n\t\t} catch (e) {\n\t\t\tlogger.warn(e)\n\t\t\tconst errorMessages = this.extractErrorMessages(e)\n\t\t\tconst result = {\n\t\t\t\tok: false,\n\t\t\t\terrorMessage: errorMessages.length ? errorMessages.join('; ') : undefined,\n\t\t\t\tdurationMs: getDuration(),\n\t\t\t}\n\t\t\teventResponseFactory = () => ({ ok: false, errorMessage: errorMessages.length ? errorMessages.join('; ') : undefined })\n\n\t\t\treturn events.map(it => ({ target, row: it, result }))\n\t\t}\n\t\tconst durationMs = getDuration()\n\n\t\treturn events.map(it => ({ target, row: it, result: { durationMs, ...eventResponseFactory(it) } }))\n\t}\n\n\tprivate createResponseFactory({ response, events }: {\n\t\tresponse: FetcherResponse\n\t\tevents: EventRow[]\n\t}): EventResponseFactory {\n\t\tif (!response.ok) {\n\t\t\treturn () => ({\n\t\t\t\tok: false,\n\t\t\t\tcode: response.status,\n\t\t\t\tresponse: response.responseText,\n\t\t\t\terrorMessage: response.statusText,\n\t\t\t})\n\t\t}\n\n\t\tif (response.responseText.trim() === ''\n\t\t\t|| !response.headers.get('content-type')?.toLowerCase().includes('json')\n\t\t) {\n\t\t\treturn () => ({\n\t\t\t\tok: true,\n\t\t\t\tcode: response.status,\n\t\t\t})\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsedJson = JSON.parse(response.responseText)\n\t\t\tif (parsedJson === null || typeof parsedJson !== 'object' || !('failures' in parsedJson)) {\n\t\t\t\treturn () => ({\n\t\t\t\t\tok: true,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst responseData = ResponseType(parsedJson)\n\t\t\tconst eventsInBatch = new Set(events.map(it => it.id))\n\t\t\tconst failedEvents = Object.fromEntries(responseData.failures?.map(it => [it.eventId, it]) ?? [])\n\t\t\tconst missingEvents = Object.keys(failedEvents).filter(it => !eventsInBatch.has(it))\n\n\t\t\tif (missingEvents.length) {\n\t\t\t\treturn () => ({\n\t\t\t\t\tok: false,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t\tresponse: response.responseText,\n\t\t\t\t\terrorMessage: 'Invalid response: undefined events IDs: ' + missingEvents.join('; '),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn it => {\n\t\t\t\tif (!failedEvents[it.id]) {\n\t\t\t\t\treturn { ok: true, code: response.status }\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t\terrorMessage: failedEvents[it.id].error,\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e: any) {\n\t\t\treturn () => ({\n\t\t\t\tok: false,\n\t\t\t\tcode: response.status,\n\t\t\t\tresponse: response.responseText,\n\t\t\t\terrorMessage: 'Invalid response: ' + e.message,\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate extractErrorMessages(e: unknown): string[] {\n\t\tconst errorMessages = []\n\t\tlet err = e\n\t\twhile (typeof err === 'object' && err !== null && 'message' in err && typeof (err as any).message === 'string') {\n\t\t\terrorMessages.push((err as any).message)\n\t\t\terr = (err as any).cause\n\t\t}\n\t\treturn errorMessages\n\t}\n\n\tprivate async fetch(timeoutMs: number, target: Actions.WebhookTarget, variables: VariablesMap, events: EventRow[]): Promise<FetcherResponse> {\n\t\treturn await withTimeout(timeoutMs, async abortController => {\n\t\t\treturn await this.doFetch(target, variables, abortController, events)\n\t\t})\n\t}\n\n\tprivate async doFetch(target: Actions.WebhookTarget, variables: VariablesMap, abortController: AbortController, events: EventRow[]): Promise<FetcherResponse> {\n\t\tconst resolvedUrl = this.resolveVariables(target.url, variables)\n\t\tconst resolvedHeaders = Object.fromEntries(Object.entries(target.headers ?? {})\n\t\t\t.map(([key, value]) => [key, this.resolveVariables(value, variables)]))\n\n\t\treturn await this.fetcher.fetch(resolvedUrl, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t['User-Agent']: 'Contember Actions',\n\t\t\t\t...resolvedHeaders,\n\t\t\t\t['Content-type']: 'application/json',\n\t\t\t},\n\t\t\tsignal: abortController.signal,\n\t\t\tbody: this.formatBody(events, target),\n\t\t})\n\t}\n\n\tprivate formatBody(events: EventRow[], target: Actions.WebhookTarget): string {\n\t\tconst body = target.body ?? {}\n\t\tconst path = target.payloadPath ?? []\n\t\tlet current: any = body\n\t\tfor (let i = 0; i < path.length; i++) {\n\t\t\tcurrent[path[i]] ??= {}\n\t\t\tcurrent = current[path[i]]\n\t\t}\n\t\tcurrent['events'] = events.map(this.formatEventPayload)\n\t\treturn JSON.stringify(body)\n\t}\n\n\tprivate formatEventPayload(it: EventRow): ActionsPayload.WebhookEvent {\n\t\treturn {\n\t\t\tmeta: {\n\t\t\t\teventId: it.id,\n\t\t\t\ttransactionId: it.transaction_id,\n\t\t\t\tcreatedAt: it.created_at.toISOString(),\n\t\t\t\tlastStateChange: it.last_state_change.toISOString(),\n\t\t\t\tnumRetries: it.num_retries,\n\t\t\t\ttrigger: it.trigger,\n\t\t\t\ttarget: it.target,\n\t\t\t\t// todo: add stage and schema version\n\t\t\t},\n\t\t\t...it.payload,\n\t\t}\n\t}\n\n\tprivate resolveVariables(subject: string, variables: VariablesMap) {\n\t\treturn subject.replace(/\\{\\{([\\w_]+)}}/gm, (_, name) => {\n\t\t\tif (!variables[name]) {\n\t\t\t\tthrow new Error(`Undefined variable ${name}`)\n\t\t\t}\n\t\t\treturn variables[name]\n\t\t})\n\t}\n}\n\nconst withTimeout = async <T>(timeoutMs: number, cb: (abortController: AbortController) => Promise<T>): Promise<T> => {\n\tconst abortController = new AbortController()\n\tconst timeoutId = setTimeout(() => {\n\t\tabortController.abort()\n\t}, timeoutMs)\n\ttry {\n\t\treturn await cb(abortController)\n\t} finally {\n\t\tclearTimeout(timeoutId)\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WebhookTargetHandler.js","sources":["../../../../../packages/engine-actions/src/dispatch/WebhookTargetHandler.ts"],"sourcesContent":["import { Actions, ActionsPayload } from '@contember/schema'\nimport { EventRow, HandledEvent, InvokeHandler, InvokeHandlerArgs } from './types'\nimport { VariablesMap } from '../model/VariablesManager'\nimport * as Typesafe from '@contember/typesafe'\nimport { FetcherResponse, WebhookFetcher } from './WebhookFetcher'\n\nconst DEFAULT_TIMEOUT_MS = 30_000 // 30 seconds\n\nconst ResponseType = Typesafe.noExtraProps(Typesafe.object({\n\tfailures: Typesafe.array(\n\t\tTypesafe.intersection(\n\t\t\tTypesafe.object({\n\t\t\t\teventId: Typesafe.string,\n\t\t\t}),\n\t\t\tTypesafe.partial({\n\t\t\t\terror: Typesafe.string,\n\t\t\t}),\n\t\t),\n\t),\n}))\n\ntype EventResponseFactory = (eventRow: EventRow) => ({ ok: boolean; code?: number; response?: string; errorMessage?: string; durationMs?: number })\n\nexport class WebhookTargetHandler implements InvokeHandler<Actions.WebhookTarget> {\n\tconstructor(\n\t\tprivate readonly fetcher: WebhookFetcher,\n\t) {\n\t}\n\n\tpublic async handle({ target, events, logger, variables }: InvokeHandlerArgs<Actions.WebhookTarget>): Promise<HandledEvent[]> {\n\t\tconst timeoutMs = target.timeoutMs\n\n\t\tconst start = process.hrtime.bigint()\n\t\tconst getDuration = () => Math.floor(Number((process.hrtime.bigint() - start) / BigInt(1_000_000)))\n\n\t\tlet eventResponseFactory: EventResponseFactory\n\t\ttry {\n\n\t\t\tconst response = await this.fetch(timeoutMs ?? DEFAULT_TIMEOUT_MS, target, variables, events)\n\n\t\t\teventResponseFactory = this.createResponseFactory({\n\t\t\t\tresponse: response,\n\t\t\t\tevents,\n\t\t\t})\n\n\t\t} catch (e) {\n\t\t\tlogger.warn(e)\n\t\t\tconst errorMessages = this.extractErrorMessages(e)\n\t\t\tconst result = {\n\t\t\t\tok: false,\n\t\t\t\terrorMessage: errorMessages.length ? errorMessages.join('; ') : undefined,\n\t\t\t\tdurationMs: getDuration(),\n\t\t\t}\n\t\t\teventResponseFactory = () => ({ ok: false, errorMessage: errorMessages.length ? errorMessages.join('; ') : undefined })\n\n\t\t\treturn events.map(it => ({ target, row: it, result }))\n\t\t}\n\t\tconst durationMs = getDuration()\n\n\t\treturn events.map(it => ({ target, row: it, result: { durationMs, ...eventResponseFactory(it) } }))\n\t}\n\n\tprivate createResponseFactory({ response, events }: {\n\t\tresponse: FetcherResponse\n\t\tevents: EventRow[]\n\t}): EventResponseFactory {\n\t\tif (!response.ok) {\n\t\t\treturn () => ({\n\t\t\t\tok: false,\n\t\t\t\tcode: response.status,\n\t\t\t\tresponse: response.responseText,\n\t\t\t\terrorMessage: response.statusText,\n\t\t\t})\n\t\t}\n\n\t\tif (response.responseText.trim() === ''\n\t\t\t|| !response.headers.get('content-type')?.toLowerCase().includes('json')\n\t\t) {\n\t\t\treturn () => ({\n\t\t\t\tok: true,\n\t\t\t\tcode: response.status,\n\t\t\t})\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsedJson = JSON.parse(response.responseText)\n\t\t\tif (parsedJson === null || typeof parsedJson !== 'object' || !('failures' in parsedJson)) {\n\t\t\t\treturn () => ({\n\t\t\t\t\tok: true,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t})\n\t\t\t}\n\t\t\tconst responseData = ResponseType(parsedJson)\n\t\t\tconst eventsInBatch = new Set(events.map(it => it.id))\n\t\t\tconst failedEvents = Object.fromEntries(responseData.failures?.map(it => [it.eventId, it]) ?? [])\n\t\t\tconst missingEvents = Object.keys(failedEvents).filter(it => !eventsInBatch.has(it))\n\n\t\t\tif (missingEvents.length) {\n\t\t\t\treturn () => ({\n\t\t\t\t\tok: false,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t\tresponse: response.responseText,\n\t\t\t\t\terrorMessage: 'Invalid response: undefined events IDs: ' + missingEvents.join('; '),\n\t\t\t\t})\n\t\t\t}\n\n\t\t\treturn it => {\n\t\t\t\tif (!failedEvents[it.id]) {\n\t\t\t\t\treturn { ok: true, code: response.status }\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\tcode: response.status,\n\t\t\t\t\terrorMessage: failedEvents[it.id].error,\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e: any) {\n\t\t\treturn () => ({\n\t\t\t\tok: false,\n\t\t\t\tcode: response.status,\n\t\t\t\tresponse: response.responseText,\n\t\t\t\terrorMessage: 'Invalid response: ' + e.message,\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate extractErrorMessages(e: unknown): string[] {\n\t\tconst errorMessages = []\n\t\tlet err = e\n\t\twhile (typeof err === 'object' && err !== null && 'message' in err && typeof (err as any).message === 'string') {\n\t\t\terrorMessages.push((err as any).message)\n\t\t\terr = (err as any).cause\n\t\t}\n\t\treturn errorMessages\n\t}\n\n\tprivate async fetch(timeoutMs: number, target: Actions.WebhookTarget, variables: VariablesMap, events: EventRow[]): Promise<FetcherResponse> {\n\t\treturn await withTimeout(timeoutMs, async abortController => {\n\t\t\treturn await this.doFetch(target, variables, abortController, events)\n\t\t})\n\t}\n\n\tprivate async doFetch(target: Actions.WebhookTarget, variables: VariablesMap, abortController: AbortController, events: EventRow[]): Promise<FetcherResponse> {\n\t\tconst resolvedUrl = this.resolveVariables(target.url, variables)\n\t\tconst resolvedHeaders = Object.fromEntries(Object.entries(target.headers ?? {})\n\t\t\t.map(([key, value]) => [key, this.resolveVariables(value, variables)]))\n\n\t\treturn await this.fetcher.fetch(resolvedUrl, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t['User-Agent']: 'Contember Actions',\n\t\t\t\t...resolvedHeaders,\n\t\t\t\t['Content-type']: 'application/json',\n\t\t\t},\n\t\t\tsignal: abortController.signal,\n\t\t\tbody: this.formatBody(events, target),\n\t\t})\n\t}\n\n\tprivate formatBody(events: EventRow[], target: Actions.WebhookTarget): string {\n\t\tconst body = target.body ?? {}\n\t\tconst path = target.payloadPath ?? []\n\t\tlet current: any = body\n\t\tfor (let i = 0; i < path.length; i++) {\n\t\t\tcurrent[path[i]] ??= {}\n\t\t\tcurrent = current[path[i]]\n\t\t}\n\t\tcurrent['events'] = events.map(this.formatEventPayload)\n\t\treturn JSON.stringify(body)\n\t}\n\n\tprivate formatEventPayload(it: EventRow): ActionsPayload.WebhookEvent {\n\t\treturn {\n\t\t\tmeta: {\n\t\t\t\teventId: it.id,\n\t\t\t\ttransactionId: it.transaction_id,\n\t\t\t\tcreatedAt: it.created_at.toISOString(),\n\t\t\t\tlastStateChange: it.last_state_change.toISOString(),\n\t\t\t\tnumRetries: it.num_retries,\n\t\t\t\ttrigger: it.trigger,\n\t\t\t\ttarget: it.target,\n\t\t\t\t// todo: add stage and schema version\n\t\t\t},\n\t\t\t...it.payload,\n\t\t}\n\t}\n\n\tprivate resolveVariables(subject: string, variables: VariablesMap) {\n\t\treturn subject.replace(/\\{\\{([\\w_]+)}}/gm, (_, name) => {\n\t\t\tif (!variables[name]) {\n\t\t\t\tthrow new Error(`Undefined variable ${name}`)\n\t\t\t}\n\t\t\treturn variables[name]\n\t\t})\n\t}\n}\n\nconst withTimeout = async <T>(timeoutMs: number, cb: (abortController: AbortController) => Promise<T>): Promise<T> => {\n\tconst abortController = new AbortController()\n\tconst timeoutId = setTimeout(() => {\n\t\tabortController.abort()\n\t}, timeoutMs)\n\ttry {\n\t\treturn await cb(abortController)\n\t} finally {\n\t\tclearTimeout(timeoutId)\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsApiMiddlewareFactory.cjs","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsApiMiddlewareFactory.ts"],"sourcesContent":["import { HttpController } from '@contember/engine-http'\nimport { ActionsGraphQLHandler } from './ActionsGraphQLHandlerFactory'\nimport { ActionsContext } from '../resolvers/ActionsContext'\nimport { ActionsContextResolver } from './ActionsContextResolver'\nimport { AuthorizationScope, Authorizator } from '@contember/authorization'\nimport { Identity } from '../../authorization'\nimport { ForbiddenError } from '@contember/graphql-utils'\n\nexport class ActionsApiMiddlewareFactory {\n\tconstructor(\n\t\tprivate readonly actionsContextResolver: ActionsContextResolver,\n\t\tprivate readonly actionsGraphQLHandler: ActionsGraphQLHandler,\n\t\tprivate readonly authorizator: Authorizator<Identity>,\n\t) {\n\t}\n\n\tcreate(): HttpController {\n\t\treturn async ctx => {\n\t\t\tconst { timer, logger, koa } = ctx\n\t\t\tconst { projectContainer, identity } = await this.actionsContextResolver.resolve(ctx)\n\n\t\t\tconst systemDatabase = projectContainer.systemDatabaseContext\n\n\t\t\tlogger.debug('Actions query processing started')\n\t\t\tconst graphqlContext: ActionsContext = {\n\t\t\t\tdb: systemDatabase,\n\t\t\t\tlogger,\n\t\t\t\tcontentSchemaResolver: projectContainer.contentSchemaResolver,\n\t\t\t\trequireAccess: async (action, message) => {\n\t\t\t\t\tif (!(await this.authorizator.isAllowed(identity, new AuthorizationScope.Global(), action))) {\n\t\t\t\t\t\tthrow new ForbiddenError(message || 'Forbidden')\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}\n\t\t\tconst handler = this.actionsGraphQLHandler\n\n\t\t\tawait timer('GraphQL', () => handler({\n\t\t\t\trequest: koa.request,\n\t\t\t\tresponse: koa.response,\n\t\t\t\tcreateContext: () => graphqlContext,\n\t\t\t}))\n\t\t\tlogger.debug('Actions query finished')\n\t\t}\n\t}\n}\n"],"names":["AuthorizationScope","ForbiddenError"],"mappings":";;;;AAQO,MAAM,4BAA4B;AAAA,EACxC,YACkB,wBACA,uBACA,cAChB;AAHgB,SAAA,yBAAA;AACA,SAAA,wBAAA;AACA,SAAA,eAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"ActionsApiMiddlewareFactory.cjs","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsApiMiddlewareFactory.ts"],"sourcesContent":["import { HttpController } from '@contember/engine-http'\nimport { ActionsGraphQLHandler } from './ActionsGraphQLHandlerFactory'\nimport { ActionsContext } from '../resolvers/ActionsContext'\nimport { ActionsContextResolver } from './ActionsContextResolver'\nimport { AuthorizationScope, Authorizator } from '@contember/authorization'\nimport { Identity } from '../../authorization'\nimport { ForbiddenError } from '@contember/graphql-utils'\n\nexport class ActionsApiMiddlewareFactory {\n\tconstructor(\n\t\tprivate readonly actionsContextResolver: ActionsContextResolver,\n\t\tprivate readonly actionsGraphQLHandler: ActionsGraphQLHandler,\n\t\tprivate readonly authorizator: Authorizator<Identity>,\n\t) {\n\t}\n\n\tcreate(): HttpController {\n\t\treturn async ctx => {\n\t\t\tconst { timer, logger, koa } = ctx\n\t\t\tconst { projectContainer, identity } = await this.actionsContextResolver.resolve(ctx)\n\n\t\t\tconst systemDatabase = projectContainer.systemDatabaseContext\n\n\t\t\tlogger.debug('Actions query processing started')\n\t\t\tconst graphqlContext: ActionsContext = {\n\t\t\t\tdb: systemDatabase,\n\t\t\t\tlogger,\n\t\t\t\tcontentSchemaResolver: projectContainer.contentSchemaResolver,\n\t\t\t\trequireAccess: async (action, message) => {\n\t\t\t\t\tif (!(await this.authorizator.isAllowed(identity, new AuthorizationScope.Global(), action))) {\n\t\t\t\t\t\tthrow new ForbiddenError(message || 'Forbidden')\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}\n\t\t\tconst handler = this.actionsGraphQLHandler\n\n\t\t\tawait timer('GraphQL', () => handler({\n\t\t\t\trequest: koa.request,\n\t\t\t\tresponse: koa.response,\n\t\t\t\tcreateContext: () => graphqlContext,\n\t\t\t}))\n\t\t\tlogger.debug('Actions query finished')\n\t\t}\n\t}\n}\n"],"names":["AuthorizationScope","ForbiddenError"],"mappings":";;;;AAQO,MAAM,4BAA4B;AAAA,EACxC,YACkB,wBACA,uBACA,cAChB;AAHgB,SAAA,yBAAA;AACA,SAAA,wBAAA;AACA,SAAA,eAAA;AAAA,EAAA;AAAA,EAIlB,SAAyB;AACxB,WAAO,OAAM,QAAO;AACnB,YAAM,EAAE,OAAO,QAAQ,IAAQ,IAAA;AACzB,YAAA,EAAE,kBAAkB,SAAS,IAAI,MAAM,KAAK,uBAAuB,QAAQ,GAAG;AAEpF,YAAM,iBAAiB,iBAAiB;AAExC,aAAO,MAAM,kCAAkC;AAC/C,YAAM,iBAAiC;AAAA,QACtC,IAAI;AAAA,QACJ;AAAA,QACA,uBAAuB,iBAAiB;AAAA,QACxC,eAAe,OAAO,QAAQ,YAAY;AACrC,cAAA,CAAE,MAAM,KAAK,aAAa,UAAU,UAAU,IAAIA,iCAAmB,UAAU,MAAM,GAAI;AACtF,kBAAA,IAAIC,aAAAA,eAAe,WAAW,WAAW;AAAA,UAAA;AAAA,QAChD;AAAA,MAEF;AACA,YAAM,UAAU,KAAK;AAEf,YAAA,MAAM,WAAW,MAAM,QAAQ;AAAA,QACpC,SAAS,IAAI;AAAA,QACb,UAAU,IAAI;AAAA,QACd,eAAe,MAAM;AAAA,MAAA,CACrB,CAAC;AACF,aAAO,MAAM,wBAAwB;AAAA,IACtC;AAAA,EAAA;AAEF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsApiMiddlewareFactory.js","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsApiMiddlewareFactory.ts"],"sourcesContent":["import { HttpController } from '@contember/engine-http'\nimport { ActionsGraphQLHandler } from './ActionsGraphQLHandlerFactory'\nimport { ActionsContext } from '../resolvers/ActionsContext'\nimport { ActionsContextResolver } from './ActionsContextResolver'\nimport { AuthorizationScope, Authorizator } from '@contember/authorization'\nimport { Identity } from '../../authorization'\nimport { ForbiddenError } from '@contember/graphql-utils'\n\nexport class ActionsApiMiddlewareFactory {\n\tconstructor(\n\t\tprivate readonly actionsContextResolver: ActionsContextResolver,\n\t\tprivate readonly actionsGraphQLHandler: ActionsGraphQLHandler,\n\t\tprivate readonly authorizator: Authorizator<Identity>,\n\t) {\n\t}\n\n\tcreate(): HttpController {\n\t\treturn async ctx => {\n\t\t\tconst { timer, logger, koa } = ctx\n\t\t\tconst { projectContainer, identity } = await this.actionsContextResolver.resolve(ctx)\n\n\t\t\tconst systemDatabase = projectContainer.systemDatabaseContext\n\n\t\t\tlogger.debug('Actions query processing started')\n\t\t\tconst graphqlContext: ActionsContext = {\n\t\t\t\tdb: systemDatabase,\n\t\t\t\tlogger,\n\t\t\t\tcontentSchemaResolver: projectContainer.contentSchemaResolver,\n\t\t\t\trequireAccess: async (action, message) => {\n\t\t\t\t\tif (!(await this.authorizator.isAllowed(identity, new AuthorizationScope.Global(), action))) {\n\t\t\t\t\t\tthrow new ForbiddenError(message || 'Forbidden')\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}\n\t\t\tconst handler = this.actionsGraphQLHandler\n\n\t\t\tawait timer('GraphQL', () => handler({\n\t\t\t\trequest: koa.request,\n\t\t\t\tresponse: koa.response,\n\t\t\t\tcreateContext: () => graphqlContext,\n\t\t\t}))\n\t\t\tlogger.debug('Actions query finished')\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;AAQO,MAAM,4BAA4B;AAAA,EACxC,YACkB,wBACA,uBACA,cAChB;AAHgB,SAAA,yBAAA;AACA,SAAA,wBAAA;AACA,SAAA,eAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"ActionsApiMiddlewareFactory.js","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsApiMiddlewareFactory.ts"],"sourcesContent":["import { HttpController } from '@contember/engine-http'\nimport { ActionsGraphQLHandler } from './ActionsGraphQLHandlerFactory'\nimport { ActionsContext } from '../resolvers/ActionsContext'\nimport { ActionsContextResolver } from './ActionsContextResolver'\nimport { AuthorizationScope, Authorizator } from '@contember/authorization'\nimport { Identity } from '../../authorization'\nimport { ForbiddenError } from '@contember/graphql-utils'\n\nexport class ActionsApiMiddlewareFactory {\n\tconstructor(\n\t\tprivate readonly actionsContextResolver: ActionsContextResolver,\n\t\tprivate readonly actionsGraphQLHandler: ActionsGraphQLHandler,\n\t\tprivate readonly authorizator: Authorizator<Identity>,\n\t) {\n\t}\n\n\tcreate(): HttpController {\n\t\treturn async ctx => {\n\t\t\tconst { timer, logger, koa } = ctx\n\t\t\tconst { projectContainer, identity } = await this.actionsContextResolver.resolve(ctx)\n\n\t\t\tconst systemDatabase = projectContainer.systemDatabaseContext\n\n\t\t\tlogger.debug('Actions query processing started')\n\t\t\tconst graphqlContext: ActionsContext = {\n\t\t\t\tdb: systemDatabase,\n\t\t\t\tlogger,\n\t\t\t\tcontentSchemaResolver: projectContainer.contentSchemaResolver,\n\t\t\t\trequireAccess: async (action, message) => {\n\t\t\t\t\tif (!(await this.authorizator.isAllowed(identity, new AuthorizationScope.Global(), action))) {\n\t\t\t\t\t\tthrow new ForbiddenError(message || 'Forbidden')\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}\n\t\t\tconst handler = this.actionsGraphQLHandler\n\n\t\t\tawait timer('GraphQL', () => handler({\n\t\t\t\trequest: koa.request,\n\t\t\t\tresponse: koa.response,\n\t\t\t\tcreateContext: () => graphqlContext,\n\t\t\t}))\n\t\t\tlogger.debug('Actions query finished')\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;AAQO,MAAM,4BAA4B;AAAA,EACxC,YACkB,wBACA,uBACA,cAChB;AAHgB,SAAA,yBAAA;AACA,SAAA,wBAAA;AACA,SAAA,eAAA;AAAA,EAAA;AAAA,EAIlB,SAAyB;AACxB,WAAO,OAAM,QAAO;AACnB,YAAM,EAAE,OAAO,QAAQ,IAAQ,IAAA;AACzB,YAAA,EAAE,kBAAkB,SAAS,IAAI,MAAM,KAAK,uBAAuB,QAAQ,GAAG;AAEpF,YAAM,iBAAiB,iBAAiB;AAExC,aAAO,MAAM,kCAAkC;AAC/C,YAAM,iBAAiC;AAAA,QACtC,IAAI;AAAA,QACJ;AAAA,QACA,uBAAuB,iBAAiB;AAAA,QACxC,eAAe,OAAO,QAAQ,YAAY;AACrC,cAAA,CAAE,MAAM,KAAK,aAAa,UAAU,UAAU,IAAI,mBAAmB,UAAU,MAAM,GAAI;AACtF,kBAAA,IAAI,eAAe,WAAW,WAAW;AAAA,UAAA;AAAA,QAChD;AAAA,MAEF;AACA,YAAM,UAAU,KAAK;AAEf,YAAA,MAAM,WAAW,MAAM,QAAQ;AAAA,QACpC,SAAS,IAAI;AAAA,QACb,UAAU,IAAI;AAAA,QACd,eAAe,MAAM;AAAA,MAAA,CACrB,CAAC;AACF,aAAO,MAAM,wBAAwB;AAAA,IACtC;AAAA,EAAA;AAEF;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsContextResolver.cjs","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsContextResolver.ts"],"sourcesContent":["import { ApplicationContext, HttpErrorResponse, ProjectConfig, ProjectContainer, ProjectContextResolver } from '@contember/engine-http'\nimport { Identity } from '../../authorization'\n\nexport interface ActionsContext {\n\tprojectContainer: ProjectContainer\n\tproject: ProjectConfig\n\tidentity: Identity\n}\n\nexport class ActionsContextResolver {\n\tconstructor(\n\t\tprivate readonly debug: boolean,\n\t\tprivate readonly projectContextResolver: ProjectContextResolver,\n\t) {\n\t}\n\n\tasync resolve(ctx: ApplicationContext): Promise<ActionsContext> {\n\t\tconst { timer, projectGroup: { tenantContainer }, logger, authResult } = ctx\n\t\tconst projectContext = await this.projectContextResolver.resolve(ctx)\n\t\tconst { project } = projectContext\n\t\tif (!authResult) {\n\t\t\tthrow new HttpErrorResponse(401, 'Authentication required')\n\t\t}\n\t\tconst memberships = await timer('MembershipFetch', () =>\n\t\t\ttenantContainer.projectMemberManager.getEffectiveProjectMemberships(\n\t\t\t\ttenantContainer.databaseContext,\n\t\t\t\t{ slug: project.slug },\n\t\t\t\t{\n\t\t\t\t\tid: authResult.identityId,\n\t\t\t\t\troles: authResult.roles,\n\t\t\t\t},\n\t\t\t),\n\t\t)\n\t\tlogger.debug('Memberships fetched', { memberships })\n\n\t\tif (memberships.length === 0) {\n\t\t\tthrow this.debug\n\t\t\t\t? new HttpErrorResponse(404, `You are not allowed to access project ${project.slug}`)\n\t\t\t\t: new HttpErrorResponse(404, `Project ${project.slug} NOT found`)\n\t\t}\n\t\tconst roles = memberships.map(it => it.role)\n\t\treturn {\n\t\t\t...projectContext,\n\t\t\tidentity: { id: authResult.identityId, roles },\n\t\t}\n\t}\n}\n"],"names":["HttpErrorResponse"],"mappings":";;;AASO,MAAM,uBAAuB;AAAA,EACnC,YACkB,OACA,wBAChB;AAFgB,SAAA,QAAA;AACA,SAAA,yBAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"ActionsContextResolver.cjs","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsContextResolver.ts"],"sourcesContent":["import { ApplicationContext, HttpErrorResponse, ProjectConfig, ProjectContainer, ProjectContextResolver } from '@contember/engine-http'\nimport { Identity } from '../../authorization'\n\nexport interface ActionsContext {\n\tprojectContainer: ProjectContainer\n\tproject: ProjectConfig\n\tidentity: Identity\n}\n\nexport class ActionsContextResolver {\n\tconstructor(\n\t\tprivate readonly debug: boolean,\n\t\tprivate readonly projectContextResolver: ProjectContextResolver,\n\t) {\n\t}\n\n\tasync resolve(ctx: ApplicationContext): Promise<ActionsContext> {\n\t\tconst { timer, projectGroup: { tenantContainer }, logger, authResult } = ctx\n\t\tconst projectContext = await this.projectContextResolver.resolve(ctx)\n\t\tconst { project } = projectContext\n\t\tif (!authResult) {\n\t\t\tthrow new HttpErrorResponse(401, 'Authentication required')\n\t\t}\n\t\tconst memberships = await timer('MembershipFetch', () =>\n\t\t\ttenantContainer.projectMemberManager.getEffectiveProjectMemberships(\n\t\t\t\ttenantContainer.databaseContext,\n\t\t\t\t{ slug: project.slug },\n\t\t\t\t{\n\t\t\t\t\tid: authResult.identityId,\n\t\t\t\t\troles: authResult.roles,\n\t\t\t\t},\n\t\t\t),\n\t\t)\n\t\tlogger.debug('Memberships fetched', { memberships })\n\n\t\tif (memberships.length === 0) {\n\t\t\tthrow this.debug\n\t\t\t\t? new HttpErrorResponse(404, `You are not allowed to access project ${project.slug}`)\n\t\t\t\t: new HttpErrorResponse(404, `Project ${project.slug} NOT found`)\n\t\t}\n\t\tconst roles = memberships.map(it => it.role)\n\t\treturn {\n\t\t\t...projectContext,\n\t\t\tidentity: { id: authResult.identityId, roles },\n\t\t}\n\t}\n}\n"],"names":["HttpErrorResponse"],"mappings":";;;AASO,MAAM,uBAAuB;AAAA,EACnC,YACkB,OACA,wBAChB;AAFgB,SAAA,QAAA;AACA,SAAA,yBAAA;AAAA,EAAA;AAAA,EAIlB,MAAM,QAAQ,KAAkD;AACzD,UAAA,EAAE,OAAO,cAAc,EAAE,mBAAmB,QAAQ,eAAe;AACzE,UAAM,iBAAiB,MAAM,KAAK,uBAAuB,QAAQ,GAAG;AAC9D,UAAA,EAAE,YAAY;AACpB,QAAI,CAAC,YAAY;AACV,YAAA,IAAIA,WAAAA,kBAAkB,KAAK,yBAAyB;AAAA,IAAA;AAE3D,UAAM,cAAc,MAAM;AAAA,MAAM;AAAA,MAAmB,MAClD,gBAAgB,qBAAqB;AAAA,QACpC,gBAAgB;AAAA,QAChB,EAAE,MAAM,QAAQ,KAAK;AAAA,QACrB;AAAA,UACC,IAAI,WAAW;AAAA,UACf,OAAO,WAAW;AAAA,QAAA;AAAA,MACnB;AAAA,IAEF;AACA,WAAO,MAAM,uBAAuB,EAAE,YAAA,CAAa;AAE/C,QAAA,YAAY,WAAW,GAAG;AAC7B,YAAM,KAAK,QACR,IAAIA,WAAAA,kBAAkB,KAAK,yCAAyC,QAAQ,IAAI,EAAE,IAClF,IAAIA,WAAkB,kBAAA,KAAK,WAAW,QAAQ,IAAI,YAAY;AAAA,IAAA;AAElE,UAAM,QAAQ,YAAY,IAAI,CAAA,OAAM,GAAG,IAAI;AACpC,WAAA;AAAA,MACN,GAAG;AAAA,MACH,UAAU,EAAE,IAAI,WAAW,YAAY,MAAM;AAAA,IAC9C;AAAA,EAAA;AAEF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsContextResolver.js","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsContextResolver.ts"],"sourcesContent":["import { ApplicationContext, HttpErrorResponse, ProjectConfig, ProjectContainer, ProjectContextResolver } from '@contember/engine-http'\nimport { Identity } from '../../authorization'\n\nexport interface ActionsContext {\n\tprojectContainer: ProjectContainer\n\tproject: ProjectConfig\n\tidentity: Identity\n}\n\nexport class ActionsContextResolver {\n\tconstructor(\n\t\tprivate readonly debug: boolean,\n\t\tprivate readonly projectContextResolver: ProjectContextResolver,\n\t) {\n\t}\n\n\tasync resolve(ctx: ApplicationContext): Promise<ActionsContext> {\n\t\tconst { timer, projectGroup: { tenantContainer }, logger, authResult } = ctx\n\t\tconst projectContext = await this.projectContextResolver.resolve(ctx)\n\t\tconst { project } = projectContext\n\t\tif (!authResult) {\n\t\t\tthrow new HttpErrorResponse(401, 'Authentication required')\n\t\t}\n\t\tconst memberships = await timer('MembershipFetch', () =>\n\t\t\ttenantContainer.projectMemberManager.getEffectiveProjectMemberships(\n\t\t\t\ttenantContainer.databaseContext,\n\t\t\t\t{ slug: project.slug },\n\t\t\t\t{\n\t\t\t\t\tid: authResult.identityId,\n\t\t\t\t\troles: authResult.roles,\n\t\t\t\t},\n\t\t\t),\n\t\t)\n\t\tlogger.debug('Memberships fetched', { memberships })\n\n\t\tif (memberships.length === 0) {\n\t\t\tthrow this.debug\n\t\t\t\t? new HttpErrorResponse(404, `You are not allowed to access project ${project.slug}`)\n\t\t\t\t: new HttpErrorResponse(404, `Project ${project.slug} NOT found`)\n\t\t}\n\t\tconst roles = memberships.map(it => it.role)\n\t\treturn {\n\t\t\t...projectContext,\n\t\t\tidentity: { id: authResult.identityId, roles },\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";AASO,MAAM,uBAAuB;AAAA,EACnC,YACkB,OACA,wBAChB;AAFgB,SAAA,QAAA;AACA,SAAA,yBAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"ActionsContextResolver.js","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsContextResolver.ts"],"sourcesContent":["import { ApplicationContext, HttpErrorResponse, ProjectConfig, ProjectContainer, ProjectContextResolver } from '@contember/engine-http'\nimport { Identity } from '../../authorization'\n\nexport interface ActionsContext {\n\tprojectContainer: ProjectContainer\n\tproject: ProjectConfig\n\tidentity: Identity\n}\n\nexport class ActionsContextResolver {\n\tconstructor(\n\t\tprivate readonly debug: boolean,\n\t\tprivate readonly projectContextResolver: ProjectContextResolver,\n\t) {\n\t}\n\n\tasync resolve(ctx: ApplicationContext): Promise<ActionsContext> {\n\t\tconst { timer, projectGroup: { tenantContainer }, logger, authResult } = ctx\n\t\tconst projectContext = await this.projectContextResolver.resolve(ctx)\n\t\tconst { project } = projectContext\n\t\tif (!authResult) {\n\t\t\tthrow new HttpErrorResponse(401, 'Authentication required')\n\t\t}\n\t\tconst memberships = await timer('MembershipFetch', () =>\n\t\t\ttenantContainer.projectMemberManager.getEffectiveProjectMemberships(\n\t\t\t\ttenantContainer.databaseContext,\n\t\t\t\t{ slug: project.slug },\n\t\t\t\t{\n\t\t\t\t\tid: authResult.identityId,\n\t\t\t\t\troles: authResult.roles,\n\t\t\t\t},\n\t\t\t),\n\t\t)\n\t\tlogger.debug('Memberships fetched', { memberships })\n\n\t\tif (memberships.length === 0) {\n\t\t\tthrow this.debug\n\t\t\t\t? new HttpErrorResponse(404, `You are not allowed to access project ${project.slug}`)\n\t\t\t\t: new HttpErrorResponse(404, `Project ${project.slug} NOT found`)\n\t\t}\n\t\tconst roles = memberships.map(it => it.role)\n\t\treturn {\n\t\t\t...projectContext,\n\t\t\tidentity: { id: authResult.identityId, roles },\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";AASO,MAAM,uBAAuB;AAAA,EACnC,YACkB,OACA,wBAChB;AAFgB,SAAA,QAAA;AACA,SAAA,yBAAA;AAAA,EAAA;AAAA,EAIlB,MAAM,QAAQ,KAAkD;AACzD,UAAA,EAAE,OAAO,cAAc,EAAE,mBAAmB,QAAQ,eAAe;AACzE,UAAM,iBAAiB,MAAM,KAAK,uBAAuB,QAAQ,GAAG;AAC9D,UAAA,EAAE,YAAY;AACpB,QAAI,CAAC,YAAY;AACV,YAAA,IAAI,kBAAkB,KAAK,yBAAyB;AAAA,IAAA;AAE3D,UAAM,cAAc,MAAM;AAAA,MAAM;AAAA,MAAmB,MAClD,gBAAgB,qBAAqB;AAAA,QACpC,gBAAgB;AAAA,QAChB,EAAE,MAAM,QAAQ,KAAK;AAAA,QACrB;AAAA,UACC,IAAI,WAAW;AAAA,UACf,OAAO,WAAW;AAAA,QAAA;AAAA,MACnB;AAAA,IAEF;AACA,WAAO,MAAM,uBAAuB,EAAE,YAAA,CAAa;AAE/C,QAAA,YAAY,WAAW,GAAG;AAC7B,YAAM,KAAK,QACR,IAAI,kBAAkB,KAAK,yCAAyC,QAAQ,IAAI,EAAE,IAClF,IAAI,kBAAkB,KAAK,WAAW,QAAQ,IAAI,YAAY;AAAA,IAAA;AAElE,UAAM,QAAQ,YAAY,IAAI,CAAA,OAAM,GAAG,IAAI;AACpC,WAAA;AAAA,MACN,GAAG;AAAA,MACH,UAAU,EAAE,IAAI,WAAW,YAAY,MAAM;AAAA,IAC9C;AAAA,EAAA;AAEF;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsGraphQLHandlerFactory.cjs","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsGraphQLHandlerFactory.ts"],"sourcesContent":["import { makeExecutableSchema } from '@graphql-tools/schema'\nimport { createGraphQLQueryHandler, GraphQLQueryHandler } from '@contember/engine-http'\nimport { ResolversFactory } from '../resolvers/ResolversFactory'\nimport { schema as graphqlDocument } from '../schema/actions.graphql'\nimport { ActionsContext } from '../resolvers/ActionsContext'\n\n\nexport type ActionsGraphQLHandler = GraphQLQueryHandler<ActionsContext>\n\nexport class ActionsGraphQLHandlerFactory {\n\tcreate(resolversFactory: ResolversFactory): ActionsGraphQLHandler {\n\t\tconst resolvers = resolversFactory.create()\n\t\tconst schema = makeExecutableSchema({\n\t\t\ttypeDefs: graphqlDocument,\n\t\t\tresolvers,\n\t\t})\n\n\t\treturn createGraphQLQueryHandler<ActionsContext>({\n\t\t\tschema,\n\t\t\tlisteners: [],\n\t\t})\n\t}\n}\n"],"names":["schema","makeExecutableSchema","graphqlDocument","createGraphQLQueryHandler"],"mappings":";;;;;AASO,MAAM,6BAA6B;AAAA,EACzC,OAAO,kBAA2D;AAC3D,UAAA,YAAY,iBAAiB;
|
|
1
|
+
{"version":3,"file":"ActionsGraphQLHandlerFactory.cjs","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsGraphQLHandlerFactory.ts"],"sourcesContent":["import { makeExecutableSchema } from '@graphql-tools/schema'\nimport { createGraphQLQueryHandler, GraphQLQueryHandler } from '@contember/engine-http'\nimport { ResolversFactory } from '../resolvers/ResolversFactory'\nimport { schema as graphqlDocument } from '../schema/actions.graphql'\nimport { ActionsContext } from '../resolvers/ActionsContext'\n\n\nexport type ActionsGraphQLHandler = GraphQLQueryHandler<ActionsContext>\n\nexport class ActionsGraphQLHandlerFactory {\n\tcreate(resolversFactory: ResolversFactory): ActionsGraphQLHandler {\n\t\tconst resolvers = resolversFactory.create()\n\t\tconst schema = makeExecutableSchema({\n\t\t\ttypeDefs: graphqlDocument,\n\t\t\tresolvers,\n\t\t})\n\n\t\treturn createGraphQLQueryHandler<ActionsContext>({\n\t\t\tschema,\n\t\t\tlisteners: [],\n\t\t})\n\t}\n}\n"],"names":["schema","makeExecutableSchema","graphqlDocument","createGraphQLQueryHandler"],"mappings":";;;;;AASO,MAAM,6BAA6B;AAAA,EACzC,OAAO,kBAA2D;AAC3D,UAAA,YAAY,iBAAiB,OAAO;AAC1C,UAAMA,WAASC,OAAAA,qBAAqB;AAAA,MACnC,UAAUC,gBAAA;AAAA,MACV;AAAA,IAAA,CACA;AAED,WAAOC,qCAA0C;AAAA,MAAA,QAChDH;AAAAA,MACA,WAAW,CAAA;AAAA,IAAC,CACZ;AAAA,EAAA;AAEH;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsGraphQLHandlerFactory.js","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsGraphQLHandlerFactory.ts"],"sourcesContent":["import { makeExecutableSchema } from '@graphql-tools/schema'\nimport { createGraphQLQueryHandler, GraphQLQueryHandler } from '@contember/engine-http'\nimport { ResolversFactory } from '../resolvers/ResolversFactory'\nimport { schema as graphqlDocument } from '../schema/actions.graphql'\nimport { ActionsContext } from '../resolvers/ActionsContext'\n\n\nexport type ActionsGraphQLHandler = GraphQLQueryHandler<ActionsContext>\n\nexport class ActionsGraphQLHandlerFactory {\n\tcreate(resolversFactory: ResolversFactory): ActionsGraphQLHandler {\n\t\tconst resolvers = resolversFactory.create()\n\t\tconst schema = makeExecutableSchema({\n\t\t\ttypeDefs: graphqlDocument,\n\t\t\tresolvers,\n\t\t})\n\n\t\treturn createGraphQLQueryHandler<ActionsContext>({\n\t\t\tschema,\n\t\t\tlisteners: [],\n\t\t})\n\t}\n}\n"],"names":["schema","graphqlDocument"],"mappings":";;;AASO,MAAM,6BAA6B;AAAA,EACzC,OAAO,kBAA2D;AAC3D,UAAA,YAAY,iBAAiB;
|
|
1
|
+
{"version":3,"file":"ActionsGraphQLHandlerFactory.js","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsGraphQLHandlerFactory.ts"],"sourcesContent":["import { makeExecutableSchema } from '@graphql-tools/schema'\nimport { createGraphQLQueryHandler, GraphQLQueryHandler } from '@contember/engine-http'\nimport { ResolversFactory } from '../resolvers/ResolversFactory'\nimport { schema as graphqlDocument } from '../schema/actions.graphql'\nimport { ActionsContext } from '../resolvers/ActionsContext'\n\n\nexport type ActionsGraphQLHandler = GraphQLQueryHandler<ActionsContext>\n\nexport class ActionsGraphQLHandlerFactory {\n\tcreate(resolversFactory: ResolversFactory): ActionsGraphQLHandler {\n\t\tconst resolvers = resolversFactory.create()\n\t\tconst schema = makeExecutableSchema({\n\t\t\ttypeDefs: graphqlDocument,\n\t\t\tresolvers,\n\t\t})\n\n\t\treturn createGraphQLQueryHandler<ActionsContext>({\n\t\t\tschema,\n\t\t\tlisteners: [],\n\t\t})\n\t}\n}\n"],"names":["schema","graphqlDocument"],"mappings":";;;AASO,MAAM,6BAA6B;AAAA,EACzC,OAAO,kBAA2D;AAC3D,UAAA,YAAY,iBAAiB,OAAO;AAC1C,UAAMA,WAAS,qBAAqB;AAAA,MACnC,UAAUC;AAAAA,MACV;AAAA,IAAA,CACA;AAED,WAAO,0BAA0C;AAAA,MAAA,QAChDD;AAAAA,MACA,WAAW,CAAA;AAAA,IAAC,CACZ;AAAA,EAAA;AAEH;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsWebsocketControllerFactory.cjs","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsWebsocketControllerFactory.ts"],"sourcesContent":["import { HttpErrorResponse, WebSocketController } from '@contember/engine-http'\nimport { ActionsContextResolver } from './ActionsContextResolver'\nimport { DispatchWorkerSupervisorFactory } from '../../dispatch/DispatchWorkerSupervisor'\nimport * as Typesafe from '@contember/typesafe'\nimport { TenantRole } from '@contember/engine-tenant-api'\nimport { Running } from '@contember/engine-common'\n\nconst IncomingMessage = Typesafe.discriminatedUnion(\n\t'type',\n\t{\n\t\tstartWorker: Typesafe.object({}),\n\t\tstopAllWorkers: Typesafe.object({}),\n\t},\n)\ntype IncomingMessage = ReturnType<typeof IncomingMessage>\nconst OutgoingMessage = Typesafe.discriminatedUnion(\n\t'type',\n\t{\n\t\terror: Typesafe.object({\n\t\t\tmessage: Typesafe.string,\n\t\t}),\n\t\tmessage: Typesafe.object({\n\t\t\tmessage: Typesafe.string,\n\t\t}),\n\t\tready: Typesafe.object({}),\n\n\t\tworkerStarted: Typesafe.object({\n\t\t\tworkerId: Typesafe.string,\n\t\t}),\n\t\tworkedStopped: Typesafe.object({\n\t\t\tworkerId: Typesafe.string,\n\t\t}),\n\t\tworkerFailedToStart: Typesafe.object({\n\t\t\tworkerId: Typesafe.string,\n\t\t}),\n\t\tworkerCrashed: Typesafe.object({\n\t\t\tworkerId: Typesafe.string,\n\t\t}),\n\t},\n)\n\ntype OutgoingMessage = ReturnType<typeof OutgoingMessage>\n\nexport class ActionsWebsocketControllerFactory {\n\tconstructor(\n\t\tprivate readonly debug: boolean,\n\t\tprivate readonly actionsContextResolver: ActionsContextResolver,\n\t\tprivate readonly dispatchWorkerSupervisorFactory: DispatchWorkerSupervisorFactory,\n\t) {\n\t}\n\n\tcreate(): WebSocketController {\n\t\treturn async ctx => {\n\t\t\tconst { ws, logger, authResult, projectGroup } = ctx\n\t\t\tif (!authResult) {\n\t\t\t\tthrow new HttpErrorResponse(401, 'Authentication required')\n\t\t\t}\n\t\t\tif (!authResult.roles.some(it => it === TenantRole.SUPER_ADMIN || it === TenantRole.PROJECT_ADMIN)) {\n\t\t\t\tthrow new HttpErrorResponse(403, 'Not allowed to run actions worker')\n\t\t\t}\n\n\t\t\tconst send = (message: OutgoingMessage) => {\n\t\t\t\tif (this.debug) {\n\t\t\t\t\tOutgoingMessage(message)\n\t\t\t\t}\n\t\t\t\tws.send(JSON.stringify(message))\n\t\t\t}\n\n\t\t\tlet workers: { id: string; running: Promise<Running> }[] = []\n\t\t\tconst abortListener = async () => {\n\t\t\t\tsend({ type: 'message', message: 'shutting down' })\n\t\t\t\tawait stopAll()\n\t\t\t\tsend({ type: 'message', message: 'closing connection' })\n\t\t\t\tws.close(1012) // Service Restart\n\t\t\t}\n\t\t\tctx.abortSignal.addEventListener('abort', abortListener)\n\n\t\t\tconst stopAll = async () => {\n\t\t\t\tconst currentWorkers = workers.map(async it => {\n\t\t\t\t\tawait (await it.running).end()\n\t\t\t\t\tsend({\n\t\t\t\t\t\ttype: 'workedStopped',\n\t\t\t\t\t\tworkerId: it.id,\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\tworkers = []\n\t\t\t\tawait Promise.all(currentWorkers)\n\t\t\t}\n\t\t\tsend({ type: 'ready' })\n\n\t\t\tws.addEventListener('message', async message => {\n\t\t\t\tlet json\n\t\t\t\ttry {\n\t\t\t\t\tjson = JSON.parse(message.data.toString())\n\t\t\t\t} catch {\n\t\t\t\t\tsend({ type: 'error', message: 'Invalid JSON' })\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tlet data: IncomingMessage\n\t\t\t\ttry {\n\t\t\t\t\tdata = IncomingMessage(json)\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (e instanceof Typesafe.ParseError) {\n\t\t\t\t\t\tsend({ type: 'error', message: e.message })\n\t\t\t\t\t\treturn\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow e\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tswitch (data.type) {\n\t\t\t\t\tcase 'startWorker':\n\t\t\t\t\t\tconst workerId = Math.random().toString().substring(2)\n\t\t\t\t\t\tconst dispatchSupervisor = this.dispatchWorkerSupervisorFactory.create(projectGroup)\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst running = dispatchSupervisor.run({ logger, onError: () => {\n\t\t\t\t\t\t\t\tsend({ type: 'workerCrashed', workerId })\n\t\t\t\t\t\t\t} })\n\t\t\t\t\t\t\tworkers.push({ id: workerId, running })\n\t\t\t\t\t\t\tawait running\n\t\t\t\t\t\t\tsend({ type: 'workerStarted', workerId })\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tlogger.error(e, { message: 'Worker failed to start' })\n\t\t\t\t\t\t\tsend({ type: 'workerFailedToStart', workerId })\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'stopAllWorkers':\n\t\t\t\t\t\tsend({ type: 'message', message: 'stopping' })\n\t\t\t\t\t\tawait stopAll()\n\t\t\t\t\t\tsend({ type: 'message', message: 'all stopped' })\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tconst pingHandle = setInterval(() => {\n\t\t\t\tws.ping()\n\t\t\t}, 5000)\n\n\t\t\tws.addEventListener('close', async () => {\n\t\t\t\tctx.abortSignal.removeEventListener('abort', abortListener)\n\t\t\t\tclearInterval(pingHandle)\n\t\t\t\tawait stopAll()\n\t\t\t})\n\t\t}\n\t}\n}\n\n"],"names":["Typesafe","HttpErrorResponse","TenantRole"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAOA,MAAM,kBAAkBA,oBAAS;AAAA,EAChC;AAAA,EACA;AAAA,IACC,aAAaA,oBAAS,OAAO,EAAE;AAAA,IAC/B,gBAAgBA,oBAAS,OAAO,
|
|
1
|
+
{"version":3,"file":"ActionsWebsocketControllerFactory.cjs","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsWebsocketControllerFactory.ts"],"sourcesContent":["import { HttpErrorResponse, WebSocketController } from '@contember/engine-http'\nimport { ActionsContextResolver } from './ActionsContextResolver'\nimport { DispatchWorkerSupervisorFactory } from '../../dispatch/DispatchWorkerSupervisor'\nimport * as Typesafe from '@contember/typesafe'\nimport { TenantRole } from '@contember/engine-tenant-api'\nimport { Running } from '@contember/engine-common'\n\nconst IncomingMessage = Typesafe.discriminatedUnion(\n\t'type',\n\t{\n\t\tstartWorker: Typesafe.object({}),\n\t\tstopAllWorkers: Typesafe.object({}),\n\t},\n)\ntype IncomingMessage = ReturnType<typeof IncomingMessage>\nconst OutgoingMessage = Typesafe.discriminatedUnion(\n\t'type',\n\t{\n\t\terror: Typesafe.object({\n\t\t\tmessage: Typesafe.string,\n\t\t}),\n\t\tmessage: Typesafe.object({\n\t\t\tmessage: Typesafe.string,\n\t\t}),\n\t\tready: Typesafe.object({}),\n\n\t\tworkerStarted: Typesafe.object({\n\t\t\tworkerId: Typesafe.string,\n\t\t}),\n\t\tworkedStopped: Typesafe.object({\n\t\t\tworkerId: Typesafe.string,\n\t\t}),\n\t\tworkerFailedToStart: Typesafe.object({\n\t\t\tworkerId: Typesafe.string,\n\t\t}),\n\t\tworkerCrashed: Typesafe.object({\n\t\t\tworkerId: Typesafe.string,\n\t\t}),\n\t},\n)\n\ntype OutgoingMessage = ReturnType<typeof OutgoingMessage>\n\nexport class ActionsWebsocketControllerFactory {\n\tconstructor(\n\t\tprivate readonly debug: boolean,\n\t\tprivate readonly actionsContextResolver: ActionsContextResolver,\n\t\tprivate readonly dispatchWorkerSupervisorFactory: DispatchWorkerSupervisorFactory,\n\t) {\n\t}\n\n\tcreate(): WebSocketController {\n\t\treturn async ctx => {\n\t\t\tconst { ws, logger, authResult, projectGroup } = ctx\n\t\t\tif (!authResult) {\n\t\t\t\tthrow new HttpErrorResponse(401, 'Authentication required')\n\t\t\t}\n\t\t\tif (!authResult.roles.some(it => it === TenantRole.SUPER_ADMIN || it === TenantRole.PROJECT_ADMIN)) {\n\t\t\t\tthrow new HttpErrorResponse(403, 'Not allowed to run actions worker')\n\t\t\t}\n\n\t\t\tconst send = (message: OutgoingMessage) => {\n\t\t\t\tif (this.debug) {\n\t\t\t\t\tOutgoingMessage(message)\n\t\t\t\t}\n\t\t\t\tws.send(JSON.stringify(message))\n\t\t\t}\n\n\t\t\tlet workers: { id: string; running: Promise<Running> }[] = []\n\t\t\tconst abortListener = async () => {\n\t\t\t\tsend({ type: 'message', message: 'shutting down' })\n\t\t\t\tawait stopAll()\n\t\t\t\tsend({ type: 'message', message: 'closing connection' })\n\t\t\t\tws.close(1012) // Service Restart\n\t\t\t}\n\t\t\tctx.abortSignal.addEventListener('abort', abortListener)\n\n\t\t\tconst stopAll = async () => {\n\t\t\t\tconst currentWorkers = workers.map(async it => {\n\t\t\t\t\tawait (await it.running).end()\n\t\t\t\t\tsend({\n\t\t\t\t\t\ttype: 'workedStopped',\n\t\t\t\t\t\tworkerId: it.id,\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\tworkers = []\n\t\t\t\tawait Promise.all(currentWorkers)\n\t\t\t}\n\t\t\tsend({ type: 'ready' })\n\n\t\t\tws.addEventListener('message', async message => {\n\t\t\t\tlet json\n\t\t\t\ttry {\n\t\t\t\t\tjson = JSON.parse(message.data.toString())\n\t\t\t\t} catch {\n\t\t\t\t\tsend({ type: 'error', message: 'Invalid JSON' })\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tlet data: IncomingMessage\n\t\t\t\ttry {\n\t\t\t\t\tdata = IncomingMessage(json)\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (e instanceof Typesafe.ParseError) {\n\t\t\t\t\t\tsend({ type: 'error', message: e.message })\n\t\t\t\t\t\treturn\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow e\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tswitch (data.type) {\n\t\t\t\t\tcase 'startWorker':\n\t\t\t\t\t\tconst workerId = Math.random().toString().substring(2)\n\t\t\t\t\t\tconst dispatchSupervisor = this.dispatchWorkerSupervisorFactory.create(projectGroup)\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst running = dispatchSupervisor.run({ logger, onError: () => {\n\t\t\t\t\t\t\t\tsend({ type: 'workerCrashed', workerId })\n\t\t\t\t\t\t\t} })\n\t\t\t\t\t\t\tworkers.push({ id: workerId, running })\n\t\t\t\t\t\t\tawait running\n\t\t\t\t\t\t\tsend({ type: 'workerStarted', workerId })\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tlogger.error(e, { message: 'Worker failed to start' })\n\t\t\t\t\t\t\tsend({ type: 'workerFailedToStart', workerId })\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'stopAllWorkers':\n\t\t\t\t\t\tsend({ type: 'message', message: 'stopping' })\n\t\t\t\t\t\tawait stopAll()\n\t\t\t\t\t\tsend({ type: 'message', message: 'all stopped' })\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tconst pingHandle = setInterval(() => {\n\t\t\t\tws.ping()\n\t\t\t}, 5000)\n\n\t\t\tws.addEventListener('close', async () => {\n\t\t\t\tctx.abortSignal.removeEventListener('abort', abortListener)\n\t\t\t\tclearInterval(pingHandle)\n\t\t\t\tawait stopAll()\n\t\t\t})\n\t\t}\n\t}\n}\n\n"],"names":["Typesafe","HttpErrorResponse","TenantRole"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsWebsocketControllerFactory.js","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsWebsocketControllerFactory.ts"],"sourcesContent":["import { HttpErrorResponse, WebSocketController } from '@contember/engine-http'\nimport { ActionsContextResolver } from './ActionsContextResolver'\nimport { DispatchWorkerSupervisorFactory } from '../../dispatch/DispatchWorkerSupervisor'\nimport * as Typesafe from '@contember/typesafe'\nimport { TenantRole } from '@contember/engine-tenant-api'\nimport { Running } from '@contember/engine-common'\n\nconst IncomingMessage = Typesafe.discriminatedUnion(\n\t'type',\n\t{\n\t\tstartWorker: Typesafe.object({}),\n\t\tstopAllWorkers: Typesafe.object({}),\n\t},\n)\ntype IncomingMessage = ReturnType<typeof IncomingMessage>\nconst OutgoingMessage = Typesafe.discriminatedUnion(\n\t'type',\n\t{\n\t\terror: Typesafe.object({\n\t\t\tmessage: Typesafe.string,\n\t\t}),\n\t\tmessage: Typesafe.object({\n\t\t\tmessage: Typesafe.string,\n\t\t}),\n\t\tready: Typesafe.object({}),\n\n\t\tworkerStarted: Typesafe.object({\n\t\t\tworkerId: Typesafe.string,\n\t\t}),\n\t\tworkedStopped: Typesafe.object({\n\t\t\tworkerId: Typesafe.string,\n\t\t}),\n\t\tworkerFailedToStart: Typesafe.object({\n\t\t\tworkerId: Typesafe.string,\n\t\t}),\n\t\tworkerCrashed: Typesafe.object({\n\t\t\tworkerId: Typesafe.string,\n\t\t}),\n\t},\n)\n\ntype OutgoingMessage = ReturnType<typeof OutgoingMessage>\n\nexport class ActionsWebsocketControllerFactory {\n\tconstructor(\n\t\tprivate readonly debug: boolean,\n\t\tprivate readonly actionsContextResolver: ActionsContextResolver,\n\t\tprivate readonly dispatchWorkerSupervisorFactory: DispatchWorkerSupervisorFactory,\n\t) {\n\t}\n\n\tcreate(): WebSocketController {\n\t\treturn async ctx => {\n\t\t\tconst { ws, logger, authResult, projectGroup } = ctx\n\t\t\tif (!authResult) {\n\t\t\t\tthrow new HttpErrorResponse(401, 'Authentication required')\n\t\t\t}\n\t\t\tif (!authResult.roles.some(it => it === TenantRole.SUPER_ADMIN || it === TenantRole.PROJECT_ADMIN)) {\n\t\t\t\tthrow new HttpErrorResponse(403, 'Not allowed to run actions worker')\n\t\t\t}\n\n\t\t\tconst send = (message: OutgoingMessage) => {\n\t\t\t\tif (this.debug) {\n\t\t\t\t\tOutgoingMessage(message)\n\t\t\t\t}\n\t\t\t\tws.send(JSON.stringify(message))\n\t\t\t}\n\n\t\t\tlet workers: { id: string; running: Promise<Running> }[] = []\n\t\t\tconst abortListener = async () => {\n\t\t\t\tsend({ type: 'message', message: 'shutting down' })\n\t\t\t\tawait stopAll()\n\t\t\t\tsend({ type: 'message', message: 'closing connection' })\n\t\t\t\tws.close(1012) // Service Restart\n\t\t\t}\n\t\t\tctx.abortSignal.addEventListener('abort', abortListener)\n\n\t\t\tconst stopAll = async () => {\n\t\t\t\tconst currentWorkers = workers.map(async it => {\n\t\t\t\t\tawait (await it.running).end()\n\t\t\t\t\tsend({\n\t\t\t\t\t\ttype: 'workedStopped',\n\t\t\t\t\t\tworkerId: it.id,\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\tworkers = []\n\t\t\t\tawait Promise.all(currentWorkers)\n\t\t\t}\n\t\t\tsend({ type: 'ready' })\n\n\t\t\tws.addEventListener('message', async message => {\n\t\t\t\tlet json\n\t\t\t\ttry {\n\t\t\t\t\tjson = JSON.parse(message.data.toString())\n\t\t\t\t} catch {\n\t\t\t\t\tsend({ type: 'error', message: 'Invalid JSON' })\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tlet data: IncomingMessage\n\t\t\t\ttry {\n\t\t\t\t\tdata = IncomingMessage(json)\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (e instanceof Typesafe.ParseError) {\n\t\t\t\t\t\tsend({ type: 'error', message: e.message })\n\t\t\t\t\t\treturn\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow e\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tswitch (data.type) {\n\t\t\t\t\tcase 'startWorker':\n\t\t\t\t\t\tconst workerId = Math.random().toString().substring(2)\n\t\t\t\t\t\tconst dispatchSupervisor = this.dispatchWorkerSupervisorFactory.create(projectGroup)\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst running = dispatchSupervisor.run({ logger, onError: () => {\n\t\t\t\t\t\t\t\tsend({ type: 'workerCrashed', workerId })\n\t\t\t\t\t\t\t} })\n\t\t\t\t\t\t\tworkers.push({ id: workerId, running })\n\t\t\t\t\t\t\tawait running\n\t\t\t\t\t\t\tsend({ type: 'workerStarted', workerId })\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tlogger.error(e, { message: 'Worker failed to start' })\n\t\t\t\t\t\t\tsend({ type: 'workerFailedToStart', workerId })\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'stopAllWorkers':\n\t\t\t\t\t\tsend({ type: 'message', message: 'stopping' })\n\t\t\t\t\t\tawait stopAll()\n\t\t\t\t\t\tsend({ type: 'message', message: 'all stopped' })\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tconst pingHandle = setInterval(() => {\n\t\t\t\tws.ping()\n\t\t\t}, 5000)\n\n\t\t\tws.addEventListener('close', async () => {\n\t\t\t\tctx.abortSignal.removeEventListener('abort', abortListener)\n\t\t\t\tclearInterval(pingHandle)\n\t\t\t\tawait stopAll()\n\t\t\t})\n\t\t}\n\t}\n}\n\n"],"names":[],"mappings":";;;AAOA,MAAM,kBAAkB,SAAS;AAAA,EAChC;AAAA,EACA;AAAA,IACC,aAAa,SAAS,OAAO,EAAE;AAAA,IAC/B,gBAAgB,SAAS,OAAO,
|
|
1
|
+
{"version":3,"file":"ActionsWebsocketControllerFactory.js","sources":["../../../../../../packages/engine-actions/src/graphql/http/ActionsWebsocketControllerFactory.ts"],"sourcesContent":["import { HttpErrorResponse, WebSocketController } from '@contember/engine-http'\nimport { ActionsContextResolver } from './ActionsContextResolver'\nimport { DispatchWorkerSupervisorFactory } from '../../dispatch/DispatchWorkerSupervisor'\nimport * as Typesafe from '@contember/typesafe'\nimport { TenantRole } from '@contember/engine-tenant-api'\nimport { Running } from '@contember/engine-common'\n\nconst IncomingMessage = Typesafe.discriminatedUnion(\n\t'type',\n\t{\n\t\tstartWorker: Typesafe.object({}),\n\t\tstopAllWorkers: Typesafe.object({}),\n\t},\n)\ntype IncomingMessage = ReturnType<typeof IncomingMessage>\nconst OutgoingMessage = Typesafe.discriminatedUnion(\n\t'type',\n\t{\n\t\terror: Typesafe.object({\n\t\t\tmessage: Typesafe.string,\n\t\t}),\n\t\tmessage: Typesafe.object({\n\t\t\tmessage: Typesafe.string,\n\t\t}),\n\t\tready: Typesafe.object({}),\n\n\t\tworkerStarted: Typesafe.object({\n\t\t\tworkerId: Typesafe.string,\n\t\t}),\n\t\tworkedStopped: Typesafe.object({\n\t\t\tworkerId: Typesafe.string,\n\t\t}),\n\t\tworkerFailedToStart: Typesafe.object({\n\t\t\tworkerId: Typesafe.string,\n\t\t}),\n\t\tworkerCrashed: Typesafe.object({\n\t\t\tworkerId: Typesafe.string,\n\t\t}),\n\t},\n)\n\ntype OutgoingMessage = ReturnType<typeof OutgoingMessage>\n\nexport class ActionsWebsocketControllerFactory {\n\tconstructor(\n\t\tprivate readonly debug: boolean,\n\t\tprivate readonly actionsContextResolver: ActionsContextResolver,\n\t\tprivate readonly dispatchWorkerSupervisorFactory: DispatchWorkerSupervisorFactory,\n\t) {\n\t}\n\n\tcreate(): WebSocketController {\n\t\treturn async ctx => {\n\t\t\tconst { ws, logger, authResult, projectGroup } = ctx\n\t\t\tif (!authResult) {\n\t\t\t\tthrow new HttpErrorResponse(401, 'Authentication required')\n\t\t\t}\n\t\t\tif (!authResult.roles.some(it => it === TenantRole.SUPER_ADMIN || it === TenantRole.PROJECT_ADMIN)) {\n\t\t\t\tthrow new HttpErrorResponse(403, 'Not allowed to run actions worker')\n\t\t\t}\n\n\t\t\tconst send = (message: OutgoingMessage) => {\n\t\t\t\tif (this.debug) {\n\t\t\t\t\tOutgoingMessage(message)\n\t\t\t\t}\n\t\t\t\tws.send(JSON.stringify(message))\n\t\t\t}\n\n\t\t\tlet workers: { id: string; running: Promise<Running> }[] = []\n\t\t\tconst abortListener = async () => {\n\t\t\t\tsend({ type: 'message', message: 'shutting down' })\n\t\t\t\tawait stopAll()\n\t\t\t\tsend({ type: 'message', message: 'closing connection' })\n\t\t\t\tws.close(1012) // Service Restart\n\t\t\t}\n\t\t\tctx.abortSignal.addEventListener('abort', abortListener)\n\n\t\t\tconst stopAll = async () => {\n\t\t\t\tconst currentWorkers = workers.map(async it => {\n\t\t\t\t\tawait (await it.running).end()\n\t\t\t\t\tsend({\n\t\t\t\t\t\ttype: 'workedStopped',\n\t\t\t\t\t\tworkerId: it.id,\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\tworkers = []\n\t\t\t\tawait Promise.all(currentWorkers)\n\t\t\t}\n\t\t\tsend({ type: 'ready' })\n\n\t\t\tws.addEventListener('message', async message => {\n\t\t\t\tlet json\n\t\t\t\ttry {\n\t\t\t\t\tjson = JSON.parse(message.data.toString())\n\t\t\t\t} catch {\n\t\t\t\t\tsend({ type: 'error', message: 'Invalid JSON' })\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tlet data: IncomingMessage\n\t\t\t\ttry {\n\t\t\t\t\tdata = IncomingMessage(json)\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (e instanceof Typesafe.ParseError) {\n\t\t\t\t\t\tsend({ type: 'error', message: e.message })\n\t\t\t\t\t\treturn\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow e\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tswitch (data.type) {\n\t\t\t\t\tcase 'startWorker':\n\t\t\t\t\t\tconst workerId = Math.random().toString().substring(2)\n\t\t\t\t\t\tconst dispatchSupervisor = this.dispatchWorkerSupervisorFactory.create(projectGroup)\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst running = dispatchSupervisor.run({ logger, onError: () => {\n\t\t\t\t\t\t\t\tsend({ type: 'workerCrashed', workerId })\n\t\t\t\t\t\t\t} })\n\t\t\t\t\t\t\tworkers.push({ id: workerId, running })\n\t\t\t\t\t\t\tawait running\n\t\t\t\t\t\t\tsend({ type: 'workerStarted', workerId })\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tlogger.error(e, { message: 'Worker failed to start' })\n\t\t\t\t\t\t\tsend({ type: 'workerFailedToStart', workerId })\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'stopAllWorkers':\n\t\t\t\t\t\tsend({ type: 'message', message: 'stopping' })\n\t\t\t\t\t\tawait stopAll()\n\t\t\t\t\t\tsend({ type: 'message', message: 'all stopped' })\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tconst pingHandle = setInterval(() => {\n\t\t\t\tws.ping()\n\t\t\t}, 5000)\n\n\t\t\tws.addEventListener('close', async () => {\n\t\t\t\tctx.abortSignal.removeEventListener('abort', abortListener)\n\t\t\t\tclearInterval(pingHandle)\n\t\t\t\tawait stopAll()\n\t\t\t})\n\t\t}\n\t}\n}\n\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResolversFactory.cjs","sources":["../../../../../../packages/engine-actions/src/graphql/resolvers/ResolversFactory.ts"],"sourcesContent":["import { DateTimeType, JSONType, UuidType } from '@contember/graphql-utils'\nimport { Resolvers } from '../schema'\nimport { EventsQueryResolver } from './query'\nimport { ProcessBatchMutationResolver, SetVariablesMutationResolver } from './mutation'\nimport { ActionsContext } from './ActionsContext'\nimport { VariablesQueryResolver } from './query/VariablesQueryResolver'\n\nexport class ResolversFactory {\n\tconstructor(\n\t\tprivate readonly eventsQueryResolver: EventsQueryResolver,\n\t\tprivate readonly processBatchMutationResolver: ProcessBatchMutationResolver,\n\t\tprivate readonly variablesQueryResolver: VariablesQueryResolver,\n\t\tprivate readonly setVariablesMutationResolver: SetVariablesMutationResolver,\n\t) {\n\t}\n\n\tcreate(): Resolvers {\n\t\tconst resolvers: Resolvers<ActionsContext> & { Mutation: Required<Resolvers<ActionsContext>['Mutation']> } & { Query: Required<Resolvers<ActionsContext>['Query']> } = {\n\t\t\tJson: JSONType,\n\t\t\tDateTime: DateTimeType,\n\t\t\tUuid: UuidType,\n\t\t\tMutation: {\n\t\t\t\tprocessBatch: this.processBatchMutationResolver.processBatch.bind(this.processBatchMutationResolver),\n\t\t\t\tsetVariables: this.setVariablesMutationResolver.setVariables.bind(this.setVariablesMutationResolver),\n\t\t\t},\n\t\t\tQuery: {\n\t\t\t\teventsInProcessing: this.eventsQueryResolver.eventsInProcessing.bind(this.eventsQueryResolver),\n\t\t\t\teventsToProcess: this.eventsQueryResolver.eventsToProcess.bind(this.eventsQueryResolver),\n\t\t\t\tfailedEvents: this.eventsQueryResolver.failedEvents.bind(this.eventsQueryResolver),\n\t\t\t\tvariables: this.variablesQueryResolver.variables.bind(this.variablesQueryResolver),\n\t\t\t},\n\t\t}\n\t\treturn resolvers\n\t}\n}\n"],"names":["JSONType","DateTimeType","UuidType"],"mappings":";;;AAOO,MAAM,iBAAiB;AAAA,EAC7B,YACkB,qBACA,8BACA,wBACA,8BAChB;AAJgB,SAAA,sBAAA;AACA,SAAA,+BAAA;AACA,SAAA,yBAAA;AACA,SAAA,+BAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"ResolversFactory.cjs","sources":["../../../../../../packages/engine-actions/src/graphql/resolvers/ResolversFactory.ts"],"sourcesContent":["import { DateTimeType, JSONType, UuidType } from '@contember/graphql-utils'\nimport { Resolvers } from '../schema'\nimport { EventsQueryResolver } from './query'\nimport { ProcessBatchMutationResolver, SetVariablesMutationResolver } from './mutation'\nimport { ActionsContext } from './ActionsContext'\nimport { VariablesQueryResolver } from './query/VariablesQueryResolver'\n\nexport class ResolversFactory {\n\tconstructor(\n\t\tprivate readonly eventsQueryResolver: EventsQueryResolver,\n\t\tprivate readonly processBatchMutationResolver: ProcessBatchMutationResolver,\n\t\tprivate readonly variablesQueryResolver: VariablesQueryResolver,\n\t\tprivate readonly setVariablesMutationResolver: SetVariablesMutationResolver,\n\t) {\n\t}\n\n\tcreate(): Resolvers {\n\t\tconst resolvers: Resolvers<ActionsContext> & { Mutation: Required<Resolvers<ActionsContext>['Mutation']> } & { Query: Required<Resolvers<ActionsContext>['Query']> } = {\n\t\t\tJson: JSONType,\n\t\t\tDateTime: DateTimeType,\n\t\t\tUuid: UuidType,\n\t\t\tMutation: {\n\t\t\t\tprocessBatch: this.processBatchMutationResolver.processBatch.bind(this.processBatchMutationResolver),\n\t\t\t\tsetVariables: this.setVariablesMutationResolver.setVariables.bind(this.setVariablesMutationResolver),\n\t\t\t},\n\t\t\tQuery: {\n\t\t\t\teventsInProcessing: this.eventsQueryResolver.eventsInProcessing.bind(this.eventsQueryResolver),\n\t\t\t\teventsToProcess: this.eventsQueryResolver.eventsToProcess.bind(this.eventsQueryResolver),\n\t\t\t\tfailedEvents: this.eventsQueryResolver.failedEvents.bind(this.eventsQueryResolver),\n\t\t\t\tvariables: this.variablesQueryResolver.variables.bind(this.variablesQueryResolver),\n\t\t\t},\n\t\t}\n\t\treturn resolvers\n\t}\n}\n"],"names":["JSONType","DateTimeType","UuidType"],"mappings":";;;AAOO,MAAM,iBAAiB;AAAA,EAC7B,YACkB,qBACA,8BACA,wBACA,8BAChB;AAJgB,SAAA,sBAAA;AACA,SAAA,+BAAA;AACA,SAAA,yBAAA;AACA,SAAA,+BAAA;AAAA,EAAA;AAAA,EAIlB,SAAoB;AACnB,UAAM,YAAiK;AAAA,MACtK,MAAMA,aAAA;AAAA,MACN,UAAUC,aAAA;AAAA,MACV,MAAMC,aAAA;AAAA,MACN,UAAU;AAAA,QACT,cAAc,KAAK,6BAA6B,aAAa,KAAK,KAAK,4BAA4B;AAAA,QACnG,cAAc,KAAK,6BAA6B,aAAa,KAAK,KAAK,4BAA4B;AAAA,MACpG;AAAA,MACA,OAAO;AAAA,QACN,oBAAoB,KAAK,oBAAoB,mBAAmB,KAAK,KAAK,mBAAmB;AAAA,QAC7F,iBAAiB,KAAK,oBAAoB,gBAAgB,KAAK,KAAK,mBAAmB;AAAA,QACvF,cAAc,KAAK,oBAAoB,aAAa,KAAK,KAAK,mBAAmB;AAAA,QACjF,WAAW,KAAK,uBAAuB,UAAU,KAAK,KAAK,sBAAsB;AAAA,MAAA;AAAA,IAEnF;AACO,WAAA;AAAA,EAAA;AAET;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResolversFactory.js","sources":["../../../../../../packages/engine-actions/src/graphql/resolvers/ResolversFactory.ts"],"sourcesContent":["import { DateTimeType, JSONType, UuidType } from '@contember/graphql-utils'\nimport { Resolvers } from '../schema'\nimport { EventsQueryResolver } from './query'\nimport { ProcessBatchMutationResolver, SetVariablesMutationResolver } from './mutation'\nimport { ActionsContext } from './ActionsContext'\nimport { VariablesQueryResolver } from './query/VariablesQueryResolver'\n\nexport class ResolversFactory {\n\tconstructor(\n\t\tprivate readonly eventsQueryResolver: EventsQueryResolver,\n\t\tprivate readonly processBatchMutationResolver: ProcessBatchMutationResolver,\n\t\tprivate readonly variablesQueryResolver: VariablesQueryResolver,\n\t\tprivate readonly setVariablesMutationResolver: SetVariablesMutationResolver,\n\t) {\n\t}\n\n\tcreate(): Resolvers {\n\t\tconst resolvers: Resolvers<ActionsContext> & { Mutation: Required<Resolvers<ActionsContext>['Mutation']> } & { Query: Required<Resolvers<ActionsContext>['Query']> } = {\n\t\t\tJson: JSONType,\n\t\t\tDateTime: DateTimeType,\n\t\t\tUuid: UuidType,\n\t\t\tMutation: {\n\t\t\t\tprocessBatch: this.processBatchMutationResolver.processBatch.bind(this.processBatchMutationResolver),\n\t\t\t\tsetVariables: this.setVariablesMutationResolver.setVariables.bind(this.setVariablesMutationResolver),\n\t\t\t},\n\t\t\tQuery: {\n\t\t\t\teventsInProcessing: this.eventsQueryResolver.eventsInProcessing.bind(this.eventsQueryResolver),\n\t\t\t\teventsToProcess: this.eventsQueryResolver.eventsToProcess.bind(this.eventsQueryResolver),\n\t\t\t\tfailedEvents: this.eventsQueryResolver.failedEvents.bind(this.eventsQueryResolver),\n\t\t\t\tvariables: this.variablesQueryResolver.variables.bind(this.variablesQueryResolver),\n\t\t\t},\n\t\t}\n\t\treturn resolvers\n\t}\n}\n"],"names":[],"mappings":";AAOO,MAAM,iBAAiB;AAAA,EAC7B,YACkB,qBACA,8BACA,wBACA,8BAChB;AAJgB,SAAA,sBAAA;AACA,SAAA,+BAAA;AACA,SAAA,yBAAA;AACA,SAAA,+BAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"ResolversFactory.js","sources":["../../../../../../packages/engine-actions/src/graphql/resolvers/ResolversFactory.ts"],"sourcesContent":["import { DateTimeType, JSONType, UuidType } from '@contember/graphql-utils'\nimport { Resolvers } from '../schema'\nimport { EventsQueryResolver } from './query'\nimport { ProcessBatchMutationResolver, SetVariablesMutationResolver } from './mutation'\nimport { ActionsContext } from './ActionsContext'\nimport { VariablesQueryResolver } from './query/VariablesQueryResolver'\n\nexport class ResolversFactory {\n\tconstructor(\n\t\tprivate readonly eventsQueryResolver: EventsQueryResolver,\n\t\tprivate readonly processBatchMutationResolver: ProcessBatchMutationResolver,\n\t\tprivate readonly variablesQueryResolver: VariablesQueryResolver,\n\t\tprivate readonly setVariablesMutationResolver: SetVariablesMutationResolver,\n\t) {\n\t}\n\n\tcreate(): Resolvers {\n\t\tconst resolvers: Resolvers<ActionsContext> & { Mutation: Required<Resolvers<ActionsContext>['Mutation']> } & { Query: Required<Resolvers<ActionsContext>['Query']> } = {\n\t\t\tJson: JSONType,\n\t\t\tDateTime: DateTimeType,\n\t\t\tUuid: UuidType,\n\t\t\tMutation: {\n\t\t\t\tprocessBatch: this.processBatchMutationResolver.processBatch.bind(this.processBatchMutationResolver),\n\t\t\t\tsetVariables: this.setVariablesMutationResolver.setVariables.bind(this.setVariablesMutationResolver),\n\t\t\t},\n\t\t\tQuery: {\n\t\t\t\teventsInProcessing: this.eventsQueryResolver.eventsInProcessing.bind(this.eventsQueryResolver),\n\t\t\t\teventsToProcess: this.eventsQueryResolver.eventsToProcess.bind(this.eventsQueryResolver),\n\t\t\t\tfailedEvents: this.eventsQueryResolver.failedEvents.bind(this.eventsQueryResolver),\n\t\t\t\tvariables: this.variablesQueryResolver.variables.bind(this.variablesQueryResolver),\n\t\t\t},\n\t\t}\n\t\treturn resolvers\n\t}\n}\n"],"names":[],"mappings":";AAOO,MAAM,iBAAiB;AAAA,EAC7B,YACkB,qBACA,8BACA,wBACA,8BAChB;AAJgB,SAAA,sBAAA;AACA,SAAA,+BAAA;AACA,SAAA,yBAAA;AACA,SAAA,+BAAA;AAAA,EAAA;AAAA,EAIlB,SAAoB;AACnB,UAAM,YAAiK;AAAA,MACtK,MAAM;AAAA,MACN,UAAU;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,QACT,cAAc,KAAK,6BAA6B,aAAa,KAAK,KAAK,4BAA4B;AAAA,QACnG,cAAc,KAAK,6BAA6B,aAAa,KAAK,KAAK,4BAA4B;AAAA,MACpG;AAAA,MACA,OAAO;AAAA,QACN,oBAAoB,KAAK,oBAAoB,mBAAmB,KAAK,KAAK,mBAAmB;AAAA,QAC7F,iBAAiB,KAAK,oBAAoB,gBAAgB,KAAK,KAAK,mBAAmB;AAAA,QACvF,cAAc,KAAK,oBAAoB,aAAa,KAAK,KAAK,mBAAmB;AAAA,QACjF,WAAW,KAAK,uBAAuB,UAAU,KAAK,KAAK,sBAAsB;AAAA,MAAA;AAAA,IAEnF;AACO,WAAA;AAAA,EAAA;AAET;"}
|
package/dist/development/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProcessBatchMutationResolver.cjs","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.ts"],"sourcesContent":["import { MutationResolvers } from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { EventDispatcher } from '../../../dispatch/EventDispatcher'\nimport { ActionsAuthorizationActions } from '../../../authorization'\n\nexport class ProcessBatchMutationResolver implements MutationResolvers<ActionsContext> {\n\tconstructor(\n\t\tprivate eventDispatcher: EventDispatcher,\n\t) {\n\t}\n\tasync processBatch(parent: unknown, args: unknown, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_PROCESS)\n\n\t\tawait this.eventDispatcher.processBatch(ctx)\n\t\treturn {\n\t\t\tok: true,\n\t\t}\n\t}\n}\n"],"names":["ActionsAuthorizationActions"],"mappings":";;;;;AAKO,MAAM,6BAA0E;AAAA,EACtF,YACS,iBACP;AADO,SAAA,kBAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"ProcessBatchMutationResolver.cjs","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.ts"],"sourcesContent":["import { MutationResolvers } from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { EventDispatcher } from '../../../dispatch/EventDispatcher'\nimport { ActionsAuthorizationActions } from '../../../authorization'\n\nexport class ProcessBatchMutationResolver implements MutationResolvers<ActionsContext> {\n\tconstructor(\n\t\tprivate eventDispatcher: EventDispatcher,\n\t) {\n\t}\n\tasync processBatch(parent: unknown, args: unknown, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_PROCESS)\n\n\t\tawait this.eventDispatcher.processBatch(ctx)\n\t\treturn {\n\t\t\tok: true,\n\t\t}\n\t}\n}\n"],"names":["ActionsAuthorizationActions"],"mappings":";;;;;AAKO,MAAM,6BAA0E;AAAA,EACtF,YACS,iBACP;AADO,SAAA,kBAAA;AAAA,EAAA;AAAA,EAGT,MAAM,aAAa,QAAiB,MAAe,KAAqB;AACjE,UAAA,IAAI,cAAcA,4BAAA,4BAA4B,cAAc;AAE5D,UAAA,KAAK,gBAAgB,aAAa,GAAG;AACpC,WAAA;AAAA,MACN,IAAI;AAAA,IACL;AAAA,EAAA;AAEF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProcessBatchMutationResolver.js","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.ts"],"sourcesContent":["import { MutationResolvers } from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { EventDispatcher } from '../../../dispatch/EventDispatcher'\nimport { ActionsAuthorizationActions } from '../../../authorization'\n\nexport class ProcessBatchMutationResolver implements MutationResolvers<ActionsContext> {\n\tconstructor(\n\t\tprivate eventDispatcher: EventDispatcher,\n\t) {\n\t}\n\tasync processBatch(parent: unknown, args: unknown, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_PROCESS)\n\n\t\tawait this.eventDispatcher.processBatch(ctx)\n\t\treturn {\n\t\t\tok: true,\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;AAKO,MAAM,6BAA0E;AAAA,EACtF,YACS,iBACP;AADO,SAAA,kBAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"ProcessBatchMutationResolver.js","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.ts"],"sourcesContent":["import { MutationResolvers } from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { EventDispatcher } from '../../../dispatch/EventDispatcher'\nimport { ActionsAuthorizationActions } from '../../../authorization'\n\nexport class ProcessBatchMutationResolver implements MutationResolvers<ActionsContext> {\n\tconstructor(\n\t\tprivate eventDispatcher: EventDispatcher,\n\t) {\n\t}\n\tasync processBatch(parent: unknown, args: unknown, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_PROCESS)\n\n\t\tawait this.eventDispatcher.processBatch(ctx)\n\t\treturn {\n\t\t\tok: true,\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;AAKO,MAAM,6BAA0E;AAAA,EACtF,YACS,iBACP;AADO,SAAA,kBAAA;AAAA,EAAA;AAAA,EAGT,MAAM,aAAa,QAAiB,MAAe,KAAqB;AACjE,UAAA,IAAI,cAAc,4BAA4B,cAAc;AAE5D,UAAA,KAAK,gBAAgB,aAAa,GAAG;AACpC,WAAA;AAAA,MACN,IAAI;AAAA,IACL;AAAA,EAAA;AAEF;"}
|
package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SetVariablesMutationResolver.cjs","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/mutation/SetVariablesMutationResolver.ts"],"sourcesContent":["import { MutationResolvers, MutationSetVariablesArgs } from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { VariablesManager } from '../../../model/VariablesManager'\nimport { ActionsAuthorizationActions } from '../../../authorization'\n\nexport class SetVariablesMutationResolver implements MutationResolvers<ActionsContext> {\n\tconstructor(\n\t\tprivate readonly variablesManager: VariablesManager,\n\t) {\n\t}\n\n\n\tasync setVariables(parent: unknown, { args }: MutationSetVariablesArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.VARIABLES_SET)\n\n\t\tawait this.variablesManager.setVariables(ctx.db, args)\n\n\t\treturn {\n\t\t\tok: true,\n\t\t}\n\t}\n}\n"],"names":["ActionsAuthorizationActions"],"mappings":";;;;;AAKO,MAAM,6BAA0E;AAAA,EACtF,YACkB,kBAChB;AADgB,SAAA,mBAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"SetVariablesMutationResolver.cjs","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/mutation/SetVariablesMutationResolver.ts"],"sourcesContent":["import { MutationResolvers, MutationSetVariablesArgs } from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { VariablesManager } from '../../../model/VariablesManager'\nimport { ActionsAuthorizationActions } from '../../../authorization'\n\nexport class SetVariablesMutationResolver implements MutationResolvers<ActionsContext> {\n\tconstructor(\n\t\tprivate readonly variablesManager: VariablesManager,\n\t) {\n\t}\n\n\n\tasync setVariables(parent: unknown, { args }: MutationSetVariablesArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.VARIABLES_SET)\n\n\t\tawait this.variablesManager.setVariables(ctx.db, args)\n\n\t\treturn {\n\t\t\tok: true,\n\t\t}\n\t}\n}\n"],"names":["ActionsAuthorizationActions"],"mappings":";;;;;AAKO,MAAM,6BAA0E;AAAA,EACtF,YACkB,kBAChB;AADgB,SAAA,mBAAA;AAAA,EAAA;AAAA,EAKlB,MAAM,aAAa,QAAiB,EAAE,KAAA,GAAkC,KAAqB;AACtF,UAAA,IAAI,cAAcA,4BAAA,4BAA4B,aAAa;AAEjE,UAAM,KAAK,iBAAiB,aAAa,IAAI,IAAI,IAAI;AAE9C,WAAA;AAAA,MACN,IAAI;AAAA,IACL;AAAA,EAAA;AAEF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SetVariablesMutationResolver.js","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/mutation/SetVariablesMutationResolver.ts"],"sourcesContent":["import { MutationResolvers, MutationSetVariablesArgs } from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { VariablesManager } from '../../../model/VariablesManager'\nimport { ActionsAuthorizationActions } from '../../../authorization'\n\nexport class SetVariablesMutationResolver implements MutationResolvers<ActionsContext> {\n\tconstructor(\n\t\tprivate readonly variablesManager: VariablesManager,\n\t) {\n\t}\n\n\n\tasync setVariables(parent: unknown, { args }: MutationSetVariablesArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.VARIABLES_SET)\n\n\t\tawait this.variablesManager.setVariables(ctx.db, args)\n\n\t\treturn {\n\t\t\tok: true,\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;AAKO,MAAM,6BAA0E;AAAA,EACtF,YACkB,kBAChB;AADgB,SAAA,mBAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"SetVariablesMutationResolver.js","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/mutation/SetVariablesMutationResolver.ts"],"sourcesContent":["import { MutationResolvers, MutationSetVariablesArgs } from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { VariablesManager } from '../../../model/VariablesManager'\nimport { ActionsAuthorizationActions } from '../../../authorization'\n\nexport class SetVariablesMutationResolver implements MutationResolvers<ActionsContext> {\n\tconstructor(\n\t\tprivate readonly variablesManager: VariablesManager,\n\t) {\n\t}\n\n\n\tasync setVariables(parent: unknown, { args }: MutationSetVariablesArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.VARIABLES_SET)\n\n\t\tawait this.variablesManager.setVariables(ctx.db, args)\n\n\t\treturn {\n\t\t\tok: true,\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;AAKO,MAAM,6BAA0E;AAAA,EACtF,YACkB,kBAChB;AADgB,SAAA,mBAAA;AAAA,EAAA;AAAA,EAKlB,MAAM,aAAa,QAAiB,EAAE,KAAA,GAAkC,KAAqB;AACtF,UAAA,IAAI,cAAc,4BAA4B,aAAa;AAEjE,UAAM,KAAK,iBAAiB,aAAa,IAAI,IAAI,IAAI;AAE9C,WAAA;AAAA,MACN,IAAI;AAAA,IACL;AAAA,EAAA;AAEF;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventsQueryResolver.cjs","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/query/EventsQueryResolver.ts"],"sourcesContent":["import {\n\tEvent,\n\tQueryEventsInProcessingArgs,\n\tQueryEventsToProcessArgs,\n\tQueryFailedEventsArgs,\n\tQueryResolvers,\n} from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { EventsToProcessQuery } from '../../../model/EventsToProcessQuery'\nimport { EventRow } from '../../../model/types'\nimport { DatabaseContext, StagesQuery } from '@contember/engine-system-api'\nimport { Client, DatabaseQuery } from '@contember/database'\nimport { EventsInProcessingQuery } from '../../../model/EventsInProcessingQuery'\nimport { FailedEventsQuery } from '../../../model/FailedEventsQuery'\nimport { ActionsAuthorizationActions } from '../../../authorization'\n\nexport class EventsQueryResolver implements QueryResolvers<ActionsContext> {\n\tasync eventsInProcessing(parent: unknown, { args }: QueryEventsInProcessingArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new EventsInProcessingQuery(args ?? {}))\n\t}\n\n\tasync eventsToProcess(parent: unknown, { args }: QueryEventsToProcessArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new EventsToProcessQuery(args ?? {}))\n\t}\n\n\tasync failedEvents(parent: unknown, { args }: QueryFailedEventsArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new FailedEventsQuery(args ?? {}))\n\t}\n\n\tprivate async fetchEvents(db: DatabaseContext, query: DatabaseQuery<EventRow[]>) {\n\t\tconst stages = await this.fetchStagesMap(db)\n\t\treturn this.mapEventRows(await db.queryHandler.fetch(query), stages)\n\t}\n\n\tprivate async fetchStagesMap(db: DatabaseContext): Promise<Record<string, string>> {\n\t\treturn Object.fromEntries((await db.queryHandler.fetch(new StagesQuery())).map(it => [it.id, it.slug]))\n\t}\n\n\tprivate mapEventRows(rows: EventRow[], stagesMap: Record<string, string>): Event[] {\n\n\t\treturn rows.map(row => ({\n\t\t\tid: row.id,\n\t\t\tcreatedAt: row.created_at,\n\t\t\tresolvedAt: row.created_at,\n\t\t\tlastStateChange: row.last_state_change,\n\t\t\tvisibleAt: row.visible_at,\n\t\t\tlog: row.log,\n\t\t\tnumRetries: row.num_retries,\n\t\t\tpayload: row.payload,\n\t\t\tstage: stagesMap[row.stage_id],\n\t\t\tstate: row.state,\n\t\t\ttarget: row.target,\n\t\t\ttransactionId: row.transaction_id,\n\t\t}))\n\t}\n}\n"],"names":["ActionsAuthorizationActions","EventsInProcessingQuery","EventsToProcessQuery","FailedEventsQuery","StagesQuery"],"mappings":";;;;;;;;;AAgBO,MAAM,oBAA8D;AAAA,EAC1E,MAAM,mBAAmB,QAAiB,EAAE,KAAA,GAAqC,KAAqB;AAC/F,UAAA,IAAI,cAAcA,4BAAA,4BAA4B,WAAW;AAExD,WAAA,MAAM,KAAK,YAAY,IAAI,IAAI,IAAIC,
|
|
1
|
+
{"version":3,"file":"EventsQueryResolver.cjs","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/query/EventsQueryResolver.ts"],"sourcesContent":["import {\n\tEvent,\n\tQueryEventsInProcessingArgs,\n\tQueryEventsToProcessArgs,\n\tQueryFailedEventsArgs,\n\tQueryResolvers,\n} from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { EventsToProcessQuery } from '../../../model/EventsToProcessQuery'\nimport { EventRow } from '../../../model/types'\nimport { DatabaseContext, StagesQuery } from '@contember/engine-system-api'\nimport { Client, DatabaseQuery } from '@contember/database'\nimport { EventsInProcessingQuery } from '../../../model/EventsInProcessingQuery'\nimport { FailedEventsQuery } from '../../../model/FailedEventsQuery'\nimport { ActionsAuthorizationActions } from '../../../authorization'\n\nexport class EventsQueryResolver implements QueryResolvers<ActionsContext> {\n\tasync eventsInProcessing(parent: unknown, { args }: QueryEventsInProcessingArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new EventsInProcessingQuery(args ?? {}))\n\t}\n\n\tasync eventsToProcess(parent: unknown, { args }: QueryEventsToProcessArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new EventsToProcessQuery(args ?? {}))\n\t}\n\n\tasync failedEvents(parent: unknown, { args }: QueryFailedEventsArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new FailedEventsQuery(args ?? {}))\n\t}\n\n\tprivate async fetchEvents(db: DatabaseContext, query: DatabaseQuery<EventRow[]>) {\n\t\tconst stages = await this.fetchStagesMap(db)\n\t\treturn this.mapEventRows(await db.queryHandler.fetch(query), stages)\n\t}\n\n\tprivate async fetchStagesMap(db: DatabaseContext): Promise<Record<string, string>> {\n\t\treturn Object.fromEntries((await db.queryHandler.fetch(new StagesQuery())).map(it => [it.id, it.slug]))\n\t}\n\n\tprivate mapEventRows(rows: EventRow[], stagesMap: Record<string, string>): Event[] {\n\n\t\treturn rows.map(row => ({\n\t\t\tid: row.id,\n\t\t\tcreatedAt: row.created_at,\n\t\t\tresolvedAt: row.created_at,\n\t\t\tlastStateChange: row.last_state_change,\n\t\t\tvisibleAt: row.visible_at,\n\t\t\tlog: row.log,\n\t\t\tnumRetries: row.num_retries,\n\t\t\tpayload: row.payload,\n\t\t\tstage: stagesMap[row.stage_id],\n\t\t\tstate: row.state,\n\t\t\ttarget: row.target,\n\t\t\ttransactionId: row.transaction_id,\n\t\t}))\n\t}\n}\n"],"names":["ActionsAuthorizationActions","EventsInProcessingQuery","EventsToProcessQuery","FailedEventsQuery","StagesQuery"],"mappings":";;;;;;;;;AAgBO,MAAM,oBAA8D;AAAA,EAC1E,MAAM,mBAAmB,QAAiB,EAAE,KAAA,GAAqC,KAAqB;AAC/F,UAAA,IAAI,cAAcA,4BAAA,4BAA4B,WAAW;AAExD,WAAA,MAAM,KAAK,YAAY,IAAI,IAAI,IAAIC,wBAAwB,wBAAA,QAAQ,CAAA,CAAE,CAAC;AAAA,EAAA;AAAA,EAG9E,MAAM,gBAAgB,QAAiB,EAAE,KAAA,GAAkC,KAAqB;AACzF,UAAA,IAAI,cAAcD,4BAAA,4BAA4B,WAAW;AAExD,WAAA,MAAM,KAAK,YAAY,IAAI,IAAI,IAAIE,qBAAqB,qBAAA,QAAQ,CAAA,CAAE,CAAC;AAAA,EAAA;AAAA,EAG3E,MAAM,aAAa,QAAiB,EAAE,KAAA,GAA+B,KAAqB;AACnF,UAAA,IAAI,cAAcF,4BAAA,4BAA4B,WAAW;AAExD,WAAA,MAAM,KAAK,YAAY,IAAI,IAAI,IAAIG,kBAAkB,kBAAA,QAAQ,CAAA,CAAE,CAAC;AAAA,EAAA;AAAA,EAGxE,MAAc,YAAY,IAAqB,OAAkC;AAChF,UAAM,SAAS,MAAM,KAAK,eAAe,EAAE;AACpC,WAAA,KAAK,aAAa,MAAM,GAAG,aAAa,MAAM,KAAK,GAAG,MAAM;AAAA,EAAA;AAAA,EAGpE,MAAc,eAAe,IAAsD;AAClF,WAAO,OAAO,aAAa,MAAM,GAAG,aAAa,MAAM,IAAIC,gBAAY,YAAA,CAAC,GAAG,IAAI,QAAM,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,EAAA;AAAA,EAG/F,aAAa,MAAkB,WAA4C;AAE3E,WAAA,KAAK,IAAI,CAAQ,SAAA;AAAA,MACvB,IAAI,IAAI;AAAA,MACR,WAAW,IAAI;AAAA,MACf,YAAY,IAAI;AAAA,MAChB,iBAAiB,IAAI;AAAA,MACrB,WAAW,IAAI;AAAA,MACf,KAAK,IAAI;AAAA,MACT,YAAY,IAAI;AAAA,MAChB,SAAS,IAAI;AAAA,MACb,OAAO,UAAU,IAAI,QAAQ;AAAA,MAC7B,OAAO,IAAI;AAAA,MACX,QAAQ,IAAI;AAAA,MACZ,eAAe,IAAI;AAAA,IAAA,EAClB;AAAA,EAAA;AAEJ;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventsQueryResolver.js","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/query/EventsQueryResolver.ts"],"sourcesContent":["import {\n\tEvent,\n\tQueryEventsInProcessingArgs,\n\tQueryEventsToProcessArgs,\n\tQueryFailedEventsArgs,\n\tQueryResolvers,\n} from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { EventsToProcessQuery } from '../../../model/EventsToProcessQuery'\nimport { EventRow } from '../../../model/types'\nimport { DatabaseContext, StagesQuery } from '@contember/engine-system-api'\nimport { Client, DatabaseQuery } from '@contember/database'\nimport { EventsInProcessingQuery } from '../../../model/EventsInProcessingQuery'\nimport { FailedEventsQuery } from '../../../model/FailedEventsQuery'\nimport { ActionsAuthorizationActions } from '../../../authorization'\n\nexport class EventsQueryResolver implements QueryResolvers<ActionsContext> {\n\tasync eventsInProcessing(parent: unknown, { args }: QueryEventsInProcessingArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new EventsInProcessingQuery(args ?? {}))\n\t}\n\n\tasync eventsToProcess(parent: unknown, { args }: QueryEventsToProcessArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new EventsToProcessQuery(args ?? {}))\n\t}\n\n\tasync failedEvents(parent: unknown, { args }: QueryFailedEventsArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new FailedEventsQuery(args ?? {}))\n\t}\n\n\tprivate async fetchEvents(db: DatabaseContext, query: DatabaseQuery<EventRow[]>) {\n\t\tconst stages = await this.fetchStagesMap(db)\n\t\treturn this.mapEventRows(await db.queryHandler.fetch(query), stages)\n\t}\n\n\tprivate async fetchStagesMap(db: DatabaseContext): Promise<Record<string, string>> {\n\t\treturn Object.fromEntries((await db.queryHandler.fetch(new StagesQuery())).map(it => [it.id, it.slug]))\n\t}\n\n\tprivate mapEventRows(rows: EventRow[], stagesMap: Record<string, string>): Event[] {\n\n\t\treturn rows.map(row => ({\n\t\t\tid: row.id,\n\t\t\tcreatedAt: row.created_at,\n\t\t\tresolvedAt: row.created_at,\n\t\t\tlastStateChange: row.last_state_change,\n\t\t\tvisibleAt: row.visible_at,\n\t\t\tlog: row.log,\n\t\t\tnumRetries: row.num_retries,\n\t\t\tpayload: row.payload,\n\t\t\tstage: stagesMap[row.stage_id],\n\t\t\tstate: row.state,\n\t\t\ttarget: row.target,\n\t\t\ttransactionId: row.transaction_id,\n\t\t}))\n\t}\n}\n"],"names":[],"mappings":";;;;;;;AAgBO,MAAM,oBAA8D;AAAA,EAC1E,MAAM,mBAAmB,QAAiB,EAAE,KAAA,GAAqC,KAAqB;AAC/F,UAAA,IAAI,cAAc,4BAA4B,WAAW;AAExD,WAAA,MAAM,KAAK,YAAY,IAAI,IAAI,IAAI,wBAAwB,QAAQ,CAAE,
|
|
1
|
+
{"version":3,"file":"EventsQueryResolver.js","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/query/EventsQueryResolver.ts"],"sourcesContent":["import {\n\tEvent,\n\tQueryEventsInProcessingArgs,\n\tQueryEventsToProcessArgs,\n\tQueryFailedEventsArgs,\n\tQueryResolvers,\n} from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { EventsToProcessQuery } from '../../../model/EventsToProcessQuery'\nimport { EventRow } from '../../../model/types'\nimport { DatabaseContext, StagesQuery } from '@contember/engine-system-api'\nimport { Client, DatabaseQuery } from '@contember/database'\nimport { EventsInProcessingQuery } from '../../../model/EventsInProcessingQuery'\nimport { FailedEventsQuery } from '../../../model/FailedEventsQuery'\nimport { ActionsAuthorizationActions } from '../../../authorization'\n\nexport class EventsQueryResolver implements QueryResolvers<ActionsContext> {\n\tasync eventsInProcessing(parent: unknown, { args }: QueryEventsInProcessingArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new EventsInProcessingQuery(args ?? {}))\n\t}\n\n\tasync eventsToProcess(parent: unknown, { args }: QueryEventsToProcessArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new EventsToProcessQuery(args ?? {}))\n\t}\n\n\tasync failedEvents(parent: unknown, { args }: QueryFailedEventsArgs, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)\n\n\t\treturn await this.fetchEvents(ctx.db, new FailedEventsQuery(args ?? {}))\n\t}\n\n\tprivate async fetchEvents(db: DatabaseContext, query: DatabaseQuery<EventRow[]>) {\n\t\tconst stages = await this.fetchStagesMap(db)\n\t\treturn this.mapEventRows(await db.queryHandler.fetch(query), stages)\n\t}\n\n\tprivate async fetchStagesMap(db: DatabaseContext): Promise<Record<string, string>> {\n\t\treturn Object.fromEntries((await db.queryHandler.fetch(new StagesQuery())).map(it => [it.id, it.slug]))\n\t}\n\n\tprivate mapEventRows(rows: EventRow[], stagesMap: Record<string, string>): Event[] {\n\n\t\treturn rows.map(row => ({\n\t\t\tid: row.id,\n\t\t\tcreatedAt: row.created_at,\n\t\t\tresolvedAt: row.created_at,\n\t\t\tlastStateChange: row.last_state_change,\n\t\t\tvisibleAt: row.visible_at,\n\t\t\tlog: row.log,\n\t\t\tnumRetries: row.num_retries,\n\t\t\tpayload: row.payload,\n\t\t\tstage: stagesMap[row.stage_id],\n\t\t\tstate: row.state,\n\t\t\ttarget: row.target,\n\t\t\ttransactionId: row.transaction_id,\n\t\t}))\n\t}\n}\n"],"names":[],"mappings":";;;;;;;AAgBO,MAAM,oBAA8D;AAAA,EAC1E,MAAM,mBAAmB,QAAiB,EAAE,KAAA,GAAqC,KAAqB;AAC/F,UAAA,IAAI,cAAc,4BAA4B,WAAW;AAExD,WAAA,MAAM,KAAK,YAAY,IAAI,IAAI,IAAI,wBAAwB,QAAQ,CAAA,CAAE,CAAC;AAAA,EAAA;AAAA,EAG9E,MAAM,gBAAgB,QAAiB,EAAE,KAAA,GAAkC,KAAqB;AACzF,UAAA,IAAI,cAAc,4BAA4B,WAAW;AAExD,WAAA,MAAM,KAAK,YAAY,IAAI,IAAI,IAAI,qBAAqB,QAAQ,CAAA,CAAE,CAAC;AAAA,EAAA;AAAA,EAG3E,MAAM,aAAa,QAAiB,EAAE,KAAA,GAA+B,KAAqB;AACnF,UAAA,IAAI,cAAc,4BAA4B,WAAW;AAExD,WAAA,MAAM,KAAK,YAAY,IAAI,IAAI,IAAI,kBAAkB,QAAQ,CAAA,CAAE,CAAC;AAAA,EAAA;AAAA,EAGxE,MAAc,YAAY,IAAqB,OAAkC;AAChF,UAAM,SAAS,MAAM,KAAK,eAAe,EAAE;AACpC,WAAA,KAAK,aAAa,MAAM,GAAG,aAAa,MAAM,KAAK,GAAG,MAAM;AAAA,EAAA;AAAA,EAGpE,MAAc,eAAe,IAAsD;AAClF,WAAO,OAAO,aAAa,MAAM,GAAG,aAAa,MAAM,IAAI,YAAY,CAAC,GAAG,IAAI,QAAM,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,EAAA;AAAA,EAG/F,aAAa,MAAkB,WAA4C;AAE3E,WAAA,KAAK,IAAI,CAAQ,SAAA;AAAA,MACvB,IAAI,IAAI;AAAA,MACR,WAAW,IAAI;AAAA,MACf,YAAY,IAAI;AAAA,MAChB,iBAAiB,IAAI;AAAA,MACrB,WAAW,IAAI;AAAA,MACf,KAAK,IAAI;AAAA,MACT,YAAY,IAAI;AAAA,MAChB,SAAS,IAAI;AAAA,MACb,OAAO,UAAU,IAAI,QAAQ;AAAA,MAC7B,OAAO,IAAI;AAAA,MACX,QAAQ,IAAI;AAAA,MACZ,eAAe,IAAI;AAAA,IAAA,EAClB;AAAA,EAAA;AAEJ;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VariablesQueryResolver.cjs","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/query/VariablesQueryResolver.ts"],"sourcesContent":["import { QueryResolvers } from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { VariablesManager } from '../../../model/VariablesManager'\nimport { ActionsAuthorizationActions } from '../../../authorization'\n\nexport class VariablesQueryResolver implements QueryResolvers<ActionsContext> {\n\n\tconstructor(\n\t\tprivate readonly variablesManager: VariablesManager,\n\t) {\n\t}\n\n\tasync variables(parent: unknown, args: unknown, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.VARIABLES_VIEW)\n\n\t\treturn Object.entries(await this.variablesManager.fetchVariables(ctx.db)).map(([name, value]) => ({\n\t\t\tname,\n\t\t\tvalue,\n\t\t}))\n\t}\n}\n"],"names":["ActionsAuthorizationActions"],"mappings":";;;;;AAKO,MAAM,uBAAiE;AAAA,EAE7E,YACkB,kBAChB;AADgB,SAAA,mBAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"VariablesQueryResolver.cjs","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/query/VariablesQueryResolver.ts"],"sourcesContent":["import { QueryResolvers } from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { VariablesManager } from '../../../model/VariablesManager'\nimport { ActionsAuthorizationActions } from '../../../authorization'\n\nexport class VariablesQueryResolver implements QueryResolvers<ActionsContext> {\n\n\tconstructor(\n\t\tprivate readonly variablesManager: VariablesManager,\n\t) {\n\t}\n\n\tasync variables(parent: unknown, args: unknown, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.VARIABLES_VIEW)\n\n\t\treturn Object.entries(await this.variablesManager.fetchVariables(ctx.db)).map(([name, value]) => ({\n\t\t\tname,\n\t\t\tvalue,\n\t\t}))\n\t}\n}\n"],"names":["ActionsAuthorizationActions"],"mappings":";;;;;AAKO,MAAM,uBAAiE;AAAA,EAE7E,YACkB,kBAChB;AADgB,SAAA,mBAAA;AAAA,EAAA;AAAA,EAIlB,MAAM,UAAU,QAAiB,MAAe,KAAqB;AAC9D,UAAA,IAAI,cAAcA,4BAAA,4BAA4B,cAAc;AAElE,WAAO,OAAO,QAAQ,MAAM,KAAK,iBAAiB,eAAe,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO;AAAA,MACjG;AAAA,MACA;AAAA,IAAA,EACC;AAAA,EAAA;AAEJ;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VariablesQueryResolver.js","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/query/VariablesQueryResolver.ts"],"sourcesContent":["import { QueryResolvers } from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { VariablesManager } from '../../../model/VariablesManager'\nimport { ActionsAuthorizationActions } from '../../../authorization'\n\nexport class VariablesQueryResolver implements QueryResolvers<ActionsContext> {\n\n\tconstructor(\n\t\tprivate readonly variablesManager: VariablesManager,\n\t) {\n\t}\n\n\tasync variables(parent: unknown, args: unknown, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.VARIABLES_VIEW)\n\n\t\treturn Object.entries(await this.variablesManager.fetchVariables(ctx.db)).map(([name, value]) => ({\n\t\t\tname,\n\t\t\tvalue,\n\t\t}))\n\t}\n}\n"],"names":[],"mappings":";;;AAKO,MAAM,uBAAiE;AAAA,EAE7E,YACkB,kBAChB;AADgB,SAAA,mBAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"VariablesQueryResolver.js","sources":["../../../../../../../packages/engine-actions/src/graphql/resolvers/query/VariablesQueryResolver.ts"],"sourcesContent":["import { QueryResolvers } from '../../schema'\nimport { ActionsContext } from '../ActionsContext'\nimport { VariablesManager } from '../../../model/VariablesManager'\nimport { ActionsAuthorizationActions } from '../../../authorization'\n\nexport class VariablesQueryResolver implements QueryResolvers<ActionsContext> {\n\n\tconstructor(\n\t\tprivate readonly variablesManager: VariablesManager,\n\t) {\n\t}\n\n\tasync variables(parent: unknown, args: unknown, ctx: ActionsContext) {\n\t\tawait ctx.requireAccess(ActionsAuthorizationActions.VARIABLES_VIEW)\n\n\t\treturn Object.entries(await this.variablesManager.fetchVariables(ctx.db)).map(([name, value]) => ({\n\t\t\tname,\n\t\t\tvalue,\n\t\t}))\n\t}\n}\n"],"names":[],"mappings":";;;AAKO,MAAM,uBAAiE;AAAA,EAE7E,YACkB,kBAChB;AADgB,SAAA,mBAAA;AAAA,EAAA;AAAA,EAIlB,MAAM,UAAU,QAAiB,MAAe,KAAqB;AAC9D,UAAA,IAAI,cAAc,4BAA4B,cAAc;AAElE,WAAO,OAAO,QAAQ,MAAM,KAAK,iBAAiB,eAAe,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO;AAAA,MACjG;AAAA,MACA;AAAA,IAAA,EACC;AAAA,EAAA;AAEJ;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.graphql.cjs","sources":["../../../../../../packages/engine-actions/src/graphql/schema/actions.graphql.ts"],"sourcesContent":["import { gql } from 'graphql-tag'\nimport { DocumentNode } from 'graphql'\n\nexport const schema: DocumentNode = gql`\n scalar DateTime\n scalar Json\n scalar Uuid\n\n schema {\n query: Query\n mutation: Mutation\n }\n\n type Query {\n failedEvents(args: EventArgs): [Event!]!\n eventsToProcess(args: EventArgs): [Event!]!\n eventsInProcessing(args: EventArgs): [Event!]!\n variables: [Variable!]!\n }\n\n type Mutation {\n processBatch: ProcessBatchResponse!\n setVariables(args: SetVariablesArgs!): SetVariablesResponse!\n }\n\n input EventArgs {\n offset: Int\n \"Max 10000\"\n limit: Int\n }\n\n type Event {\n id: Uuid!\n transactionId: Uuid!\n createdAt: DateTime!\n lastStateChange: DateTime!\n resolvedAt: DateTime\n visibleAt: DateTime\n numRetries: Int!\n state: EventState!\n stage: String!\n target: String!\n payload: Json!\n log: Json!\n }\n\n enum EventState {\n created\n retrying\n processing\n succeed\n failed\n stopped\n }\n\n type ProcessBatchResponse {\n ok: Boolean!\n }\n\n input SetVariablesArgs {\n variables: [VariableInput!]!\n mode: SetVariablesMode\n }\n\t\n\t\"\"\"\n\tDefines how it handles original variables. \n\t- MERGE merges with new values (default behaviour)\n\t- SET replaces all variables\n\t- APPEND_ONLY_MISSING appends values if not already exist \n\t\"\"\"\n\tenum SetVariablesMode {\n\t\tMERGE\n\t\tSET\n\t\tAPPEND_ONLY_MISSING\n\t}\n\n input VariableInput {\n name: String!\n value: String!\n }\n\t\n\ttype SetVariablesResponse {\n\t\tok: Boolean!\n\t}\n\n type Variable {\n name: String!\n value: String!\n }\n\n`\n"],"names":["gql"],"mappings":";;;AAGO,MAAM,SAAuBA,
|
|
1
|
+
{"version":3,"file":"actions.graphql.cjs","sources":["../../../../../../packages/engine-actions/src/graphql/schema/actions.graphql.ts"],"sourcesContent":["import { gql } from 'graphql-tag'\nimport { DocumentNode } from 'graphql'\n\nexport const schema: DocumentNode = gql`\n scalar DateTime\n scalar Json\n scalar Uuid\n\n schema {\n query: Query\n mutation: Mutation\n }\n\n type Query {\n failedEvents(args: EventArgs): [Event!]!\n eventsToProcess(args: EventArgs): [Event!]!\n eventsInProcessing(args: EventArgs): [Event!]!\n variables: [Variable!]!\n }\n\n type Mutation {\n processBatch: ProcessBatchResponse!\n setVariables(args: SetVariablesArgs!): SetVariablesResponse!\n }\n\n input EventArgs {\n offset: Int\n \"Max 10000\"\n limit: Int\n }\n\n type Event {\n id: Uuid!\n transactionId: Uuid!\n createdAt: DateTime!\n lastStateChange: DateTime!\n resolvedAt: DateTime\n visibleAt: DateTime\n numRetries: Int!\n state: EventState!\n stage: String!\n target: String!\n payload: Json!\n log: Json!\n }\n\n enum EventState {\n created\n retrying\n processing\n succeed\n failed\n stopped\n }\n\n type ProcessBatchResponse {\n ok: Boolean!\n }\n\n input SetVariablesArgs {\n variables: [VariableInput!]!\n mode: SetVariablesMode\n }\n\t\n\t\"\"\"\n\tDefines how it handles original variables. \n\t- MERGE merges with new values (default behaviour)\n\t- SET replaces all variables\n\t- APPEND_ONLY_MISSING appends values if not already exist \n\t\"\"\"\n\tenum SetVariablesMode {\n\t\tMERGE\n\t\tSET\n\t\tAPPEND_ONLY_MISSING\n\t}\n\n input VariableInput {\n name: String!\n value: String!\n }\n\t\n\ttype SetVariablesResponse {\n\t\tok: Boolean!\n\t}\n\n type Variable {\n name: String!\n value: String!\n }\n\n`\n"],"names":["gql"],"mappings":";;;AAGO,MAAM,SAAuBA,WAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventsInProcessingQuery.cjs","sources":["../../../../../packages/engine-actions/src/model/EventsInProcessingQuery.ts"],"sourcesContent":["import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'\nimport { EventRow } from './types'\nimport { EventArgs } from '../graphql/schema'\n\nexport class EventsInProcessingQuery extends DatabaseQuery<EventRow[]> {\n\tconstructor(\n\t\tprivate readonly args: EventArgs,\n\t) {\n\t\tsuper()\n\t}\n\n\tasync fetch(queryable: DatabaseQueryable): Promise<EventRow[]> {\n\t\treturn SelectBuilder.create<EventRow>()\n\t\t\t.from('actions_event')\n\t\t\t.select('*')\n\t\t\t.where(it => it.in('state', ['processing']))\n\t\t\t.orderBy('last_state_change', 'asc')\n\t\t\t.limit(this.args.limit ?? 100, this.args.offset ?? 0)\n\t\t\t.getResult(queryable.db)\n\t}\n}\n"],"names":["DatabaseQuery","SelectBuilder"],"mappings":";;;AAIO,MAAM,gCAAgCA,SAAAA,cAA0B;AAAA,EACtE,YACkB,MAChB;AACK;AAFW,SAAA,OAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"EventsInProcessingQuery.cjs","sources":["../../../../../packages/engine-actions/src/model/EventsInProcessingQuery.ts"],"sourcesContent":["import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'\nimport { EventRow } from './types'\nimport { EventArgs } from '../graphql/schema'\n\nexport class EventsInProcessingQuery extends DatabaseQuery<EventRow[]> {\n\tconstructor(\n\t\tprivate readonly args: EventArgs,\n\t) {\n\t\tsuper()\n\t}\n\n\tasync fetch(queryable: DatabaseQueryable): Promise<EventRow[]> {\n\t\treturn SelectBuilder.create<EventRow>()\n\t\t\t.from('actions_event')\n\t\t\t.select('*')\n\t\t\t.where(it => it.in('state', ['processing']))\n\t\t\t.orderBy('last_state_change', 'asc')\n\t\t\t.limit(this.args.limit ?? 100, this.args.offset ?? 0)\n\t\t\t.getResult(queryable.db)\n\t}\n}\n"],"names":["DatabaseQuery","SelectBuilder"],"mappings":";;;AAIO,MAAM,gCAAgCA,SAAAA,cAA0B;AAAA,EACtE,YACkB,MAChB;AACK,UAAA;AAFW,SAAA,OAAA;AAAA,EAAA;AAAA,EAKlB,MAAM,MAAM,WAAmD;AAC9D,WAAOC,SAAAA,cAAc,OACnB,EAAA,KAAK,eAAe,EACpB,OAAO,GAAG,EACV,MAAM,CAAM,OAAA,GAAG,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC,EAC1C,QAAQ,qBAAqB,KAAK,EAClC,MAAM,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,UAAU,CAAC,EACnD,UAAU,UAAU,EAAE;AAAA,EAAA;AAE1B;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventsInProcessingQuery.js","sources":["../../../../../packages/engine-actions/src/model/EventsInProcessingQuery.ts"],"sourcesContent":["import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'\nimport { EventRow } from './types'\nimport { EventArgs } from '../graphql/schema'\n\nexport class EventsInProcessingQuery extends DatabaseQuery<EventRow[]> {\n\tconstructor(\n\t\tprivate readonly args: EventArgs,\n\t) {\n\t\tsuper()\n\t}\n\n\tasync fetch(queryable: DatabaseQueryable): Promise<EventRow[]> {\n\t\treturn SelectBuilder.create<EventRow>()\n\t\t\t.from('actions_event')\n\t\t\t.select('*')\n\t\t\t.where(it => it.in('state', ['processing']))\n\t\t\t.orderBy('last_state_change', 'asc')\n\t\t\t.limit(this.args.limit ?? 100, this.args.offset ?? 0)\n\t\t\t.getResult(queryable.db)\n\t}\n}\n"],"names":[],"mappings":";AAIO,MAAM,gCAAgC,cAA0B;AAAA,EACtE,YACkB,MAChB;AACK;AAFW,SAAA,OAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"EventsInProcessingQuery.js","sources":["../../../../../packages/engine-actions/src/model/EventsInProcessingQuery.ts"],"sourcesContent":["import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'\nimport { EventRow } from './types'\nimport { EventArgs } from '../graphql/schema'\n\nexport class EventsInProcessingQuery extends DatabaseQuery<EventRow[]> {\n\tconstructor(\n\t\tprivate readonly args: EventArgs,\n\t) {\n\t\tsuper()\n\t}\n\n\tasync fetch(queryable: DatabaseQueryable): Promise<EventRow[]> {\n\t\treturn SelectBuilder.create<EventRow>()\n\t\t\t.from('actions_event')\n\t\t\t.select('*')\n\t\t\t.where(it => it.in('state', ['processing']))\n\t\t\t.orderBy('last_state_change', 'asc')\n\t\t\t.limit(this.args.limit ?? 100, this.args.offset ?? 0)\n\t\t\t.getResult(queryable.db)\n\t}\n}\n"],"names":[],"mappings":";AAIO,MAAM,gCAAgC,cAA0B;AAAA,EACtE,YACkB,MAChB;AACK,UAAA;AAFW,SAAA,OAAA;AAAA,EAAA;AAAA,EAKlB,MAAM,MAAM,WAAmD;AAC9D,WAAO,cAAc,OACnB,EAAA,KAAK,eAAe,EACpB,OAAO,GAAG,EACV,MAAM,CAAM,OAAA,GAAG,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC,EAC1C,QAAQ,qBAAqB,KAAK,EAClC,MAAM,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,UAAU,CAAC,EACnD,UAAU,UAAU,EAAE;AAAA,EAAA;AAE1B;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventsToProcessQuery.cjs","sources":["../../../../../packages/engine-actions/src/model/EventsToProcessQuery.ts"],"sourcesContent":["import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'\nimport { EventRow } from './types'\nimport { EventArgs } from '../graphql/schema'\nimport { eventsToProcessSpecification } from './EventsToProcessSpecification'\n\nexport class EventsToProcessQuery extends DatabaseQuery<EventRow[]> {\n\tconstructor(\n\t\tprivate readonly args: EventArgs,\n\t) {\n\t\tsuper()\n\t}\n\n\tasync fetch(queryable: DatabaseQueryable): Promise<EventRow[]> {\n\t\treturn SelectBuilder.create<EventRow>()\n\t\t\t.from('actions_event')\n\t\t\t.select('*')\n\t\t\t.match(eventsToProcessSpecification)\n\t\t\t.limit(this.args.limit ?? 100, this.args.offset ?? 0)\n\t\t\t.getResult(queryable.db)\n\t}\n}\n"],"names":["DatabaseQuery","SelectBuilder","eventsToProcessSpecification"],"mappings":";;;;AAKO,MAAM,6BAA6BA,SAAAA,cAA0B;AAAA,EACnE,YACkB,MAChB;AACK;AAFW,SAAA,OAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"EventsToProcessQuery.cjs","sources":["../../../../../packages/engine-actions/src/model/EventsToProcessQuery.ts"],"sourcesContent":["import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'\nimport { EventRow } from './types'\nimport { EventArgs } from '../graphql/schema'\nimport { eventsToProcessSpecification } from './EventsToProcessSpecification'\n\nexport class EventsToProcessQuery extends DatabaseQuery<EventRow[]> {\n\tconstructor(\n\t\tprivate readonly args: EventArgs,\n\t) {\n\t\tsuper()\n\t}\n\n\tasync fetch(queryable: DatabaseQueryable): Promise<EventRow[]> {\n\t\treturn SelectBuilder.create<EventRow>()\n\t\t\t.from('actions_event')\n\t\t\t.select('*')\n\t\t\t.match(eventsToProcessSpecification)\n\t\t\t.limit(this.args.limit ?? 100, this.args.offset ?? 0)\n\t\t\t.getResult(queryable.db)\n\t}\n}\n"],"names":["DatabaseQuery","SelectBuilder","eventsToProcessSpecification"],"mappings":";;;;AAKO,MAAM,6BAA6BA,SAAAA,cAA0B;AAAA,EACnE,YACkB,MAChB;AACK,UAAA;AAFW,SAAA,OAAA;AAAA,EAAA;AAAA,EAKlB,MAAM,MAAM,WAAmD;AACvD,WAAAC,uBAAc,SACnB,KAAK,eAAe,EACpB,OAAO,GAAG,EACV,MAAMC,6BAAAA,4BAA4B,EAClC,MAAM,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,UAAU,CAAC,EACnD,UAAU,UAAU,EAAE;AAAA,EAAA;AAE1B;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventsToProcessQuery.js","sources":["../../../../../packages/engine-actions/src/model/EventsToProcessQuery.ts"],"sourcesContent":["import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'\nimport { EventRow } from './types'\nimport { EventArgs } from '../graphql/schema'\nimport { eventsToProcessSpecification } from './EventsToProcessSpecification'\n\nexport class EventsToProcessQuery extends DatabaseQuery<EventRow[]> {\n\tconstructor(\n\t\tprivate readonly args: EventArgs,\n\t) {\n\t\tsuper()\n\t}\n\n\tasync fetch(queryable: DatabaseQueryable): Promise<EventRow[]> {\n\t\treturn SelectBuilder.create<EventRow>()\n\t\t\t.from('actions_event')\n\t\t\t.select('*')\n\t\t\t.match(eventsToProcessSpecification)\n\t\t\t.limit(this.args.limit ?? 100, this.args.offset ?? 0)\n\t\t\t.getResult(queryable.db)\n\t}\n}\n"],"names":[],"mappings":";;AAKO,MAAM,6BAA6B,cAA0B;AAAA,EACnE,YACkB,MAChB;AACK;AAFW,SAAA,OAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"EventsToProcessQuery.js","sources":["../../../../../packages/engine-actions/src/model/EventsToProcessQuery.ts"],"sourcesContent":["import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'\nimport { EventRow } from './types'\nimport { EventArgs } from '../graphql/schema'\nimport { eventsToProcessSpecification } from './EventsToProcessSpecification'\n\nexport class EventsToProcessQuery extends DatabaseQuery<EventRow[]> {\n\tconstructor(\n\t\tprivate readonly args: EventArgs,\n\t) {\n\t\tsuper()\n\t}\n\n\tasync fetch(queryable: DatabaseQueryable): Promise<EventRow[]> {\n\t\treturn SelectBuilder.create<EventRow>()\n\t\t\t.from('actions_event')\n\t\t\t.select('*')\n\t\t\t.match(eventsToProcessSpecification)\n\t\t\t.limit(this.args.limit ?? 100, this.args.offset ?? 0)\n\t\t\t.getResult(queryable.db)\n\t}\n}\n"],"names":[],"mappings":";;AAKO,MAAM,6BAA6B,cAA0B;AAAA,EACnE,YACkB,MAChB;AACK,UAAA;AAFW,SAAA,OAAA;AAAA,EAAA;AAAA,EAKlB,MAAM,MAAM,WAAmD;AACvD,WAAA,cAAc,SACnB,KAAK,eAAe,EACpB,OAAO,GAAG,EACV,MAAM,4BAA4B,EAClC,MAAM,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,UAAU,CAAC,EACnD,UAAU,UAAU,EAAE;AAAA,EAAA;AAE1B;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FailedEventsQuery.cjs","sources":["../../../../../packages/engine-actions/src/model/FailedEventsQuery.ts"],"sourcesContent":["import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'\nimport { EventRow } from './types'\nimport { EventArgs } from '../graphql/schema'\n\nexport class FailedEventsQuery extends DatabaseQuery<EventRow[]> {\n\tconstructor(\n\t\tprivate readonly args: EventArgs,\n\t) {\n\t\tsuper()\n\t}\n\n\tasync fetch(queryable: DatabaseQueryable): Promise<EventRow[]> {\n\t\treturn SelectBuilder.create<EventRow>()\n\t\t\t.from('actions_event')\n\t\t\t.select('*')\n\t\t\t.where(it => it.in('state', ['failed', 'retrying']))\n\t\t\t.orderBy('last_state_change', 'desc')\n\t\t\t.limit(this.args.limit ?? 100, this.args.offset ?? 0)\n\t\t\t.getResult(queryable.db)\n\t}\n}\n"],"names":["DatabaseQuery","SelectBuilder"],"mappings":";;;AAIO,MAAM,0BAA0BA,SAAAA,cAA0B;AAAA,EAChE,YACkB,MAChB;AACK;AAFW,SAAA,OAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"FailedEventsQuery.cjs","sources":["../../../../../packages/engine-actions/src/model/FailedEventsQuery.ts"],"sourcesContent":["import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'\nimport { EventRow } from './types'\nimport { EventArgs } from '../graphql/schema'\n\nexport class FailedEventsQuery extends DatabaseQuery<EventRow[]> {\n\tconstructor(\n\t\tprivate readonly args: EventArgs,\n\t) {\n\t\tsuper()\n\t}\n\n\tasync fetch(queryable: DatabaseQueryable): Promise<EventRow[]> {\n\t\treturn SelectBuilder.create<EventRow>()\n\t\t\t.from('actions_event')\n\t\t\t.select('*')\n\t\t\t.where(it => it.in('state', ['failed', 'retrying']))\n\t\t\t.orderBy('last_state_change', 'desc')\n\t\t\t.limit(this.args.limit ?? 100, this.args.offset ?? 0)\n\t\t\t.getResult(queryable.db)\n\t}\n}\n"],"names":["DatabaseQuery","SelectBuilder"],"mappings":";;;AAIO,MAAM,0BAA0BA,SAAAA,cAA0B;AAAA,EAChE,YACkB,MAChB;AACK,UAAA;AAFW,SAAA,OAAA;AAAA,EAAA;AAAA,EAKlB,MAAM,MAAM,WAAmD;AAC9D,WAAOC,SAAAA,cAAc,OAAiB,EACpC,KAAK,eAAe,EACpB,OAAO,GAAG,EACV,MAAM,QAAM,GAAG,GAAG,SAAS,CAAC,UAAU,UAAU,CAAC,CAAC,EAClD,QAAQ,qBAAqB,MAAM,EACnC,MAAM,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,UAAU,CAAC,EACnD,UAAU,UAAU,EAAE;AAAA,EAAA;AAE1B;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FailedEventsQuery.js","sources":["../../../../../packages/engine-actions/src/model/FailedEventsQuery.ts"],"sourcesContent":["import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'\nimport { EventRow } from './types'\nimport { EventArgs } from '../graphql/schema'\n\nexport class FailedEventsQuery extends DatabaseQuery<EventRow[]> {\n\tconstructor(\n\t\tprivate readonly args: EventArgs,\n\t) {\n\t\tsuper()\n\t}\n\n\tasync fetch(queryable: DatabaseQueryable): Promise<EventRow[]> {\n\t\treturn SelectBuilder.create<EventRow>()\n\t\t\t.from('actions_event')\n\t\t\t.select('*')\n\t\t\t.where(it => it.in('state', ['failed', 'retrying']))\n\t\t\t.orderBy('last_state_change', 'desc')\n\t\t\t.limit(this.args.limit ?? 100, this.args.offset ?? 0)\n\t\t\t.getResult(queryable.db)\n\t}\n}\n"],"names":[],"mappings":";AAIO,MAAM,0BAA0B,cAA0B;AAAA,EAChE,YACkB,MAChB;AACK;AAFW,SAAA,OAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"FailedEventsQuery.js","sources":["../../../../../packages/engine-actions/src/model/FailedEventsQuery.ts"],"sourcesContent":["import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'\nimport { EventRow } from './types'\nimport { EventArgs } from '../graphql/schema'\n\nexport class FailedEventsQuery extends DatabaseQuery<EventRow[]> {\n\tconstructor(\n\t\tprivate readonly args: EventArgs,\n\t) {\n\t\tsuper()\n\t}\n\n\tasync fetch(queryable: DatabaseQueryable): Promise<EventRow[]> {\n\t\treturn SelectBuilder.create<EventRow>()\n\t\t\t.from('actions_event')\n\t\t\t.select('*')\n\t\t\t.where(it => it.in('state', ['failed', 'retrying']))\n\t\t\t.orderBy('last_state_change', 'desc')\n\t\t\t.limit(this.args.limit ?? 100, this.args.offset ?? 0)\n\t\t\t.getResult(queryable.db)\n\t}\n}\n"],"names":[],"mappings":";AAIO,MAAM,0BAA0B,cAA0B;AAAA,EAChE,YACkB,MAChB;AACK,UAAA;AAFW,SAAA,OAAA;AAAA,EAAA;AAAA,EAKlB,MAAM,MAAM,WAAmD;AAC9D,WAAO,cAAc,OAAiB,EACpC,KAAK,eAAe,EACpB,OAAO,GAAG,EACV,MAAM,QAAM,GAAG,GAAG,SAAS,CAAC,UAAU,UAAU,CAAC,CAAC,EAClD,QAAQ,qBAAqB,MAAM,EACnC,MAAM,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,UAAU,CAAC,EACnD,UAAU,UAAU,EAAE;AAAA,EAAA;AAE1B;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SetVariableCommand.cjs","sources":["../../../../../packages/engine-actions/src/model/SetVariableCommand.ts"],"sourcesContent":["import { Command } from '@contember/engine-system-api'\nimport { ConflictActionType, InsertBuilder, Literal } from '@contember/database'\n\nexport class SetVariableCommand implements Command<void> {\n\n\tconstructor(\n\t\tprivate readonly name: string,\n\t\tprivate readonly value: string,\n\t) {\n\t}\n\n\tasync execute({ providers, db }: Command.Args): Promise<void> {\n\t\tawait InsertBuilder.create()\n\t\t\t.into('actions_variable')\n\t\t\t.values({\n\t\t\t\tid: providers.uuid(),\n\t\t\t\tname: this.name,\n\t\t\t\tvalue: this.value,\n\t\t\t})\n\t\t\t.onConflict(ConflictActionType.update, ['name'], {\n\t\t\t\tvalue: this.value,\n\t\t\t\tupdated_at: new Literal('NOW()'),\n\t\t\t})\n\t\t\t.execute(db)\n\t}\n}\n"],"names":["InsertBuilder","ConflictActionType","Literal"],"mappings":";;;AAGO,MAAM,mBAA4C;AAAA,EAExD,YACkB,MACA,OAChB;AAFgB,SAAA,OAAA;AACA,SAAA,QAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"SetVariableCommand.cjs","sources":["../../../../../packages/engine-actions/src/model/SetVariableCommand.ts"],"sourcesContent":["import { Command } from '@contember/engine-system-api'\nimport { ConflictActionType, InsertBuilder, Literal } from '@contember/database'\n\nexport class SetVariableCommand implements Command<void> {\n\n\tconstructor(\n\t\tprivate readonly name: string,\n\t\tprivate readonly value: string,\n\t) {\n\t}\n\n\tasync execute({ providers, db }: Command.Args): Promise<void> {\n\t\tawait InsertBuilder.create()\n\t\t\t.into('actions_variable')\n\t\t\t.values({\n\t\t\t\tid: providers.uuid(),\n\t\t\t\tname: this.name,\n\t\t\t\tvalue: this.value,\n\t\t\t})\n\t\t\t.onConflict(ConflictActionType.update, ['name'], {\n\t\t\t\tvalue: this.value,\n\t\t\t\tupdated_at: new Literal('NOW()'),\n\t\t\t})\n\t\t\t.execute(db)\n\t}\n}\n"],"names":["InsertBuilder","ConflictActionType","Literal"],"mappings":";;;AAGO,MAAM,mBAA4C;AAAA,EAExD,YACkB,MACA,OAChB;AAFgB,SAAA,OAAA;AACA,SAAA,QAAA;AAAA,EAAA;AAAA,EAIlB,MAAM,QAAQ,EAAE,WAAW,MAAmC;AAC7D,UAAMA,SAAAA,cAAc,OAAO,EACzB,KAAK,kBAAkB,EACvB,OAAO;AAAA,MACP,IAAI,UAAU,KAAK;AAAA,MACnB,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,IACZ,CAAA,EACA,WAAWC,SAAAA,mBAAmB,QAAQ,CAAC,MAAM,GAAG;AAAA,MAChD,OAAO,KAAK;AAAA,MACZ,YAAY,IAAIC,SAAAA,QAAQ,OAAO;AAAA,IAAA,CAC/B,EACA,QAAQ,EAAE;AAAA,EAAA;AAEd;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SetVariableCommand.js","sources":["../../../../../packages/engine-actions/src/model/SetVariableCommand.ts"],"sourcesContent":["import { Command } from '@contember/engine-system-api'\nimport { ConflictActionType, InsertBuilder, Literal } from '@contember/database'\n\nexport class SetVariableCommand implements Command<void> {\n\n\tconstructor(\n\t\tprivate readonly name: string,\n\t\tprivate readonly value: string,\n\t) {\n\t}\n\n\tasync execute({ providers, db }: Command.Args): Promise<void> {\n\t\tawait InsertBuilder.create()\n\t\t\t.into('actions_variable')\n\t\t\t.values({\n\t\t\t\tid: providers.uuid(),\n\t\t\t\tname: this.name,\n\t\t\t\tvalue: this.value,\n\t\t\t})\n\t\t\t.onConflict(ConflictActionType.update, ['name'], {\n\t\t\t\tvalue: this.value,\n\t\t\t\tupdated_at: new Literal('NOW()'),\n\t\t\t})\n\t\t\t.execute(db)\n\t}\n}\n"],"names":["InsertBuilder"],"mappings":";AAGO,MAAM,mBAA4C;AAAA,EAExD,YACkB,MACA,OAChB;AAFgB,SAAA,OAAA;AACA,SAAA,QAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"SetVariableCommand.js","sources":["../../../../../packages/engine-actions/src/model/SetVariableCommand.ts"],"sourcesContent":["import { Command } from '@contember/engine-system-api'\nimport { ConflictActionType, InsertBuilder, Literal } from '@contember/database'\n\nexport class SetVariableCommand implements Command<void> {\n\n\tconstructor(\n\t\tprivate readonly name: string,\n\t\tprivate readonly value: string,\n\t) {\n\t}\n\n\tasync execute({ providers, db }: Command.Args): Promise<void> {\n\t\tawait InsertBuilder.create()\n\t\t\t.into('actions_variable')\n\t\t\t.values({\n\t\t\t\tid: providers.uuid(),\n\t\t\t\tname: this.name,\n\t\t\t\tvalue: this.value,\n\t\t\t})\n\t\t\t.onConflict(ConflictActionType.update, ['name'], {\n\t\t\t\tvalue: this.value,\n\t\t\t\tupdated_at: new Literal('NOW()'),\n\t\t\t})\n\t\t\t.execute(db)\n\t}\n}\n"],"names":["InsertBuilder"],"mappings":";AAGO,MAAM,mBAA4C;AAAA,EAExD,YACkB,MACA,OAChB;AAFgB,SAAA,OAAA;AACA,SAAA,QAAA;AAAA,EAAA;AAAA,EAIlB,MAAM,QAAQ,EAAE,WAAW,MAAmC;AAC7D,UAAMA,gBAAc,OAAO,EACzB,KAAK,kBAAkB,EACvB,OAAO;AAAA,MACP,IAAI,UAAU,KAAK;AAAA,MACnB,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,IACZ,CAAA,EACA,WAAW,mBAAmB,QAAQ,CAAC,MAAM,GAAG;AAAA,MAChD,OAAO,KAAK;AAAA,MACZ,YAAY,IAAI,QAAQ,OAAO;AAAA,IAAA,CAC/B,EACA,QAAQ,EAAE;AAAA,EAAA;AAEd;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VariablesManager.cjs","sources":["../../../../../packages/engine-actions/src/model/VariablesManager.ts"],"sourcesContent":["import { DatabaseContext } from '@contember/engine-system-api'\nimport { VariablesQuery } from './VariablesQuery'\nimport { SetVariablesArgs } from '../graphql/schema'\nimport { DeleteBuilder } from '@contember/database'\nimport { SetVariableCommand } from './SetVariableCommand'\n\nexport type VariablesMap = Record<string, string>\n\nexport class VariablesManager {\n\tpublic async fetchVariables(db: DatabaseContext): Promise<VariablesMap> {\n\t\treturn Object.fromEntries((await db.queryHandler.fetch(new VariablesQuery())).map(it => [it.name, it.value]))\n\t}\n\n\tpublic async setVariables(db: DatabaseContext, args: SetVariablesArgs) {\n\t\treturn await db.transaction(async db => {\n\t\t\tconst current = await this.fetchVariables(db)\n\t\t\tconst mode = args.mode ?? 'MERGE'\n\t\t\tconst inputVariables = Object.fromEntries(args.variables.map(it => [it.name, it.value]))\n\n\t\t\tlet newVariables: VariablesMap = {}\n\t\t\tswitch (mode) {\n\t\t\t\tcase 'APPEND_ONLY_MISSING':\n\t\t\t\t\tnewVariables = { ...inputVariables, ...current }\n\t\t\t\t\tbreak\n\t\t\t\tcase 'MERGE':\n\t\t\t\t\tnewVariables = { ...current, ...inputVariables }\n\t\t\t\t\tbreak\n\t\t\t\tcase 'SET':\n\t\t\t\t\tnewVariables = inputVariables\n\t\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tconst toDelete = Object.keys(current).filter(it => !(it in newVariables))\n\t\t\tif (toDelete.length > 0) {\n\t\t\t\tawait DeleteBuilder.create()\n\t\t\t\t\t.from('actions_variable')\n\t\t\t\t\t.where(it => it.in('name', toDelete))\n\t\t\t\t\t.execute(db.client)\n\t\t\t}\n\n\t\t\tfor (const [name, value] of Object.entries(newVariables)) {\n\t\t\t\tif (value === current[name]) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tawait db.commandBus.execute(new SetVariableCommand(name, value))\n\t\t\t}\n\t\t})\n\t}\n}\n"],"names":["VariablesQuery","db","DeleteBuilder","SetVariableCommand"],"mappings":";;;;;AAQO,MAAM,iBAAiB;AAAA,EAC7B,MAAa,eAAe,IAA4C;AACvE,WAAO,OAAO,aAAa,MAAM,GAAG,aAAa,MAAM,IAAIA,
|
|
1
|
+
{"version":3,"file":"VariablesManager.cjs","sources":["../../../../../packages/engine-actions/src/model/VariablesManager.ts"],"sourcesContent":["import { DatabaseContext } from '@contember/engine-system-api'\nimport { VariablesQuery } from './VariablesQuery'\nimport { SetVariablesArgs } from '../graphql/schema'\nimport { DeleteBuilder } from '@contember/database'\nimport { SetVariableCommand } from './SetVariableCommand'\n\nexport type VariablesMap = Record<string, string>\n\nexport class VariablesManager {\n\tpublic async fetchVariables(db: DatabaseContext): Promise<VariablesMap> {\n\t\treturn Object.fromEntries((await db.queryHandler.fetch(new VariablesQuery())).map(it => [it.name, it.value]))\n\t}\n\n\tpublic async setVariables(db: DatabaseContext, args: SetVariablesArgs) {\n\t\treturn await db.transaction(async db => {\n\t\t\tconst current = await this.fetchVariables(db)\n\t\t\tconst mode = args.mode ?? 'MERGE'\n\t\t\tconst inputVariables = Object.fromEntries(args.variables.map(it => [it.name, it.value]))\n\n\t\t\tlet newVariables: VariablesMap = {}\n\t\t\tswitch (mode) {\n\t\t\t\tcase 'APPEND_ONLY_MISSING':\n\t\t\t\t\tnewVariables = { ...inputVariables, ...current }\n\t\t\t\t\tbreak\n\t\t\t\tcase 'MERGE':\n\t\t\t\t\tnewVariables = { ...current, ...inputVariables }\n\t\t\t\t\tbreak\n\t\t\t\tcase 'SET':\n\t\t\t\t\tnewVariables = inputVariables\n\t\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tconst toDelete = Object.keys(current).filter(it => !(it in newVariables))\n\t\t\tif (toDelete.length > 0) {\n\t\t\t\tawait DeleteBuilder.create()\n\t\t\t\t\t.from('actions_variable')\n\t\t\t\t\t.where(it => it.in('name', toDelete))\n\t\t\t\t\t.execute(db.client)\n\t\t\t}\n\n\t\t\tfor (const [name, value] of Object.entries(newVariables)) {\n\t\t\t\tif (value === current[name]) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tawait db.commandBus.execute(new SetVariableCommand(name, value))\n\t\t\t}\n\t\t})\n\t}\n}\n"],"names":["VariablesQuery","db","DeleteBuilder","SetVariableCommand"],"mappings":";;;;;AAQO,MAAM,iBAAiB;AAAA,EAC7B,MAAa,eAAe,IAA4C;AACvE,WAAO,OAAO,aAAa,MAAM,GAAG,aAAa,MAAM,IAAIA,eAAe,eAAA,CAAC,GAAG,IAAI,QAAM,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC;AAAA,EAAA;AAAA,EAG7G,MAAa,aAAa,IAAqB,MAAwB;AACtE,WAAO,MAAM,GAAG,YAAY,OAAMC,QAAM;AACvC,YAAM,UAAU,MAAM,KAAK,eAAeA,GAAE;AACtC,YAAA,OAAO,KAAK,QAAQ;AAC1B,YAAM,iBAAiB,OAAO,YAAY,KAAK,UAAU,IAAI,CAAM,OAAA,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC;AAEvF,UAAI,eAA6B,CAAC;AAClC,cAAQ,MAAM;AAAA,QACb,KAAK;AACJ,yBAAe,EAAE,GAAG,gBAAgB,GAAG,QAAQ;AAC/C;AAAA,QACD,KAAK;AACJ,yBAAe,EAAE,GAAG,SAAS,GAAG,eAAe;AAC/C;AAAA,QACD,KAAK;AACW,yBAAA;AACf;AAAA,MAAA;AAGI,YAAA,WAAW,OAAO,KAAK,OAAO,EAAE,OAAO,CAAA,OAAM,EAAE,MAAM,aAAa;AACpE,UAAA,SAAS,SAAS,GAAG;AACxB,cAAMC,SAAAA,cAAc,OAAO,EACzB,KAAK,kBAAkB,EACvB,MAAM,CAAA,OAAM,GAAG,GAAG,QAAQ,QAAQ,CAAC,EACnC,QAAQD,IAAG,MAAM;AAAA,MAAA;AAGpB,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACrD,YAAA,UAAU,QAAQ,IAAI,GAAG;AAC5B;AAAA,QAAA;AAED,cAAMA,IAAG,WAAW,QAAQ,IAAIE,mBAAAA,mBAAmB,MAAM,KAAK,CAAC;AAAA,MAAA;AAAA,IAChE,CACA;AAAA,EAAA;AAEH;;"}
|