@skedulo/integration-sdk 0.3.4 → 0.4.0
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/CHANGELOG.md +15 -0
- package/README.md +38 -19
- package/dist/actions/action-registry.d.ts.map +1 -1
- package/dist/actions/action-registry.js +27 -23
- package/dist/actions/action-registry.js.map +1 -1
- package/dist/actions/data-flow/activate.action.d.ts +10 -0
- package/dist/actions/data-flow/activate.action.d.ts.map +1 -0
- package/dist/actions/data-flow/activate.action.js +22 -0
- package/dist/actions/data-flow/activate.action.js.map +1 -0
- package/dist/actions/data-flow/create.action.d.ts +9 -0
- package/dist/actions/data-flow/create.action.d.ts.map +1 -0
- package/dist/actions/data-flow/create.action.js +55 -0
- package/dist/actions/data-flow/create.action.js.map +1 -0
- package/dist/actions/data-flow/deactivate.action.d.ts +9 -0
- package/dist/actions/data-flow/deactivate.action.d.ts.map +1 -0
- package/dist/actions/data-flow/deactivate.action.js +21 -0
- package/dist/actions/data-flow/deactivate.action.js.map +1 -0
- package/dist/actions/data-flow/delete.action.d.ts +10 -0
- package/dist/actions/data-flow/delete.action.d.ts.map +1 -0
- package/dist/actions/data-flow/delete.action.js +33 -0
- package/dist/actions/data-flow/delete.action.js.map +1 -0
- package/dist/actions/data-flow/get.action.d.ts +5 -0
- package/dist/actions/data-flow/get.action.d.ts.map +1 -0
- package/dist/actions/data-flow/get.action.js +22 -0
- package/dist/actions/data-flow/get.action.js.map +1 -0
- package/dist/actions/data-flow/index.d.ts +9 -0
- package/dist/actions/data-flow/index.d.ts.map +1 -0
- package/dist/actions/data-flow/index.js +33 -0
- package/dist/actions/data-flow/index.js.map +1 -0
- package/dist/actions/data-flow/list.action.d.ts +6 -0
- package/dist/actions/data-flow/list.action.d.ts.map +1 -0
- package/dist/actions/data-flow/list.action.js +25 -0
- package/dist/actions/data-flow/list.action.js.map +1 -0
- package/dist/actions/data-flow/shared.d.ts +3 -0
- package/dist/actions/data-flow/shared.d.ts.map +1 -0
- package/dist/actions/data-flow/shared.js +16 -0
- package/dist/actions/data-flow/shared.js.map +1 -0
- package/dist/actions/data-flow/types.d.ts +21 -0
- package/dist/actions/data-flow/types.d.ts.map +1 -0
- package/dist/actions/data-flow/types.js +3 -0
- package/dist/actions/data-flow/types.js.map +1 -0
- package/dist/actions/data-flow/update.action.d.ts +16 -0
- package/dist/actions/data-flow/update.action.d.ts.map +1 -0
- package/dist/actions/data-flow/update.action.js +62 -0
- package/dist/actions/data-flow/update.action.js.map +1 -0
- package/dist/actions/data-flow.action.d.ts.map +1 -1
- package/dist/actions/data-flow.action.js +5 -9
- package/dist/actions/data-flow.action.js.map +1 -1
- package/dist/actions/event/index.d.ts +4 -0
- package/dist/actions/event/index.d.ts.map +1 -0
- package/dist/actions/event/index.js +23 -0
- package/dist/actions/event/index.js.map +1 -0
- package/dist/actions/event/on-skedulo.action.d.ts +4 -0
- package/dist/actions/event/on-skedulo.action.d.ts.map +1 -0
- package/dist/actions/event/on-skedulo.action.js +81 -0
- package/dist/actions/event/on-skedulo.action.js.map +1 -0
- package/dist/actions/event/on-vendor.action.d.ts +4 -0
- package/dist/actions/event/on-vendor.action.d.ts.map +1 -0
- package/dist/actions/event/on-vendor.action.js +39 -0
- package/dist/actions/event/on-vendor.action.js.map +1 -0
- package/dist/actions/event/types.d.ts +28 -0
- package/dist/actions/event/types.d.ts.map +1 -0
- package/dist/actions/event/types.js +3 -0
- package/dist/actions/event/types.js.map +1 -0
- package/dist/actions/metadata/get-fields.action.d.ts +5 -0
- package/dist/actions/metadata/get-fields.action.d.ts.map +1 -0
- package/dist/actions/metadata/get-fields.action.js +26 -0
- package/dist/actions/metadata/get-fields.action.js.map +1 -0
- package/dist/actions/metadata/get-objects.action.d.ts +5 -0
- package/dist/actions/metadata/get-objects.action.d.ts.map +1 -0
- package/dist/actions/metadata/get-objects.action.js +18 -0
- package/dist/actions/metadata/get-objects.action.js.map +1 -0
- package/dist/actions/metadata/get-sample-apis.action.d.ts +5 -0
- package/dist/actions/metadata/get-sample-apis.action.d.ts.map +1 -0
- package/dist/actions/metadata/get-sample-apis.action.js +19 -0
- package/dist/actions/metadata/get-sample-apis.action.js.map +1 -0
- package/dist/actions/metadata/get-sample-records.action.d.ts +5 -0
- package/dist/actions/metadata/get-sample-records.action.d.ts.map +1 -0
- package/dist/actions/metadata/get-sample-records.action.js +33 -0
- package/dist/actions/metadata/get-sample-records.action.js.map +1 -0
- package/dist/actions/metadata/get-templates.action.d.ts +5 -0
- package/dist/actions/metadata/get-templates.action.d.ts.map +1 -0
- package/dist/actions/metadata/get-templates.action.js +19 -0
- package/dist/actions/metadata/get-templates.action.js.map +1 -0
- package/dist/actions/metadata/index.d.ts +7 -0
- package/dist/actions/metadata/index.d.ts.map +1 -0
- package/dist/actions/metadata/index.js +29 -0
- package/dist/actions/metadata/index.js.map +1 -0
- package/dist/actions/metadata/shared.d.ts +6 -0
- package/dist/actions/metadata/shared.d.ts.map +1 -0
- package/dist/actions/metadata/shared.js +11 -0
- package/dist/actions/metadata/shared.js.map +1 -0
- package/dist/actions/metadata/types.d.ts +38 -0
- package/dist/actions/metadata/types.d.ts.map +1 -0
- package/dist/actions/metadata/types.js +3 -0
- package/dist/actions/metadata/types.js.map +1 -0
- package/dist/actions/scheduled-job/create.action.d.ts +5 -0
- package/dist/actions/scheduled-job/create.action.d.ts.map +1 -0
- package/dist/actions/scheduled-job/create.action.js +53 -0
- package/dist/actions/scheduled-job/create.action.js.map +1 -0
- package/dist/actions/scheduled-job/delete.action.d.ts +15 -0
- package/dist/actions/scheduled-job/delete.action.d.ts.map +1 -0
- package/dist/actions/scheduled-job/delete.action.js +42 -0
- package/dist/actions/scheduled-job/delete.action.js.map +1 -0
- package/dist/actions/scheduled-job/get.action.d.ts +7 -0
- package/dist/actions/scheduled-job/get.action.d.ts.map +1 -0
- package/dist/actions/scheduled-job/get.action.js +23 -0
- package/dist/actions/scheduled-job/get.action.js.map +1 -0
- package/dist/actions/scheduled-job/index.d.ts +7 -0
- package/dist/actions/scheduled-job/index.d.ts.map +1 -0
- package/dist/actions/scheduled-job/index.js +29 -0
- package/dist/actions/scheduled-job/index.js.map +1 -0
- package/dist/actions/scheduled-job/list.action.d.ts +5 -0
- package/dist/actions/scheduled-job/list.action.d.ts.map +1 -0
- package/dist/actions/scheduled-job/list.action.js +18 -0
- package/dist/actions/scheduled-job/list.action.js.map +1 -0
- package/dist/actions/scheduled-job/shared.d.ts +30 -0
- package/dist/actions/scheduled-job/shared.d.ts.map +1 -0
- package/dist/actions/scheduled-job/shared.js +129 -0
- package/dist/actions/scheduled-job/shared.js.map +1 -0
- package/dist/actions/scheduled-job/types.d.ts +23 -0
- package/dist/actions/scheduled-job/types.d.ts.map +1 -0
- package/dist/actions/scheduled-job/types.js +3 -0
- package/dist/actions/scheduled-job/types.js.map +1 -0
- package/dist/actions/scheduled-job/update.action.d.ts +5 -0
- package/dist/actions/scheduled-job/update.action.d.ts.map +1 -0
- package/dist/actions/scheduled-job/update.action.js +64 -0
- package/dist/actions/scheduled-job/update.action.js.map +1 -0
- package/dist/actions/scheduled-job.action.d.ts +73 -0
- package/dist/actions/scheduled-job.action.d.ts.map +1 -0
- package/dist/actions/scheduled-job.action.js +355 -0
- package/dist/actions/scheduled-job.action.js.map +1 -0
- package/dist/actions/setup.action.js +1 -1
- package/dist/actions/setup.action.js.map +1 -1
- package/dist/actions/sync/index.d.ts +4 -0
- package/dist/actions/sync/index.d.ts.map +1 -0
- package/dist/actions/sync/index.js +23 -0
- package/dist/actions/sync/index.js.map +1 -0
- package/dist/actions/sync/run-flow.action.d.ts +8 -0
- package/dist/actions/sync/run-flow.action.d.ts.map +1 -0
- package/dist/actions/sync/run-flow.action.js +81 -0
- package/dist/actions/sync/run-flow.action.js.map +1 -0
- package/dist/actions/sync/run-job.action.d.ts +11 -0
- package/dist/actions/sync/run-job.action.d.ts.map +1 -0
- package/dist/actions/sync/run-job.action.js +75 -0
- package/dist/actions/sync/run-job.action.js.map +1 -0
- package/dist/actions/sync/types.d.ts +41 -0
- package/dist/actions/sync/types.d.ts.map +1 -0
- package/dist/actions/sync/types.js +3 -0
- package/dist/actions/sync/types.js.map +1 -0
- package/dist/actions/sync.action.d.ts +8 -47
- package/dist/actions/sync.action.d.ts.map +1 -1
- package/dist/actions/sync.action.js +29 -162
- package/dist/actions/sync.action.js.map +1 -1
- package/dist/actions/utils/action-names.d.ts +19 -6
- package/dist/actions/utils/action-names.d.ts.map +1 -1
- package/dist/actions/utils/action-names.js +19 -6
- package/dist/actions/utils/action-names.js.map +1 -1
- package/dist/actions/utils/define-action.d.ts +36 -0
- package/dist/actions/utils/define-action.d.ts.map +1 -0
- package/dist/actions/utils/define-action.js +43 -0
- package/dist/actions/utils/define-action.js.map +1 -0
- package/dist/actions/utils/errors.d.ts +54 -8
- package/dist/actions/utils/errors.d.ts.map +1 -1
- package/dist/actions/utils/errors.js +104 -14
- package/dist/actions/utils/errors.js.map +1 -1
- package/dist/actions/utils/helpers.d.ts.map +1 -1
- package/dist/actions/utils/helpers.js +2 -1
- package/dist/actions/utils/helpers.js.map +1 -1
- package/dist/actions/utils/metrics.d.ts +12 -0
- package/dist/actions/utils/metrics.d.ts.map +1 -0
- package/dist/actions/utils/metrics.js +12 -0
- package/dist/actions/utils/metrics.js.map +1 -0
- package/dist/actions/utils/middleware.d.ts +39 -0
- package/dist/actions/utils/middleware.d.ts.map +1 -0
- package/dist/actions/utils/middleware.js +85 -0
- package/dist/actions/utils/middleware.js.map +1 -0
- package/dist/actions/utils/types.d.ts +5 -4
- package/dist/actions/utils/types.d.ts.map +1 -1
- package/dist/adapters/base-adapter-handler.d.ts +10 -0
- package/dist/adapters/base-adapter-handler.d.ts.map +1 -1
- package/dist/adapters/base-adapter-handler.js +18 -34
- package/dist/adapters/base-adapter-handler.js.map +1 -1
- package/dist/browser.d.ts +2 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +3 -1
- package/dist/browser.js.map +1 -1
- package/dist/clients/integration-config.client.d.ts +21 -0
- package/dist/clients/integration-config.client.d.ts.map +1 -0
- package/dist/clients/integration-config.client.js +44 -0
- package/dist/clients/integration-config.client.js.map +1 -0
- package/dist/context.d.ts +18 -3
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +21 -5
- package/dist/context.js.map +1 -1
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -1
- package/dist/index.js.map +1 -1
- package/dist/interfaces/data-flow-spec.interface.d.ts +14 -21
- package/dist/interfaces/data-flow-spec.interface.d.ts.map +1 -1
- package/dist/interfaces/data-flow-spec.interface.js +10 -26
- package/dist/interfaces/data-flow-spec.interface.js.map +1 -1
- package/dist/interfaces/integration-capabilities.interface.d.ts +2 -2
- package/dist/interfaces/scheduled-job.interface.d.ts +40 -0
- package/dist/interfaces/scheduled-job.interface.d.ts.map +1 -0
- package/dist/interfaces/scheduled-job.interface.js +38 -0
- package/dist/interfaces/scheduled-job.interface.js.map +1 -0
- package/dist/services/dataflow.service.d.ts +13 -6
- package/dist/services/dataflow.service.d.ts.map +1 -1
- package/dist/services/dataflow.service.js +34 -57
- package/dist/services/dataflow.service.js.map +1 -1
- package/dist/services/sync-runner.d.ts +1 -0
- package/dist/services/sync-runner.d.ts.map +1 -1
- package/dist/services/sync-runner.js +7 -27
- package/dist/services/sync-runner.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/artifact-builder.d.ts +40 -15
- package/dist/utils/artifact-builder.d.ts.map +1 -1
- package/dist/utils/artifact-builder.js +92 -17
- package/dist/utils/artifact-builder.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ACTIONS = exports.DATA_FLOW_ID_HEADER = exports.ACTION_HEADER = void 0;
|
|
3
|
+
exports.ACTIONS = exports.SCHEDULED_JOB_NAME_HEADER = exports.DATA_FLOW_ID_HEADER = exports.ACTION_HEADER = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* HTTP header that carries the action name to the dispatcher.
|
|
6
6
|
* Exported so consumers (UI, cross-function clients) don't hardcode it.
|
|
@@ -8,10 +8,18 @@ exports.ACTIONS = exports.DATA_FLOW_ID_HEADER = exports.ACTION_HEADER = void 0;
|
|
|
8
8
|
exports.ACTION_HEADER = 'sked-integration-action';
|
|
9
9
|
/**
|
|
10
10
|
* HTTP header carrying the target flow id for per-flow actions. ElasticServer
|
|
11
|
-
* scheduled webhooks post an empty body
|
|
12
|
-
* the
|
|
11
|
+
* scheduled webhooks post an empty body (and triggered actions a bare array),
|
|
12
|
+
* so the flow id rides on this header; the dispatcher passes it to `parseInput`
|
|
13
|
+
* as `meta.dataFlowId`.
|
|
13
14
|
*/
|
|
14
15
|
exports.DATA_FLOW_ID_HEADER = 'sked-data-flow-id';
|
|
16
|
+
/**
|
|
17
|
+
* HTTP header carrying the target scheduled job's `webhook_name`. The ES
|
|
18
|
+
* scheduled webhook provisioned for a job posts an empty body, so the job
|
|
19
|
+
* identity rides on this header; the dispatcher passes it to `parseInput` as
|
|
20
|
+
* `meta.scheduledJobName`.
|
|
21
|
+
*/
|
|
22
|
+
exports.SCHEDULED_JOB_NAME_HEADER = 'sked-scheduled-job-name';
|
|
15
23
|
/**
|
|
16
24
|
* Wire-format action names, grouped by domain. Use these instead of hardcoded
|
|
17
25
|
* strings on both sides of the dispatcher (SDK + UI / cross-function clients).
|
|
@@ -32,10 +40,15 @@ exports.ACTIONS = Object.freeze({
|
|
|
32
40
|
getSampleRecords: 'metadata.get-sample-records',
|
|
33
41
|
}),
|
|
34
42
|
sync: Object.freeze({
|
|
35
|
-
push: 'sync.push',
|
|
36
|
-
scheduledPull: 'sync.scheduled-pull',
|
|
37
43
|
runFlow: 'sync.run-flow',
|
|
38
|
-
|
|
44
|
+
runJob: 'sync.run-job',
|
|
45
|
+
}),
|
|
46
|
+
scheduledJob: Object.freeze({
|
|
47
|
+
create: 'scheduled-job.create',
|
|
48
|
+
update: 'scheduled-job.update',
|
|
49
|
+
delete: 'scheduled-job.delete',
|
|
50
|
+
list: 'scheduled-job.list',
|
|
51
|
+
get: 'scheduled-job.get',
|
|
39
52
|
}),
|
|
40
53
|
event: Object.freeze({
|
|
41
54
|
onSkedulo: 'event.on-skedulo',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-names.js","sourceRoot":"","sources":["../../../src/actions/utils/action-names.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,aAAa,GAAG,yBAAyB,CAAC;AAEvD
|
|
1
|
+
{"version":3,"file":"action-names.js","sourceRoot":"","sources":["../../../src/actions/utils/action-names.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,aAAa,GAAG,yBAAyB,CAAC;AAEvD;;;;;GAKG;AACU,QAAA,mBAAmB,GAAG,mBAAmB,CAAC;AAEvD;;;;;GAKG;AACU,QAAA,yBAAyB,GAAG,yBAAyB,CAAC;AAEnE;;;;;GAKG;AACU,QAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;IACnC,YAAY,EAAE,cAAc;IAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,cAAc;KACvB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,UAAU,EAAE,sBAAsB;QAClC,SAAS,EAAE,qBAAqB;QAChC,YAAY,EAAE,wBAAwB;QACtC,aAAa,EAAE,0BAA0B;QACzC,gBAAgB,EAAE,6BAA6B;KAChD,CAAC;IACF,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;QAClB,OAAO,EAAE,eAAe;QACxB,MAAM,EAAE,cAAc;KACvB,CAAC;IACF,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC;QAC1B,MAAM,EAAE,sBAAsB;QAC9B,MAAM,EAAE,sBAAsB;QAC9B,MAAM,EAAE,sBAAsB;QAC9B,IAAI,EAAE,oBAAoB;QAC1B,GAAG,EAAE,mBAAmB;KACzB,CAAC;IACF,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACnB,SAAS,EAAE,kBAAkB;QAC7B,QAAQ,EAAE,iBAAiB;KAC5B,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,kBAAkB;QAC1B,QAAQ,EAAE,oBAAoB;QAC9B,UAAU,EAAE,sBAAsB;QAClC,GAAG,EAAE,eAAe;QACpB,IAAI,EAAE,gBAAgB;KACvB,CAAC;CACM,CAAC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { IntegrationContext } from '../../context';
|
|
2
|
+
import { type Middleware } from './middleware';
|
|
3
|
+
import type { Action, ParseMeta } from './types';
|
|
4
|
+
export interface DefineActionOpts<I, O> {
|
|
5
|
+
name: string;
|
|
6
|
+
parseInput: (raw: unknown, meta?: ParseMeta) => I;
|
|
7
|
+
handler: (input: I, ctx: IntegrationContext) => Promise<O>;
|
|
8
|
+
/**
|
|
9
|
+
* Whether the action is safe to retry without side-effect duplication.
|
|
10
|
+
* Echoed via the error envelope (for failures) and surfaced as metadata to
|
|
11
|
+
* the dispatcher. Mutating actions without an idempotency key should be `false`.
|
|
12
|
+
*/
|
|
13
|
+
idempotent?: boolean;
|
|
14
|
+
/** Emit an audit log on success. Set `true` for mutating actions. */
|
|
15
|
+
audit?: boolean;
|
|
16
|
+
/** Gate the handler on admin privileges before running the rest of the chain. */
|
|
17
|
+
requireAdmin?: boolean;
|
|
18
|
+
/** Extra middleware appended after the built-in stack (metrics, logging, audit). */
|
|
19
|
+
middleware?: ReadonlyArray<Middleware>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Build an `Action` with the standard cross-cutting concerns wired in.
|
|
23
|
+
*
|
|
24
|
+
* ```ts
|
|
25
|
+
* defineAction({
|
|
26
|
+
* name: ACTIONS.scheduledJob.create,
|
|
27
|
+
* parseInput: parseCreate,
|
|
28
|
+
* requireAdmin: true,
|
|
29
|
+
* audit: true,
|
|
30
|
+
* idempotent: false,
|
|
31
|
+
* handler: async (input, ctx) => { ... },
|
|
32
|
+
* });
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function defineAction<I, O>(opts: DefineActionOpts<I, O>): Action<I, O>;
|
|
36
|
+
//# sourceMappingURL=define-action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-action.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/define-action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAML,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,WAAW,gBAAgB,CAAC,CAAC,EAAE,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,KAAK,CAAC,CAAC;IAClD,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3D;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qEAAqE;IACrE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iFAAiF;IACjF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oFAAoF;IACpF,UAAU,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CACxC;AAYD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAW7E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defineAction = defineAction;
|
|
4
|
+
const middleware_1 = require("./middleware");
|
|
5
|
+
/**
|
|
6
|
+
* Stock middleware order (outermost → innermost):
|
|
7
|
+
* metrics → logging → audit → [requireAdmin?] → [extras...] → handler
|
|
8
|
+
*
|
|
9
|
+
* Metrics outermost so failures still record counters. Logging just inside so
|
|
10
|
+
* the start/end log lines bracket business logic. Audit only fires on success,
|
|
11
|
+
* after the handler returns.
|
|
12
|
+
*/
|
|
13
|
+
const DEFAULT_MIDDLEWARE = [middleware_1.withMetrics, middleware_1.withLogging, middleware_1.withAudit];
|
|
14
|
+
/**
|
|
15
|
+
* Build an `Action` with the standard cross-cutting concerns wired in.
|
|
16
|
+
*
|
|
17
|
+
* ```ts
|
|
18
|
+
* defineAction({
|
|
19
|
+
* name: ACTIONS.scheduledJob.create,
|
|
20
|
+
* parseInput: parseCreate,
|
|
21
|
+
* requireAdmin: true,
|
|
22
|
+
* audit: true,
|
|
23
|
+
* idempotent: false,
|
|
24
|
+
* handler: async (input, ctx) => { ... },
|
|
25
|
+
* });
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
function defineAction(opts) {
|
|
29
|
+
var _a, _b;
|
|
30
|
+
const meta = {
|
|
31
|
+
actionName: opts.name,
|
|
32
|
+
idempotent: (_a = opts.idempotent) !== null && _a !== void 0 ? _a : false,
|
|
33
|
+
audit: (_b = opts.audit) !== null && _b !== void 0 ? _b : false,
|
|
34
|
+
};
|
|
35
|
+
const stack = [...DEFAULT_MIDDLEWARE];
|
|
36
|
+
if (opts.requireAdmin)
|
|
37
|
+
stack.push(middleware_1.requireAdmin);
|
|
38
|
+
if (opts.middleware)
|
|
39
|
+
stack.push(...opts.middleware);
|
|
40
|
+
const composed = (0, middleware_1.compose)(stack, opts.handler, meta);
|
|
41
|
+
return { name: opts.name, parseInput: opts.parseInput, handler: composed };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=define-action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-action.js","sourceRoot":"","sources":["../../../src/actions/utils/define-action.ts"],"names":[],"mappings":";;AAqDA,oCAWC;AA/DD,6CAOsB;AAqBtB;;;;;;;GAOG;AACH,MAAM,kBAAkB,GAA8B,CAAC,wBAAW,EAAE,wBAAW,EAAE,sBAAS,CAAC,CAAC;AAE5F;;;;;;;;;;;;;GAaG;AACH,SAAgB,YAAY,CAAO,IAA4B;;IAC7D,MAAM,IAAI,GAAG;QACX,UAAU,EAAE,IAAI,CAAC,IAAI;QACrB,UAAU,EAAE,MAAA,IAAI,CAAC,UAAU,mCAAI,KAAK;QACpC,KAAK,EAAE,MAAA,IAAI,CAAC,KAAK,mCAAI,KAAK;KAC3B,CAAC;IACF,MAAM,KAAK,GAAiB,CAAC,GAAG,kBAAkB,CAAC,CAAC;IACpD,IAAI,IAAI,CAAC,YAAY;QAAE,KAAK,CAAC,IAAI,CAAC,yBAAc,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAA,oBAAO,EAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACpD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC7E,CAAC"}
|
|
@@ -1,18 +1,64 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Coarse-grained error category. Drives HTTP status mapping at the dispatcher
|
|
3
|
+
* and the `retryable` signal echoed in the failure envelope so callers (PSS,
|
|
4
|
+
* IS, UI) know whether to back off and retry.
|
|
3
5
|
*/
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
export type ErrorCategory = 'invalid_input' | 'forbidden' | 'not_found' | 'conflict' | 'precondition_failed' | 'upstream_transient' | 'upstream_permanent' | 'not_implemented' | 'internal';
|
|
7
|
+
/** Default HTTP status per category. */
|
|
8
|
+
export declare function categoryToStatus(c: ErrorCategory): number;
|
|
9
|
+
/** Default retryability per category. Only transient upstream failures retry. */
|
|
10
|
+
export declare function categoryRetryable(c: ErrorCategory): boolean;
|
|
11
|
+
interface ActionErrorOpts {
|
|
12
|
+
category?: ErrorCategory;
|
|
13
|
+
retryable?: boolean;
|
|
14
|
+
cause?: unknown;
|
|
8
15
|
}
|
|
9
16
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
17
|
+
* Base class for all structured action failures. Throw a typed subclass
|
|
18
|
+
* (`InvalidInputError`, `ForbiddenError`, `NotFoundError`, …) — they pre-set
|
|
19
|
+
* `category` so HTTP status and retry signaling are automatic.
|
|
12
20
|
*/
|
|
13
21
|
export declare class ActionError extends Error {
|
|
14
22
|
readonly code: string;
|
|
15
23
|
readonly details?: unknown | undefined;
|
|
16
|
-
|
|
24
|
+
/** Coarse category — drives HTTP status and `retryable`. */
|
|
25
|
+
readonly category: ErrorCategory;
|
|
26
|
+
/** Whether a retry could succeed. Defaults from `category`. */
|
|
27
|
+
readonly retryable: boolean;
|
|
28
|
+
constructor(code: string, message: string, details?: unknown | undefined, opts?: ActionErrorOpts);
|
|
29
|
+
}
|
|
30
|
+
/** Throw from `parseInput` (or a handler) when the input is malformed. */
|
|
31
|
+
export declare class InvalidInputError extends ActionError {
|
|
32
|
+
constructor(message: string, details?: unknown);
|
|
33
|
+
}
|
|
34
|
+
export declare class ForbiddenError extends ActionError {
|
|
35
|
+
constructor(message: string, details?: unknown);
|
|
36
|
+
}
|
|
37
|
+
export declare class NotFoundError extends ActionError {
|
|
38
|
+
constructor(code: string, message: string, details?: unknown);
|
|
39
|
+
}
|
|
40
|
+
export declare class ConflictError extends ActionError {
|
|
41
|
+
constructor(code: string, message: string, details?: unknown);
|
|
42
|
+
}
|
|
43
|
+
export declare class PreconditionFailedError extends ActionError {
|
|
44
|
+
constructor(code: string, message: string, details?: unknown);
|
|
45
|
+
}
|
|
46
|
+
/** Vendor/IS responded with a transient failure (5xx, network, timeout). Safe to retry. */
|
|
47
|
+
export declare class UpstreamTransientError extends ActionError {
|
|
48
|
+
constructor(message: string, opts?: {
|
|
49
|
+
cause?: unknown;
|
|
50
|
+
details?: unknown;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/** Vendor/IS rejected the request permanently (4xx semantics). Don't retry. */
|
|
54
|
+
export declare class UpstreamPermanentError extends ActionError {
|
|
55
|
+
constructor(message: string, opts?: {
|
|
56
|
+
cause?: unknown;
|
|
57
|
+
details?: unknown;
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
export declare class NotImplementedError extends ActionError {
|
|
61
|
+
constructor(message: string, details?: unknown);
|
|
17
62
|
}
|
|
63
|
+
export {};
|
|
18
64
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/errors.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACrB,eAAe,GACf,WAAW,GACX,WAAW,GACX,UAAU,GACV,qBAAqB,GACrB,oBAAoB,GACpB,oBAAoB,GACpB,iBAAiB,GACjB,UAAU,CAAC;AAEf,wCAAwC;AACxC,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAqBzD;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,aAAa,GAAG,OAAO,CAE3D;AAED,UAAU,eAAe;IACvB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,qBAAa,WAAY,SAAQ,KAAK;aAOlB,IAAI,EAAE,MAAM;aAEZ,OAAO,CAAC,EAAE,OAAO;IARnC,4DAA4D;IAC5D,SAAgB,QAAQ,EAAE,aAAa,CAAC;IACxC,+DAA+D;IAC/D,SAAgB,SAAS,EAAE,OAAO,CAAC;gBAGjB,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,OAAO,YAAA,EACjC,IAAI,GAAE,eAAoB;CAW7B;AAED,0EAA0E;AAC1E,qBAAa,iBAAkB,SAAQ,WAAW;gBACpC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI/C;AAED,qBAAa,cAAe,SAAQ,WAAW;gBACjC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI/C;AAED,qBAAa,aAAc,SAAQ,WAAW;gBAChC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI7D;AAED,qBAAa,aAAc,SAAQ,WAAW;gBAChC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI7D;AAED,qBAAa,uBAAwB,SAAQ,WAAW;gBAC1C,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI7D;AAED,2FAA2F;AAC3F,qBAAa,sBAAuB,SAAQ,WAAW;gBACzC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO;CAO/E;AAED,+EAA+E;AAC/E,qBAAa,sBAAuB,SAAQ,WAAW;gBACzC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO;CAO/E;AAED,qBAAa,mBAAoB,SAAQ,WAAW;gBACtC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI/C"}
|
|
@@ -1,29 +1,119 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
3
|
+
exports.NotImplementedError = exports.UpstreamPermanentError = exports.UpstreamTransientError = exports.PreconditionFailedError = exports.ConflictError = exports.NotFoundError = exports.ForbiddenError = exports.InvalidInputError = exports.ActionError = void 0;
|
|
4
|
+
exports.categoryToStatus = categoryToStatus;
|
|
5
|
+
exports.categoryRetryable = categoryRetryable;
|
|
6
|
+
/** Default HTTP status per category. */
|
|
7
|
+
function categoryToStatus(c) {
|
|
8
|
+
switch (c) {
|
|
9
|
+
case 'invalid_input':
|
|
10
|
+
return 422;
|
|
11
|
+
case 'forbidden':
|
|
12
|
+
return 403;
|
|
13
|
+
case 'not_found':
|
|
14
|
+
return 404;
|
|
15
|
+
case 'conflict':
|
|
16
|
+
return 409;
|
|
17
|
+
case 'precondition_failed':
|
|
18
|
+
return 412;
|
|
19
|
+
case 'upstream_transient':
|
|
20
|
+
return 503;
|
|
21
|
+
case 'upstream_permanent':
|
|
22
|
+
return 502;
|
|
23
|
+
case 'not_implemented':
|
|
24
|
+
return 501;
|
|
25
|
+
case 'internal':
|
|
26
|
+
return 500;
|
|
13
27
|
}
|
|
14
28
|
}
|
|
15
|
-
|
|
29
|
+
/** Default retryability per category. Only transient upstream failures retry. */
|
|
30
|
+
function categoryRetryable(c) {
|
|
31
|
+
return c === 'upstream_transient';
|
|
32
|
+
}
|
|
16
33
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
34
|
+
* Base class for all structured action failures. Throw a typed subclass
|
|
35
|
+
* (`InvalidInputError`, `ForbiddenError`, `NotFoundError`, …) — they pre-set
|
|
36
|
+
* `category` so HTTP status and retry signaling are automatic.
|
|
19
37
|
*/
|
|
20
38
|
class ActionError extends Error {
|
|
21
|
-
constructor(code, message, details) {
|
|
39
|
+
constructor(code, message, details, opts = {}) {
|
|
40
|
+
var _a, _b;
|
|
22
41
|
super(message);
|
|
23
42
|
this.code = code;
|
|
24
43
|
this.details = details;
|
|
25
44
|
this.name = 'ActionError';
|
|
45
|
+
this.category = (_a = opts.category) !== null && _a !== void 0 ? _a : 'internal';
|
|
46
|
+
this.retryable = (_b = opts.retryable) !== null && _b !== void 0 ? _b : categoryRetryable(this.category);
|
|
47
|
+
if (opts.cause !== undefined) {
|
|
48
|
+
// Use ES2022 Error.cause — preserves the underlying stack across rewraps.
|
|
49
|
+
this.cause = opts.cause;
|
|
50
|
+
}
|
|
26
51
|
}
|
|
27
52
|
}
|
|
28
53
|
exports.ActionError = ActionError;
|
|
54
|
+
/** Throw from `parseInput` (or a handler) when the input is malformed. */
|
|
55
|
+
class InvalidInputError extends ActionError {
|
|
56
|
+
constructor(message, details) {
|
|
57
|
+
super('INVALID_INPUT', message, details, { category: 'invalid_input' });
|
|
58
|
+
this.name = 'InvalidInputError';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.InvalidInputError = InvalidInputError;
|
|
62
|
+
class ForbiddenError extends ActionError {
|
|
63
|
+
constructor(message, details) {
|
|
64
|
+
super('FORBIDDEN', message, details, { category: 'forbidden' });
|
|
65
|
+
this.name = 'ForbiddenError';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.ForbiddenError = ForbiddenError;
|
|
69
|
+
class NotFoundError extends ActionError {
|
|
70
|
+
constructor(code, message, details) {
|
|
71
|
+
super(code, message, details, { category: 'not_found' });
|
|
72
|
+
this.name = 'NotFoundError';
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.NotFoundError = NotFoundError;
|
|
76
|
+
class ConflictError extends ActionError {
|
|
77
|
+
constructor(code, message, details) {
|
|
78
|
+
super(code, message, details, { category: 'conflict' });
|
|
79
|
+
this.name = 'ConflictError';
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
exports.ConflictError = ConflictError;
|
|
83
|
+
class PreconditionFailedError extends ActionError {
|
|
84
|
+
constructor(code, message, details) {
|
|
85
|
+
super(code, message, details, { category: 'precondition_failed' });
|
|
86
|
+
this.name = 'PreconditionFailedError';
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
exports.PreconditionFailedError = PreconditionFailedError;
|
|
90
|
+
/** Vendor/IS responded with a transient failure (5xx, network, timeout). Safe to retry. */
|
|
91
|
+
class UpstreamTransientError extends ActionError {
|
|
92
|
+
constructor(message, opts = {}) {
|
|
93
|
+
super('UPSTREAM_TRANSIENT', message, opts.details, {
|
|
94
|
+
category: 'upstream_transient',
|
|
95
|
+
cause: opts.cause,
|
|
96
|
+
});
|
|
97
|
+
this.name = 'UpstreamTransientError';
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.UpstreamTransientError = UpstreamTransientError;
|
|
101
|
+
/** Vendor/IS rejected the request permanently (4xx semantics). Don't retry. */
|
|
102
|
+
class UpstreamPermanentError extends ActionError {
|
|
103
|
+
constructor(message, opts = {}) {
|
|
104
|
+
super('UPSTREAM_PERMANENT', message, opts.details, {
|
|
105
|
+
category: 'upstream_permanent',
|
|
106
|
+
cause: opts.cause,
|
|
107
|
+
});
|
|
108
|
+
this.name = 'UpstreamPermanentError';
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.UpstreamPermanentError = UpstreamPermanentError;
|
|
112
|
+
class NotImplementedError extends ActionError {
|
|
113
|
+
constructor(message, details) {
|
|
114
|
+
super('NOT_IMPLEMENTED', message, details, { category: 'not_implemented' });
|
|
115
|
+
this.name = 'NotImplementedError';
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.NotImplementedError = NotImplementedError;
|
|
29
119
|
//# sourceMappingURL=errors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/actions/utils/errors.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/actions/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAElE,OAAO,EAAE,cAAc,EAAkB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAElE,OAAO,EAAE,cAAc,EAAkB,MAAM,iBAAiB,CAAC;AAGjE;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAKtC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAEtE"}
|
|
@@ -4,6 +4,7 @@ exports.resolveSystem = resolveSystem;
|
|
|
4
4
|
exports.resolveLookupStrategy = resolveLookupStrategy;
|
|
5
5
|
const skedulo_adapter_1 = require("../../adapters/skedulo.adapter");
|
|
6
6
|
const constants_1 = require("../../constants");
|
|
7
|
+
const errors_1 = require("./errors");
|
|
7
8
|
/**
|
|
8
9
|
* Resolve the adapter for the system named in an action's input. Falls back
|
|
9
10
|
* to the action's own integrationType when `system` is omitted.
|
|
@@ -17,7 +18,7 @@ function resolveSystem(adapter, inputSystem) {
|
|
|
17
18
|
return { system, adapter: skedulo_adapter_1.skeduloAdapter };
|
|
18
19
|
if (system === adapter.integrationType)
|
|
19
20
|
return { system, adapter };
|
|
20
|
-
throw new
|
|
21
|
+
throw new errors_1.InvalidInputError(`Unknown system: ${system}`);
|
|
21
22
|
}
|
|
22
23
|
/**
|
|
23
24
|
* Resolve the configured lookup strategy on an adapter, defaulting to ExternalId.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/actions/utils/helpers.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/actions/utils/helpers.ts"],"names":[],"mappings":";;AAYA,sCAQC;AAKD,sDAEC;AA1BD,oEAAgE;AAChE,+CAAiE;AACjE,qCAA6C;AAE7C;;;;;;GAMG;AACH,SAAgB,aAAa,CAC3B,OAAgB,EAChB,WAA+B;IAE/B,MAAM,MAAM,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,OAAO,CAAC,eAAe,CAAC;IACtD,IAAI,MAAM,KAAK,0BAAc;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,gCAAc,EAAE,CAAC;IAC1E,IAAI,MAAM,KAAK,OAAO,CAAC,eAAe;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACnE,MAAM,IAAI,0BAAiB,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,OAAgB;;IACpD,OAAO,MAAA,MAAA,OAAO,CAAC,YAAY,0CAAE,cAAc,mCAAI,0BAAc,CAAC,UAAU,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal metrics surface so actions can emit counters/histograms without
|
|
3
|
+
* coupling to a specific backend (StatsD, OTel, Datadog). Tenant functions
|
|
4
|
+
* inject a real impl via `BaseAdapterHandlerConfig.metrics`; the SDK defaults
|
|
5
|
+
* to a no-op.
|
|
6
|
+
*/
|
|
7
|
+
export interface Metrics {
|
|
8
|
+
counter(name: string, value: number, tags?: Record<string, string>): void;
|
|
9
|
+
histogram(name: string, value: number, tags?: Record<string, string>): void;
|
|
10
|
+
}
|
|
11
|
+
export declare const noopMetrics: Metrics;
|
|
12
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/metrics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC1E,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CAC7E;AAED,eAAO,MAAM,WAAW,EAAE,OAOzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/actions/utils/metrics.ts"],"names":[],"mappings":";;;AAWa,QAAA,WAAW,GAAY;IAClC,OAAO;QACL,WAAW;IACb,CAAC;IACD,SAAS;QACP,WAAW;IACb,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { IntegrationContext } from '../../context';
|
|
2
|
+
/** The (input, ctx) → result function that middleware wraps. */
|
|
3
|
+
export type ActionHandler<I, O> = (input: I, ctx: IntegrationContext) => Promise<O>;
|
|
4
|
+
/** Metadata available to every middleware. Set once at definition time. */
|
|
5
|
+
export interface MiddlewareMeta {
|
|
6
|
+
actionName: string;
|
|
7
|
+
/** Safe to retry without side effects. */
|
|
8
|
+
idempotent: boolean;
|
|
9
|
+
/** Emit an audit log line on success. */
|
|
10
|
+
audit: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A middleware wraps `next` and returns a new handler. Order is outer-to-inner:
|
|
14
|
+
* `compose([A, B], handler)` runs A → B → handler.
|
|
15
|
+
*/
|
|
16
|
+
export type Middleware = <I, O>(next: ActionHandler<I, O>, meta: MiddlewareMeta) => ActionHandler<I, O>;
|
|
17
|
+
export declare function compose<I, O>(middlewares: ReadonlyArray<Middleware>, handler: ActionHandler<I, O>, meta: MiddlewareMeta): ActionHandler<I, O>;
|
|
18
|
+
/**
|
|
19
|
+
* Log structured start/end lines for every action. Failure lines include the
|
|
20
|
+
* error code and message; the requestId threads through to downstream services.
|
|
21
|
+
*/
|
|
22
|
+
export declare const withLogging: Middleware;
|
|
23
|
+
/**
|
|
24
|
+
* Emit a counter per (action, status[, code]) and a duration histogram. Tags
|
|
25
|
+
* stay low-cardinality — `code` is bounded by the error taxonomy.
|
|
26
|
+
*/
|
|
27
|
+
export declare const withMetrics: Middleware;
|
|
28
|
+
/**
|
|
29
|
+
* Emit a single audit line on success when `meta.audit` is true. Mutating
|
|
30
|
+
* actions opt in via `defineAction({ audit: true })`. Failures are not audited
|
|
31
|
+
* (a rejected mutation didn't happen) — they show up in the standard logs.
|
|
32
|
+
*/
|
|
33
|
+
export declare const withAudit: Middleware;
|
|
34
|
+
/**
|
|
35
|
+
* Gate the handler on admin privileges. Failure raises `ForbiddenError` so the
|
|
36
|
+
* dispatcher returns 403 and the error envelope is consistent across actions.
|
|
37
|
+
*/
|
|
38
|
+
export declare const requireAdmin: Middleware;
|
|
39
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAIxD,gEAAgE;AAChE,MAAM,MAAM,aAAa,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAEpF,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,UAAU,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC,EAC5B,IAAI,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EACzB,IAAI,EAAE,cAAc,KACjB,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEzB,wBAAgB,OAAO,CAAC,CAAC,EAAE,CAAC,EAC1B,WAAW,EAAE,aAAa,CAAC,UAAU,CAAC,EACtC,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAC5B,IAAI,EAAE,cAAc,GACnB,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAErB;AAID;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,UAsBzB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,UAezB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,UAUvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,UAK1B,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.requireAdmin = exports.withAudit = exports.withMetrics = exports.withLogging = void 0;
|
|
4
|
+
exports.compose = compose;
|
|
5
|
+
const helpers_1 = require("../../utils/helpers");
|
|
6
|
+
const errors_1 = require("./errors");
|
|
7
|
+
function compose(middlewares, handler, meta) {
|
|
8
|
+
return middlewares.reduceRight((next, mw) => mw(next, meta), handler);
|
|
9
|
+
}
|
|
10
|
+
// ── stock middlewares ────────────────────────────────────────────────────────
|
|
11
|
+
/**
|
|
12
|
+
* Log structured start/end lines for every action. Failure lines include the
|
|
13
|
+
* error code and message; the requestId threads through to downstream services.
|
|
14
|
+
*/
|
|
15
|
+
const withLogging = (next, meta) => async (input, ctx) => {
|
|
16
|
+
var _a, _b;
|
|
17
|
+
const startedAt = Date.now();
|
|
18
|
+
ctx.logger.info(`[action.start] name=${meta.actionName} requestId=${ctx.requestId} ` +
|
|
19
|
+
`idempotent=${meta.idempotent}`);
|
|
20
|
+
try {
|
|
21
|
+
const result = await next(input, ctx);
|
|
22
|
+
ctx.logger.info(`[action.end] name=${meta.actionName} requestId=${ctx.requestId} ` +
|
|
23
|
+
`status=ok duration_ms=${Date.now() - startedAt}`);
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
const e = err;
|
|
28
|
+
ctx.logger.warn(`[action.end] name=${meta.actionName} requestId=${ctx.requestId} ` +
|
|
29
|
+
`status=error duration_ms=${Date.now() - startedAt} ` +
|
|
30
|
+
`code=${(_a = e.code) !== null && _a !== void 0 ? _a : 'INTERNAL'} message=${(_b = e.message) !== null && _b !== void 0 ? _b : String(err)}`);
|
|
31
|
+
throw err;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
exports.withLogging = withLogging;
|
|
35
|
+
/**
|
|
36
|
+
* Emit a counter per (action, status[, code]) and a duration histogram. Tags
|
|
37
|
+
* stay low-cardinality — `code` is bounded by the error taxonomy.
|
|
38
|
+
*/
|
|
39
|
+
const withMetrics = (next, meta) => async (input, ctx) => {
|
|
40
|
+
var _a;
|
|
41
|
+
const startedAt = Date.now();
|
|
42
|
+
try {
|
|
43
|
+
const result = await next(input, ctx);
|
|
44
|
+
const dur = Date.now() - startedAt;
|
|
45
|
+
ctx.metrics.counter('action.calls', 1, { name: meta.actionName, status: 'ok' });
|
|
46
|
+
ctx.metrics.histogram('action.duration_ms', dur, { name: meta.actionName, status: 'ok' });
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
const dur = Date.now() - startedAt;
|
|
51
|
+
const code = (_a = err.code) !== null && _a !== void 0 ? _a : 'INTERNAL';
|
|
52
|
+
ctx.metrics.counter('action.calls', 1, { name: meta.actionName, status: 'error', code });
|
|
53
|
+
ctx.metrics.histogram('action.duration_ms', dur, { name: meta.actionName, status: 'error' });
|
|
54
|
+
throw err;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
exports.withMetrics = withMetrics;
|
|
58
|
+
/**
|
|
59
|
+
* Emit a single audit line on success when `meta.audit` is true. Mutating
|
|
60
|
+
* actions opt in via `defineAction({ audit: true })`. Failures are not audited
|
|
61
|
+
* (a rejected mutation didn't happen) — they show up in the standard logs.
|
|
62
|
+
*/
|
|
63
|
+
const withAudit = (next, meta) => async (input, ctx) => {
|
|
64
|
+
var _a, _b, _c;
|
|
65
|
+
if (!meta.audit)
|
|
66
|
+
return next(input, ctx);
|
|
67
|
+
const result = await next(input, ctx);
|
|
68
|
+
const tenantId = (_c = (_b = (_a = ctx.skedContext) === null || _a === void 0 ? void 0 : _a.tenant) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : 'unknown';
|
|
69
|
+
ctx.logger.info(`[audit] action=${meta.actionName} tenant=${tenantId} ` +
|
|
70
|
+
`requestId=${ctx.requestId} integration=${ctx.integrationType}`);
|
|
71
|
+
return result;
|
|
72
|
+
};
|
|
73
|
+
exports.withAudit = withAudit;
|
|
74
|
+
/**
|
|
75
|
+
* Gate the handler on admin privileges. Failure raises `ForbiddenError` so the
|
|
76
|
+
* dispatcher returns 403 and the error envelope is consistent across actions.
|
|
77
|
+
*/
|
|
78
|
+
const requireAdmin = (next, meta) => async (input, ctx) => {
|
|
79
|
+
if (!(0, helpers_1.isAdminRequest)(ctx.skedContext)) {
|
|
80
|
+
throw new errors_1.ForbiddenError(`${meta.actionName} requires admin privileges`);
|
|
81
|
+
}
|
|
82
|
+
return next(input, ctx);
|
|
83
|
+
};
|
|
84
|
+
exports.requireAdmin = requireAdmin;
|
|
85
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/actions/utils/middleware.ts"],"names":[],"mappings":";;;AAyBA,0BAMC;AA9BD,iDAAqD;AACrD,qCAA0C;AAuB1C,SAAgB,OAAO,CACrB,WAAsC,EACtC,OAA4B,EAC5B,IAAoB;IAEpB,OAAO,WAAW,CAAC,WAAW,CAAsB,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;AAC7F,CAAC;AAED,gFAAgF;AAEhF;;;GAGG;AACI,MAAM,WAAW,GAAe,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;;IAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,uBAAuB,IAAI,CAAC,UAAU,cAAc,GAAG,CAAC,SAAS,GAAG;QAClE,cAAc,IAAI,CAAC,UAAU,EAAE,CAClC,CAAC;IACF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACtC,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,qBAAqB,IAAI,CAAC,UAAU,cAAc,GAAG,CAAC,SAAS,GAAG;YAChE,yBAAyB,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CACpD,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAA0C,CAAC;QACrD,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,qBAAqB,IAAI,CAAC,UAAU,cAAc,GAAG,CAAC,SAAS,GAAG;YAChE,4BAA4B,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG;YACrD,QAAQ,MAAA,CAAC,CAAC,IAAI,mCAAI,UAAU,YAAY,MAAA,CAAC,CAAC,OAAO,mCAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CACrE,CAAC;QACF,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAtBW,QAAA,WAAW,eAsBtB;AAEF;;;GAGG;AACI,MAAM,WAAW,GAAe,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;;IAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACnC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAChF,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,oBAAoB,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1F,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACnC,MAAM,IAAI,GAAG,MAAC,GAAyB,CAAC,IAAI,mCAAI,UAAU,CAAC;QAC3D,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACzF,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,oBAAoB,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7F,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAfW,QAAA,WAAW,eAetB;AAEF;;;;GAIG;AACI,MAAM,SAAS,GAAe,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;;IACxE,IAAI,CAAC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtC,MAAM,QAAQ,GACZ,MAAA,MAAA,MAAC,GAAG,CAAC,WAAwD,0CAAE,MAAM,0CAAE,EAAE,mCAAI,SAAS,CAAC;IACzF,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,kBAAkB,IAAI,CAAC,UAAU,WAAW,QAAQ,GAAG;QACrD,aAAa,GAAG,CAAC,SAAS,gBAAgB,GAAG,CAAC,eAAe,EAAE,CAClE,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAVW,QAAA,SAAS,aAUpB;AAEF;;;GAGG;AACI,MAAM,YAAY,GAAe,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;IAC3E,IAAI,CAAC,IAAA,wBAAc,EAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,uBAAc,CAAC,GAAG,IAAI,CAAC,UAAU,4BAA4B,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC1B,CAAC,CAAC;AALW,QAAA,YAAY,gBAKvB"}
|
|
@@ -17,6 +17,8 @@ export interface ActionFailure {
|
|
|
17
17
|
code: string;
|
|
18
18
|
message: string;
|
|
19
19
|
details?: unknown;
|
|
20
|
+
/** Whether the caller may retry. Set when the thrown error carries a category. */
|
|
21
|
+
retryable?: boolean;
|
|
20
22
|
};
|
|
21
23
|
}
|
|
22
24
|
export type ActionResult<T> = ActionSuccess<T> | ActionFailure;
|
|
@@ -29,6 +31,8 @@ export type ActionResult<T> = ActionSuccess<T> | ActionFailure;
|
|
|
29
31
|
export interface ParseMeta {
|
|
30
32
|
/** From the `sked-data-flow-id` header. */
|
|
31
33
|
dataFlowId?: number;
|
|
34
|
+
/** From the `sked-scheduled-job-name` header (a job's `webhook_name`). */
|
|
35
|
+
scheduledJobName?: string;
|
|
32
36
|
}
|
|
33
37
|
/**
|
|
34
38
|
* One registered action. The registry holds a map of name → Action.
|
|
@@ -51,9 +55,6 @@ export interface Action<TInput, TOutput> {
|
|
|
51
55
|
*/
|
|
52
56
|
handler: (input: TInput, ctx: IntegrationContext) => Promise<TOutput>;
|
|
53
57
|
}
|
|
54
|
-
/**
|
|
55
|
-
* The registry is keyed by action name. Action types are erased here —
|
|
56
|
-
* the typed dispatch client (Task 10) re-introduces type-level inference.
|
|
57
|
-
*/
|
|
58
|
+
/** Registry keyed by action name; action input/output types are erased here. */
|
|
58
59
|
export type ActionRegistry = Map<string, Action<any, any>>;
|
|
59
60
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,CAAC,CAAC;CACX;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,CAAC,CAAC;CACX;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,kFAAkF;QAClF,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;CACH;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO;IACrC,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,UAAU,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,KAAK,MAAM,CAAC;IACvD;;;OAGG;IACH,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,kBAAkB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACvE;AAED,gFAAgF;AAChF,MAAM,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC"}
|