@skedulo/integration-sdk 0.4.0 → 0.5.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 +9 -0
- package/README.md +46 -1
- package/dist/actions/event/on-vendor.action.d.ts.map +1 -1
- package/dist/actions/event/on-vendor.action.js +6 -2
- package/dist/actions/event/on-vendor.action.js.map +1 -1
- package/dist/actions/scheduled-job/create.action.d.ts.map +1 -1
- package/dist/actions/scheduled-job/create.action.js +5 -2
- package/dist/actions/scheduled-job/create.action.js.map +1 -1
- package/dist/actions/scheduled-job/update.action.d.ts.map +1 -1
- package/dist/actions/scheduled-job/update.action.js +6 -2
- package/dist/actions/scheduled-job/update.action.js.map +1 -1
- package/dist/actions/utils/errors.d.ts.map +1 -1
- package/dist/actions/utils/errors.js +4 -1
- package/dist/actions/utils/errors.js.map +1 -1
- package/dist/interfaces/scheduled-job.interface.d.ts.map +1 -1
- package/dist/interfaces/scheduled-job.interface.js +2 -1
- package/dist/interfaces/scheduled-job.interface.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.5.0]
|
|
4
|
+
|
|
5
|
+
**Action framework: typed errors, middleware, observability hooks.**
|
|
6
|
+
|
|
7
|
+
- `defineAction({ name, parseInput, handler, idempotent?, audit?, requireAdmin? })` wires a fixed middleware stack (metrics → logging → audit → requireAdmin) around each handler so cross-cutting concerns live in one place. Migrated `scheduled-job.{list,create}` as the reference; remaining actions keep their existing factory shape and still benefit from the dispatcher's new error mapping.
|
|
8
|
+
- Typed error hierarchy with `ErrorCategory` — `InvalidInputError`, `ForbiddenError`, `NotFoundError`, `ConflictError`, `PreconditionFailedError`, `NotImplementedError`, `UpstreamTransientError`, `UpstreamPermanentError`. Each carries the category that drives HTTP status (`categoryToStatus`) and a `retryable` flag echoed in the failure envelope. The dispatcher's hard-coded code switch is gone; bare `ActionError` now defaults to `internal` (500).
|
|
9
|
+
- `IntegrationContext` gains `requestId` (from `sked-request-id` header or auto-minted UUID) and `metrics` (pluggable `Metrics` sink; `noopMetrics` default). `BaseAdapterHandlerConfig` accepts a `metrics` impl.
|
|
10
|
+
- `actions/` restructured into one folder per group (`data-flow/`, `event/`, `metadata/`, `scheduled-job/`, `sync/`), one file per action, with `types.ts` + `shared.ts`. `capabilities` and `setup` stay flat (single-action groups).
|
|
11
|
+
|
|
3
12
|
## [0.4.0] - 2026-05-28
|
|
4
13
|
|
|
5
14
|
**Integration-level scheduled jobs replace per-flow scheduled webhooks.**
|
package/README.md
CHANGED
|
@@ -87,9 +87,14 @@ Tenant integration functions expose a **single POST endpoint** that forwards the
|
|
|
87
87
|
```ts
|
|
88
88
|
type ActionResult<T> =
|
|
89
89
|
| { ok: true; result: T }
|
|
90
|
-
| {
|
|
90
|
+
| {
|
|
91
|
+
ok: false;
|
|
92
|
+
error: { code: string; message: string; details?: unknown; retryable?: boolean };
|
|
93
|
+
};
|
|
91
94
|
```
|
|
92
95
|
|
|
96
|
+
`retryable` tells callers (PSS, IS, UI) whether a retry could succeed. It comes from the thrown error's `ErrorCategory` — see [Errors](#errors) below.
|
|
97
|
+
|
|
93
98
|
### Server wiring
|
|
94
99
|
|
|
95
100
|
```typescript
|
|
@@ -142,6 +147,46 @@ const flow = await dispatch(ACTIONS.dataFlow.activate, { id: 42 });
|
|
|
142
147
|
|
|
143
148
|
`ACTIONS` is a frozen, dot-grouped map of all action names (`ACTIONS.dataFlow.activate`, `ACTIONS.metadata.getObjects`, …). `ACTION_HEADER` is the literal header name (`sked-integration-action`).
|
|
144
149
|
|
|
150
|
+
### Authoring an action
|
|
151
|
+
|
|
152
|
+
Use `defineAction` to wire the standard middleware stack (metrics → logging → audit → requireAdmin) around the handler:
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
import { defineAction, ACTIONS, ConflictError } from '@skedulo/integration-sdk';
|
|
156
|
+
|
|
157
|
+
export const myAction = defineAction({
|
|
158
|
+
name: ACTIONS.scheduledJob.create,
|
|
159
|
+
parseInput: parseCreateInput,
|
|
160
|
+
requireAdmin: true, // 403 ForbiddenError if caller isn't admin
|
|
161
|
+
audit: true, // emits an audit log line on success
|
|
162
|
+
idempotent: false, // surfaced to callers so PSS doesn't blind-retry
|
|
163
|
+
handler: async (input, ctx) => {
|
|
164
|
+
if (await exists(input.name)) {
|
|
165
|
+
throw new ConflictError('JOB_ALREADY_EXISTS', `'${input.name}' already exists`);
|
|
166
|
+
}
|
|
167
|
+
return createJob(ctx, input);
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Every action receives `ctx.requestId` (correlation id) and `ctx.metrics` (counter/histogram sink). Inject a real metrics impl via `BaseAdapterHandlerConfig.metrics`; the default is a no-op.
|
|
173
|
+
|
|
174
|
+
### Errors
|
|
175
|
+
|
|
176
|
+
Throw a typed subclass instead of `new ActionError(CODE, ...)`. The dispatcher maps the error's `category` to HTTP status and echoes `retryable` in the envelope.
|
|
177
|
+
|
|
178
|
+
| Subclass | Category | HTTP | Retryable |
|
|
179
|
+
|---------------------------|-----------------------|-----:|:---------:|
|
|
180
|
+
| `InvalidInputError` | `invalid_input` | 422 | no |
|
|
181
|
+
| `ForbiddenError` | `forbidden` | 403 | no |
|
|
182
|
+
| `NotFoundError` | `not_found` | 404 | no |
|
|
183
|
+
| `ConflictError` | `conflict` | 409 | no |
|
|
184
|
+
| `PreconditionFailedError` | `precondition_failed` | 412 | no |
|
|
185
|
+
| `NotImplementedError` | `not_implemented` | 501 | no |
|
|
186
|
+
| `UpstreamTransientError` | `upstream_transient` | 503 | **yes** |
|
|
187
|
+
| `UpstreamPermanentError` | `upstream_permanent` | 424 | no |
|
|
188
|
+
| bare `ActionError` | `internal` | 500 | no |
|
|
189
|
+
|
|
145
190
|
## Sync model
|
|
146
191
|
|
|
147
192
|
There are two ways a data flow runs:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"on-vendor.action.d.ts","sourceRoot":"","sources":["../../../src/actions/event/on-vendor.action.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAElF,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,SAAS,GACd,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,
|
|
1
|
+
{"version":3,"file":"on-vendor.action.d.ts","sourceRoot":"","sources":["../../../src/actions/event/on-vendor.action.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAElF,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,SAAS,GACd,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CA8CjD"}
|
|
@@ -13,14 +13,18 @@ function makeOnVendorEventAction(deps) {
|
|
|
13
13
|
return raw;
|
|
14
14
|
},
|
|
15
15
|
async handler(input, ctx) {
|
|
16
|
+
var _a;
|
|
16
17
|
const adapter = deps.adapter;
|
|
17
18
|
const lookupStrategy = (0, helpers_1.resolveLookupStrategy)(adapter);
|
|
18
19
|
if (!adapter.parseChangeEvent) {
|
|
19
20
|
throw new errors_1.NotImplementedError(`${adapter.integrationType} adapter does not implement parseChangeEvent`);
|
|
20
21
|
}
|
|
21
22
|
const parsed = adapter.parseChangeEvent(input);
|
|
22
|
-
if (!('event' in parsed)) {
|
|
23
|
-
|
|
23
|
+
if (!parsed || typeof parsed !== 'object' || !('event' in parsed)) {
|
|
24
|
+
const message = parsed && typeof parsed === 'object' && 'error' in parsed
|
|
25
|
+
? String((_a = parsed.error) !== null && _a !== void 0 ? _a : 'Invalid vendor event payload')
|
|
26
|
+
: 'Invalid vendor event payload';
|
|
27
|
+
throw new errors_1.InvalidInputError(message);
|
|
24
28
|
}
|
|
25
29
|
const results = await new sync_runner_1.SyncRunner(deps.registry).handleEvent({ event: parsed.event, options: { lookupStrategy } }, ctx);
|
|
26
30
|
if (results.some((r) => r.status === 'precondition_failed')) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"on-vendor.action.js","sourceRoot":"","sources":["../../../src/actions/event/on-vendor.action.ts"],"names":[],"mappings":";;AAYA,
|
|
1
|
+
{"version":3,"file":"on-vendor.action.js","sourceRoot":"","sources":["../../../src/actions/event/on-vendor.action.ts"],"names":[],"mappings":";;AAYA,0DAgDC;AA5DD,4DAAwD;AACxD,wDAAgD;AAChD,8CAAyD;AACzD,4CAKyB;AAIzB,SAAgB,uBAAuB,CACrC,IAAe;IAEf,OAAO;QACL,IAAI,EAAE,sBAAO,CAAC,KAAK,CAAC,QAAQ;QAC5B,UAAU,CAAC,GAAG;YACZ,gFAAgF;YAChF,OAAO,GAAG,CAAC;QACb,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;;YACtB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC7B,MAAM,cAAc,GAAG,IAAA,+BAAqB,EAAC,OAAO,CAAC,CAAC;YAEtD,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBAC9B,MAAM,IAAI,4BAAmB,CAC3B,GAAG,OAAO,CAAC,eAAe,8CAA8C,CACzE,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC/C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,EAAE,CAAC;gBAClE,MAAM,OAAO,GACX,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,MAAM;oBACvD,CAAC,CAAC,MAAM,CAAC,MAAC,MAA8B,CAAC,KAAK,mCAAI,8BAA8B,CAAC;oBACjF,CAAC,CAAC,8BAA8B,CAAC;gBACrC,MAAM,IAAI,0BAAiB,CAAC,OAAO,CAAC,CAAC;YACvC,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,IAAI,wBAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,CAC7D,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,EAAE,EACpD,GAAG,CACJ,CAAC;YAEF,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,qBAAqB,CAAC,EAAE,CAAC;gBAC5D,MAAM,IAAI,gCAAuB,CAC/B,qBAAqB,EACrB,+DAA+D,EAC/D,OAAO,CACR,CAAC;YACJ,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,+BAAsB,CAAC,yBAAyB,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACpF,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,YAAY;gBACvF,OAAO;aACR,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.action.d.ts","sourceRoot":"","sources":["../../../src/actions/scheduled-job/create.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,YAAY,EAAE,MAAM,0CAA0C,CAAC;AAKhG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAU7C,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,cAAc,EAAE,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"create.action.d.ts","sourceRoot":"","sources":["../../../src/actions/scheduled-job/create.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,YAAY,EAAE,MAAM,0CAA0C,CAAC;AAKhG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAU7C,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,cAAc,EAAE,YAAY,CAAC,CAoDhG"}
|
|
@@ -14,16 +14,19 @@ function makeScheduledJobCreateAction(deps) {
|
|
|
14
14
|
audit: true,
|
|
15
15
|
requireAdmin: true,
|
|
16
16
|
parseInput(raw) {
|
|
17
|
-
var _a;
|
|
17
|
+
var _a, _b;
|
|
18
18
|
const obj = (0, shared_1.asRecord)(raw);
|
|
19
19
|
// Validate interval bounds eagerly so bad input is rejected at parse time.
|
|
20
20
|
const interval_value = typeof obj.interval_value === 'number' ? obj.interval_value : Number.NaN;
|
|
21
|
+
if (obj.enabled !== undefined && typeof obj.enabled !== 'boolean') {
|
|
22
|
+
throw new errors_1.InvalidInputError('enabled must be a boolean');
|
|
23
|
+
}
|
|
21
24
|
const input = {
|
|
22
25
|
name: (0, shared_1.parseName)(obj.name),
|
|
23
26
|
interval_value,
|
|
24
27
|
interval_unit: (0, shared_1.parseIntervalUnit)(obj.interval_unit),
|
|
25
28
|
flow_ids: (0, shared_1.parseFlowIds)((_a = obj.flow_ids) !== null && _a !== void 0 ? _a : []),
|
|
26
|
-
enabled: obj.enabled
|
|
29
|
+
enabled: (_b = obj.enabled) !== null && _b !== void 0 ? _b : true,
|
|
27
30
|
};
|
|
28
31
|
(0, artifact_builder_1.jobIntervalToMinutes)(input); // throws InvalidInputError on out-of-range
|
|
29
32
|
return input;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.action.js","sourceRoot":"","sources":["../../../src/actions/scheduled-job/create.action.ts"],"names":[],"mappings":";;AAiBA,
|
|
1
|
+
{"version":3,"file":"create.action.js","sourceRoot":"","sources":["../../../src/actions/scheduled-job/create.action.ts"],"names":[],"mappings":";;AAiBA,oEAoDC;AApED,mEAA0F;AAC1F,wDAAgD;AAChD,0DAAsD;AACtD,4CAAmE;AAEnE,qCAQkB;AAGlB,SAAgB,4BAA4B,CAAC,IAAa;IACxD,OAAO,IAAA,4BAAY,EAAC;QAClB,IAAI,EAAE,sBAAO,CAAC,YAAY,CAAC,MAAM;QACjC,mEAAmE;QACnE,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,IAAI;QACX,YAAY,EAAE,IAAI;QAClB,UAAU,CAAC,GAAG;;YACZ,MAAM,GAAG,GAAG,IAAA,iBAAQ,EAAC,GAAG,CAAC,CAAC;YAC1B,2EAA2E;YAC3E,MAAM,cAAc,GAClB,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YAC3E,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAClE,MAAM,IAAI,0BAAiB,CAAC,2BAA2B,CAAC,CAAC;YAC3D,CAAC;YACD,MAAM,KAAK,GAAmB;gBAC5B,IAAI,EAAE,IAAA,kBAAS,EAAC,GAAG,CAAC,IAAI,CAAC;gBACzB,cAAc;gBACd,aAAa,EAAE,IAAA,0BAAiB,EAAC,GAAG,CAAC,aAAa,CAAC;gBACnD,QAAQ,EAAE,IAAA,qBAAY,EAAC,MAAA,GAAG,CAAC,QAAQ,mCAAI,EAAE,CAAC;gBAC1C,OAAO,EAAE,MAAA,GAAG,CAAC,OAAO,mCAAI,IAAI;aAC7B,CAAC;YACF,IAAA,uCAAoB,EAAC,KAAK,CAAC,CAAC,CAAC,2CAA2C;YACxE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;YACrD,MAAM,YAAY,GAAG,IAAA,uCAAoB,EAAC,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAEvE,MAAM,IAAI,GAAG,MAAM,IAAA,mBAAU,EAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YACpD,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,YAAY,CAAC,EAAE,CAAC;gBACrE,MAAM,IAAI,sBAAa,CACrB,oBAAoB,EACpB,0BAA0B,KAAK,CAAC,IAAI,mCAAmC,YAAY,IAAI,CACxF,CAAC;YACJ,CAAC;YACD,MAAM,IAAA,wBAAe,EAAC,GAAG,EAAE,eAAe,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YAEjF,MAAM,GAAG,GAAiB;gBACxB,YAAY;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC;YACF,MAAM,IAAI,GAAsB,EAAE,cAAc,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,EAAE,CAAC;YAElF,MAAM,IAAA,gCAAuB,EAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YACrE,OAAO,GAAG,CAAC;QACb,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.action.d.ts","sourceRoot":"","sources":["../../../src/actions/scheduled-job/update.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,YAAY,EAAE,MAAM,0CAA0C,CAAC;AAKhG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAW7C,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEvD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,cAAc,EAAE,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"update.action.d.ts","sourceRoot":"","sources":["../../../src/actions/scheduled-job/update.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,YAAY,EAAE,MAAM,0CAA0C,CAAC;AAKhG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAW7C,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEvD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,cAAc,EAAE,YAAY,CAAC,CA8DhG"}
|
|
@@ -24,8 +24,12 @@ function makeScheduledJobUpdateAction(deps) {
|
|
|
24
24
|
input.interval_unit = (0, shared_1.parseIntervalUnit)(obj.interval_unit);
|
|
25
25
|
if (obj.flow_ids !== undefined)
|
|
26
26
|
input.flow_ids = (0, shared_1.parseFlowIds)(obj.flow_ids);
|
|
27
|
-
if (obj.enabled !== undefined)
|
|
28
|
-
|
|
27
|
+
if (obj.enabled !== undefined) {
|
|
28
|
+
if (typeof obj.enabled !== 'boolean') {
|
|
29
|
+
throw new errors_1.InvalidInputError('enabled must be a boolean');
|
|
30
|
+
}
|
|
31
|
+
input.enabled = obj.enabled;
|
|
32
|
+
}
|
|
29
33
|
return input;
|
|
30
34
|
},
|
|
31
35
|
async handler(input, ctx) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.action.js","sourceRoot":"","sources":["../../../src/actions/scheduled-job/update.action.ts"],"names":[],"mappings":";;AAkBA,
|
|
1
|
+
{"version":3,"file":"update.action.js","sourceRoot":"","sources":["../../../src/actions/scheduled-job/update.action.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,CAwBzD;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"}
|
|
@@ -19,7 +19,10 @@ function categoryToStatus(c) {
|
|
|
19
19
|
case 'upstream_transient':
|
|
20
20
|
return 503;
|
|
21
21
|
case 'upstream_permanent':
|
|
22
|
-
|
|
22
|
+
// 424 Failed Dependency — vendor said no permanently; not retryable.
|
|
23
|
+
// Avoid 5xx here so reverse proxies don't auto-retry on status alone;
|
|
24
|
+
// callers should consult the `retryable` field in the envelope.
|
|
25
|
+
return 424;
|
|
23
26
|
case 'not_implemented':
|
|
24
27
|
return 501;
|
|
25
28
|
case 'internal':
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/actions/utils/errors.ts"],"names":[],"mappings":";;;AAiBA,
|
|
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":"scheduled-job.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/scheduled-job.interface.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,yCAAyC;AACzC,eAAO,MAAM,eAAe;;;CAGlB,CAAC;AACX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC;AAErF;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,eAAe,CAAC;IAC/B,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,6DAA6D;AAC7D,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,YAAY,EAAE,CAAC;CAChC;
|
|
1
|
+
{"version":3,"file":"scheduled-job.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/scheduled-job.interface.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,yCAAyC;AACzC,eAAO,MAAM,eAAe;;;CAGlB,CAAC;AACX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC;AAErF;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,eAAe,CAAC;IAC/B,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,6DAA6D;AAC7D,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,YAAY,EAAE,CAAC;CAChC;AAiBD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAChD,iBAAiB,CAInB"}
|
|
@@ -19,7 +19,8 @@ function isScheduledJob(value) {
|
|
|
19
19
|
const j = value;
|
|
20
20
|
return (typeof j.webhook_name === 'string' &&
|
|
21
21
|
typeof j.name === 'string' &&
|
|
22
|
-
|
|
22
|
+
Number.isInteger(j.interval_value) &&
|
|
23
|
+
j.interval_value > 0 &&
|
|
23
24
|
(j.interval_unit === exports.JobIntervalUnit.MINUTES || j.interval_unit === exports.JobIntervalUnit.HOURS) &&
|
|
24
25
|
Array.isArray(j.flow_ids) &&
|
|
25
26
|
j.flow_ids.every((id) => Number.isInteger(id)) &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduled-job.interface.js","sourceRoot":"","sources":["../../src/interfaces/scheduled-job.interface.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;
|
|
1
|
+
{"version":3,"file":"scheduled-job.interface.js","sourceRoot":"","sources":["../../src/interfaces/scheduled-job.interface.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAoDH,kDAMC;AAxDD,yCAAyC;AAC5B,QAAA,eAAe,GAAG;IAC7B,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;CACN,CAAC;AA2BX,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,OAAO,CACL,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ;QAClC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;QAC1B,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC;QACjC,CAAC,CAAC,cAAyB,GAAG,CAAC;QAChC,CAAC,CAAC,CAAC,aAAa,KAAK,uBAAe,CAAC,OAAO,IAAI,CAAC,CAAC,aAAa,KAAK,uBAAe,CAAC,KAAK,CAAC;QAC1F,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;QACzB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,CAAC,OAAO,KAAK,SAAS,CAC/B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CACjC,KAAiD;IAEjD,MAAM,IAAI,GAAG,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,cAAc,CAAC;IACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;IACxD,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;AACzD,CAAC"}
|