@skedulo/integration-sdk 0.9.1 → 0.10.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 +14 -0
- package/dist/actions/action-registry.d.ts.map +1 -1
- package/dist/actions/action-registry.js +1 -0
- package/dist/actions/action-registry.js.map +1 -1
- package/dist/actions/data-flow.action.d.ts +62 -0
- package/dist/actions/data-flow.action.d.ts.map +1 -0
- package/dist/actions/data-flow.action.js +217 -0
- package/dist/actions/data-flow.action.js.map +1 -0
- package/dist/actions/event.action.d.ts +32 -0
- package/dist/actions/event.action.d.ts.map +1 -0
- package/dist/actions/event.action.js +113 -0
- package/dist/actions/event.action.js.map +1 -0
- package/dist/actions/metadata.action.d.ts +44 -0
- package/dist/actions/metadata.action.d.ts.map +1 -0
- package/dist/actions/metadata.action.js +96 -0
- package/dist/actions/metadata.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/sync/index.d.ts +1 -0
- package/dist/actions/sync/index.d.ts.map +1 -1
- package/dist/actions/sync/index.js +3 -1
- package/dist/actions/sync/index.js.map +1 -1
- package/dist/actions/sync/retry-failed.action.d.ts +10 -0
- package/dist/actions/sync/retry-failed.action.d.ts.map +1 -0
- package/dist/actions/sync/retry-failed.action.js +61 -0
- package/dist/actions/sync/retry-failed.action.js.map +1 -0
- package/dist/actions/sync/types.d.ts +11 -0
- package/dist/actions/sync/types.d.ts.map +1 -1
- package/dist/actions/sync.action.d.ts +26 -0
- package/dist/actions/sync.action.d.ts.map +1 -0
- package/dist/actions/sync.action.js +81 -0
- package/dist/actions/sync.action.js.map +1 -0
- package/dist/actions/utils/action-names.d.ts +1 -0
- package/dist/actions/utils/action-names.d.ts.map +1 -1
- package/dist/actions/utils/action-names.js +1 -0
- package/dist/actions/utils/action-names.js.map +1 -1
- package/dist/adapters/capabilities-defaults.d.ts.map +1 -1
- package/dist/adapters/capabilities-defaults.js +7 -1
- package/dist/adapters/capabilities-defaults.js.map +1 -1
- package/dist/adapters/skedulo-mutation-result.d.ts +18 -0
- package/dist/adapters/skedulo-mutation-result.d.ts.map +1 -0
- package/dist/adapters/skedulo-mutation-result.js +124 -0
- package/dist/adapters/skedulo-mutation-result.js.map +1 -0
- package/dist/adapters/skedulo.adapter.d.ts +4 -0
- package/dist/adapters/skedulo.adapter.d.ts.map +1 -1
- package/dist/adapters/skedulo.adapter.js +114 -17
- package/dist/adapters/skedulo.adapter.js.map +1 -1
- package/dist/clients/failed-record.client.d.ts +37 -0
- package/dist/clients/failed-record.client.d.ts.map +1 -0
- package/dist/clients/failed-record.client.js +48 -0
- package/dist/clients/failed-record.client.js.map +1 -0
- package/dist/context.d.ts +3 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +5 -0
- package/dist/context.js.map +1 -1
- package/dist/interfaces/adapter.interface.d.ts +13 -0
- package/dist/interfaces/adapter.interface.d.ts.map +1 -1
- package/dist/interfaces/integration-capabilities.interface.d.ts +22 -0
- package/dist/interfaces/integration-capabilities.interface.d.ts.map +1 -1
- package/dist/interfaces/sync-pipeline.interface.d.ts +11 -0
- package/dist/interfaces/sync-pipeline.interface.d.ts.map +1 -1
- package/dist/services/artifact-builder.d.ts +95 -0
- package/dist/services/artifact-builder.d.ts.map +1 -0
- package/dist/services/artifact-builder.js +142 -0
- package/dist/services/artifact-builder.js.map +1 -0
- package/dist/services/external-id-sync.strategy.d.ts.map +1 -1
- package/dist/services/external-id-sync.strategy.js +23 -24
- package/dist/services/external-id-sync.strategy.js.map +1 -1
- package/dist/services/id-mapping-sync.strategy.d.ts.map +1 -1
- package/dist/services/id-mapping-sync.strategy.js +35 -21
- package/dist/services/id-mapping-sync.strategy.js.map +1 -1
- package/dist/services/id-mapping.service.d.ts +2 -0
- package/dist/services/id-mapping.service.d.ts.map +1 -1
- package/dist/services/id-mapping.service.js +57 -2
- package/dist/services/id-mapping.service.js.map +1 -1
- package/dist/services/run-log-builder.d.ts +4 -5
- package/dist/services/run-log-builder.d.ts.map +1 -1
- package/dist/services/run-log-builder.js +4 -5
- package/dist/services/run-log-builder.js.map +1 -1
- package/dist/services/sync-pipeline-errors.d.ts +24 -0
- package/dist/services/sync-pipeline-errors.d.ts.map +1 -0
- package/dist/services/sync-pipeline-errors.js +52 -0
- package/dist/services/sync-pipeline-errors.js.map +1 -0
- package/dist/services/sync-runner.d.ts +15 -0
- package/dist/services/sync-runner.d.ts.map +1 -1
- package/dist/services/sync-runner.js +246 -9
- package/dist/services/sync-runner.js.map +1 -1
- package/dist/services/sync.service.d.ts +2 -0
- package/dist/services/sync.service.d.ts.map +1 -1
- package/dist/services/sync.service.js +1 -0
- package/dist/services/sync.service.js.map +1 -1
- package/package.json +1 -1
- package/.claude/worktrees/agent-a16acadaf5412dffd/jest.config.js +0 -12
- package/.claude/worktrees/agent-a33c3e4636d488e49/jest.config.js +0 -12
- package/.claude/worktrees/agent-a5b1d2ffa4ceef4a6/jest.config.js +0 -12
- package/.claude/worktrees/agent-aa1db4c22eabbde8e/jest.config.js +0 -12
- package/.claude/worktrees/agent-ac197ae8c69d7061c/jest.config.js +0 -12
- package/dist/handlers/metadata.handler.d.ts +0 -17
- package/dist/handlers/metadata.handler.d.ts.map +0 -1
- package/dist/handlers/metadata.handler.js +0 -50
- package/dist/handlers/metadata.handler.js.map +0 -1
- package/dist/utils/normalizeDataFlow.d.ts +0 -3
- package/dist/utils/normalizeDataFlow.d.ts.map +0 -1
- package/dist/utils/normalizeDataFlow.js +0 -37
- package/dist/utils/normalizeDataFlow.js.map +0 -1
- package/dist/utils.d.ts +0 -2
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -10
- package/dist/utils.js.map +0 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeRetryFailedAction = makeRetryFailedAction;
|
|
4
|
+
const sync_runner_1 = require("../../services/sync-runner");
|
|
5
|
+
const action_names_1 = require("../utils/action-names");
|
|
6
|
+
const helpers_1 = require("../utils/helpers");
|
|
7
|
+
const errors_1 = require("../utils/errors");
|
|
8
|
+
const define_action_1 = require("../utils/define-action");
|
|
9
|
+
/**
|
|
10
|
+
* Retry specific failed records for a flow. Admin-only. Takes the source-system ids the
|
|
11
|
+
* caller already holds (from the failed-records list), re-fetches those records via the
|
|
12
|
+
* adapter's `fetchByIds` — current state, so a source-side fix takes effect — re-runs the
|
|
13
|
+
* pipeline, then reconciles: resolve the ones that now pass, re-record the ones that still fail.
|
|
14
|
+
*/
|
|
15
|
+
function makeRetryFailedAction(deps) {
|
|
16
|
+
return (0, define_action_1.defineAction)({
|
|
17
|
+
name: action_names_1.ACTIONS.sync.retryFailed,
|
|
18
|
+
requireAdmin: true,
|
|
19
|
+
parseInput(raw) {
|
|
20
|
+
const obj = (raw !== null && raw !== void 0 ? raw : {});
|
|
21
|
+
if (!Number.isInteger(obj.flowId) || obj.flowId <= 0) {
|
|
22
|
+
throw new errors_1.InvalidInputError('flowId must be a positive integer');
|
|
23
|
+
}
|
|
24
|
+
// `recordIds` is a transitional alias: the pre-rename UI sends source ids under that key.
|
|
25
|
+
const ids = Array.isArray(obj.sourceIds) ? obj.sourceIds : obj.recordIds;
|
|
26
|
+
if (!Array.isArray(ids) || ids.length === 0) {
|
|
27
|
+
throw new errors_1.InvalidInputError('sourceIds must be a non-empty array');
|
|
28
|
+
}
|
|
29
|
+
// Dedupe: the reconcile upserts one failed-record row per source id, and the store
|
|
30
|
+
// rejects two conflicting (flow, source_id) rows in a single statement.
|
|
31
|
+
return { flowId: obj.flowId, sourceIds: [...new Set(ids.map((id) => String(id)))] };
|
|
32
|
+
},
|
|
33
|
+
async handler(input, ctx) {
|
|
34
|
+
var _a;
|
|
35
|
+
const flow = await ctx.dataFlowService.getFlowById(input.flowId);
|
|
36
|
+
if (!flow) {
|
|
37
|
+
throw new errors_1.NotFoundError('FLOW_NOT_FOUND', `Flow ${input.flowId} not found`);
|
|
38
|
+
}
|
|
39
|
+
// Retry re-fetches each record's current state from the flow's SOURCE, so that adapter must
|
|
40
|
+
// implement fetchByIds — the vendor for inbound flows, Skedulo for outbound. Reject with a
|
|
41
|
+
// typed 501 when the source can't re-fetch (rather than a bare AdapterRoleError → 500).
|
|
42
|
+
let source;
|
|
43
|
+
try {
|
|
44
|
+
source = flow.sourceSystem ? deps.registry.resolve(flow.sourceSystem) : undefined;
|
|
45
|
+
}
|
|
46
|
+
catch (_b) {
|
|
47
|
+
source = undefined;
|
|
48
|
+
}
|
|
49
|
+
if (typeof (source === null || source === void 0 ? void 0 : source.fetchByIds) !== 'function') {
|
|
50
|
+
throw new errors_1.NotImplementedError(`Retry is not supported for flow ${input.flowId}: its source (${(_a = flow.sourceSystem) !== null && _a !== void 0 ? _a : 'unknown'}) can't re-fetch records`);
|
|
51
|
+
}
|
|
52
|
+
const summary = await new sync_runner_1.SyncRunner(deps.registry).retryRecords({
|
|
53
|
+
flowId: input.flowId,
|
|
54
|
+
sourceIds: input.sourceIds,
|
|
55
|
+
options: { lookupStrategy: (0, helpers_1.resolveLookupStrategy)(deps.adapter) },
|
|
56
|
+
}, ctx);
|
|
57
|
+
return Object.assign({ flowId: input.flowId }, summary);
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=retry-failed.action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-failed.action.js","sourceRoot":"","sources":["../../../src/actions/sync/retry-failed.action.ts"],"names":[],"mappings":";;AAcA,sDAiDC;AA/DD,4DAAwD;AACxD,wDAAgD;AAChD,8CAAyD;AACzD,4CAAwF;AACxF,0DAAsD;AAItD;;;;;GAKG;AACH,SAAgB,qBAAqB,CAAC,IAAc;IAClD,OAAO,IAAA,4BAAY,EAAsC;QACvD,IAAI,EAAE,sBAAO,CAAC,IAAI,CAAC,WAAW;QAC9B,YAAY,EAAE,IAAI;QAClB,UAAU,CAAC,GAAG;YACZ,MAAM,GAAG,GAAG,CAAC,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,EAAE,CAA4B,CAAC;YACnD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAK,GAAG,CAAC,MAAiB,IAAI,CAAC,EAAE,CAAC;gBACjE,MAAM,IAAI,0BAAiB,CAAC,mCAAmC,CAAC,CAAC;YACnE,CAAC;YACD,0FAA0F;YAC1F,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;YACzE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5C,MAAM,IAAI,0BAAiB,CAAC,qCAAqC,CAAC,CAAC;YACrE,CAAC;YACD,mFAAmF;YACnF,wEAAwE;YACxE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAgB,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChG,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;;YACtB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACjE,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,sBAAa,CAAC,gBAAgB,EAAE,QAAQ,KAAK,CAAC,MAAM,YAAY,CAAC,CAAC;YAC9E,CAAC;YACD,4FAA4F;YAC5F,2FAA2F;YAC3F,wFAAwF;YACxF,IAAI,MAAM,CAAC;YACX,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACpF,CAAC;YAAC,WAAM,CAAC;gBACP,MAAM,GAAG,SAAS,CAAC;YACrB,CAAC;YACD,IAAI,OAAO,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,CAAA,KAAK,UAAU,EAAE,CAAC;gBAC7C,MAAM,IAAI,4BAAmB,CAC3B,mCAAmC,KAAK,CAAC,MAAM,iBAAiB,MAAA,IAAI,CAAC,YAAY,mCAAI,SAAS,0BAA0B,CACzH,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,IAAI,wBAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,YAAY,CAC9D;gBACE,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,OAAO,EAAE,EAAE,cAAc,EAAE,IAAA,+BAAqB,EAAC,IAAI,CAAC,OAAO,CAAC,EAAE;aACjE,EACD,GAAG,CACJ,CAAC;YACF,uBAAS,MAAM,EAAE,KAAK,CAAC,MAAM,IAAK,OAAO,EAAG;QAC9C,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -17,6 +17,17 @@ export type RunFlowOutput = {
|
|
|
17
17
|
runId: string;
|
|
18
18
|
flowId: number;
|
|
19
19
|
} & RunCounts;
|
|
20
|
+
export interface RetryFailedInput {
|
|
21
|
+
flowId: number;
|
|
22
|
+
/** Source-system record ids to retry — re-fetched via the adapter's fetchByIds. */
|
|
23
|
+
sourceIds: string[];
|
|
24
|
+
}
|
|
25
|
+
export interface RetryFailedOutput {
|
|
26
|
+
flowId: number;
|
|
27
|
+
requested: number;
|
|
28
|
+
succeeded: number;
|
|
29
|
+
failed: number;
|
|
30
|
+
}
|
|
20
31
|
export interface RunJobInput {
|
|
21
32
|
webhookName: string;
|
|
22
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/actions/sync/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAE1E,MAAM,MAAM,QAAQ,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,CAAC;AAIvE,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,YAAY,CAAC,CAAC;AAEnE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AACD,MAAM,MAAM,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC;AAE1E,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,iBAAiB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1F,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAC3C,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,CAAC,SAAS,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAAC;AAEjG,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/actions/sync/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAE1E,MAAM,MAAM,QAAQ,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,CAAC;AAIvE,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,YAAY,CAAC,CAAC;AAEnE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AACD,MAAM,MAAM,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC;AAE1E,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AACD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,iBAAiB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1F,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAC3C,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,CAAC,SAAS,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAAC;AAEjG,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Adapter } from '../interfaces/adapter.interface';
|
|
2
|
+
import type { AdapterRegistry } from '../adapters/adapter-registry';
|
|
3
|
+
import type { BatchResult } from '../interfaces/sync-result.interface';
|
|
4
|
+
import type { Action } from './utils/types';
|
|
5
|
+
type SyncDeps = {
|
|
6
|
+
adapter: Adapter;
|
|
7
|
+
registry: AdapterRegistry;
|
|
8
|
+
};
|
|
9
|
+
export interface RunFlowInput {
|
|
10
|
+
flowId: number;
|
|
11
|
+
/** Manual backfill: sync from this time, overriding the persisted cursor. */
|
|
12
|
+
since?: Date;
|
|
13
|
+
/** Manual full resync: ignore the persisted cursor and pull everything. */
|
|
14
|
+
fullResync?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export type RunFlowOutput = {
|
|
17
|
+
runId: string;
|
|
18
|
+
flowId: number;
|
|
19
|
+
} & BatchResult;
|
|
20
|
+
/**
|
|
21
|
+
* Manually run a single flow. Admin-only. Supports a one-off backfill (`since`)
|
|
22
|
+
* or full resync (`fullResync`) that overrides the persisted cursor.
|
|
23
|
+
*/
|
|
24
|
+
export declare function makeRunFlowAction(deps: SyncDeps): Action<RunFlowInput, RunFlowOutput>;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=sync.action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.action.d.ts","sourceRoot":"","sources":["../../src/actions/sync.action.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAOvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,KAAK,QAAQ,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,CAAC;AAahE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,2EAA2E;IAC3E,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AACD,MAAM,MAAM,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CAAC;AAa5E;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC,CAoDrF"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeRunFlowAction = makeRunFlowAction;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const constants_1 = require("../constants");
|
|
6
|
+
const sync_runner_1 = require("../services/sync-runner");
|
|
7
|
+
const helpers_1 = require("../utils/helpers");
|
|
8
|
+
const action_names_1 = require("./utils/action-names");
|
|
9
|
+
const helpers_2 = require("./utils/helpers");
|
|
10
|
+
const errors_1 = require("./utils/errors");
|
|
11
|
+
function parsePositiveInt(raw, field) {
|
|
12
|
+
const obj = (raw !== null && raw !== void 0 ? raw : {});
|
|
13
|
+
const v = obj[field];
|
|
14
|
+
if (!Number.isInteger(v) || v <= 0) {
|
|
15
|
+
throw new errors_1.InvalidInputError(`${field} must be a positive integer`);
|
|
16
|
+
}
|
|
17
|
+
return v;
|
|
18
|
+
}
|
|
19
|
+
function parseSinceDate(value) {
|
|
20
|
+
if (typeof value !== 'string') {
|
|
21
|
+
throw new errors_1.InvalidInputError('since must be an ISO date-time string');
|
|
22
|
+
}
|
|
23
|
+
const date = new Date(value);
|
|
24
|
+
if (Number.isNaN(date.getTime())) {
|
|
25
|
+
throw new errors_1.InvalidInputError(`since is not a valid date-time: "${value}"`);
|
|
26
|
+
}
|
|
27
|
+
return date;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Manually run a single flow. Admin-only. Supports a one-off backfill (`since`)
|
|
31
|
+
* or full resync (`fullResync`) that overrides the persisted cursor.
|
|
32
|
+
*/
|
|
33
|
+
function makeRunFlowAction(deps) {
|
|
34
|
+
return {
|
|
35
|
+
name: action_names_1.ACTIONS.sync.runFlow,
|
|
36
|
+
parseInput(raw) {
|
|
37
|
+
const obj = (raw !== null && raw !== void 0 ? raw : {});
|
|
38
|
+
const input = { flowId: parsePositiveInt(raw, 'flowId') };
|
|
39
|
+
// fullResync takes precedence over since when both are supplied.
|
|
40
|
+
if (obj.fullResync === true) {
|
|
41
|
+
input.fullResync = true;
|
|
42
|
+
}
|
|
43
|
+
else if (obj.since !== undefined) {
|
|
44
|
+
input.since = parseSinceDate(obj.since);
|
|
45
|
+
}
|
|
46
|
+
return input;
|
|
47
|
+
},
|
|
48
|
+
async handler(input, ctx) {
|
|
49
|
+
var _a, _b;
|
|
50
|
+
if (!(0, helpers_1.isAdminRequest)(ctx.skedContext)) {
|
|
51
|
+
throw new errors_1.ActionError('FORBIDDEN', 'runFlow requires admin privileges');
|
|
52
|
+
}
|
|
53
|
+
const integrationType = deps.adapter.integrationType;
|
|
54
|
+
const lookupStrategy = (0, helpers_2.resolveLookupStrategy)(deps.adapter);
|
|
55
|
+
const runId = (0, crypto_1.randomUUID)();
|
|
56
|
+
const flow = await ctx.dataFlowService.getFlowById(input.flowId);
|
|
57
|
+
if (!flow) {
|
|
58
|
+
throw new errors_1.ActionError('FLOW_NOT_FOUND', `Flow ${input.flowId} not found`);
|
|
59
|
+
}
|
|
60
|
+
// overrideSince: undefined = normal resume, null = full resync, Date = backfill from time.
|
|
61
|
+
const overrideSince = input.fullResync ? null : input.since;
|
|
62
|
+
ctx.logger.info(`[run-flow] flowId=${input.flowId} runId=${runId} starting` +
|
|
63
|
+
(overrideSince === null
|
|
64
|
+
? ' (full resync)'
|
|
65
|
+
: overrideSince
|
|
66
|
+
? ` (backfill since ${overrideSince.toISOString()})`
|
|
67
|
+
: ''));
|
|
68
|
+
const stats = await new sync_runner_1.SyncRunner(deps.registry).run({
|
|
69
|
+
flowId: input.flowId,
|
|
70
|
+
since: null,
|
|
71
|
+
overrideSince,
|
|
72
|
+
sourceSystem: (_a = flow.sourceSystem) !== null && _a !== void 0 ? _a : integrationType,
|
|
73
|
+
targetSystem: (_b = flow.targetSystem) !== null && _b !== void 0 ? _b : constants_1.SKEDULO_SYSTEM,
|
|
74
|
+
options: { lookupStrategy },
|
|
75
|
+
}, ctx);
|
|
76
|
+
ctx.logger.info(`[run-flow] done: ${JSON.stringify(stats)}`);
|
|
77
|
+
return Object.assign({ runId, flowId: input.flowId }, stats);
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=sync.action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.action.js","sourceRoot":"","sources":["../../src/actions/sync.action.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-names.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/action-names.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,aAAa,4BAA4B,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,sBAAsB,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,4BAA4B,CAAC;AAEnE;;;;;GAKG;AACH,eAAO,MAAM,OAAO
|
|
1
|
+
{"version":3,"file":"action-names.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/action-names.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,aAAa,4BAA4B,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,sBAAsB,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,4BAA4B,CAAC;AAEnE;;;;;GAKG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuCT,CAAC;AAEZ,MAAM,MAAM,UAAU,GAClB,OAAO,OAAO,CAAC,YAAY,GAC3B,CAAC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,KAAK,CAAC,GAClD,CAAC,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,QAAQ,CAAC,GACxD,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,IAAI,CAAC,GAChD,CAAC,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,YAAY,CAAC,GAChE,CAAC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,KAAK,CAAC,GAClD,CAAC,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC"}
|
|
@@ -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;;;;;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;
|
|
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;QACtB,WAAW,EAAE,mBAAmB;KACjC,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;QACtB,OAAO,EAAE,mBAAmB;KAC7B,CAAC;CACM,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities-defaults.d.ts","sourceRoot":"","sources":["../../src/adapters/capabilities-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAGpF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,mBAAmB,
|
|
1
|
+
{"version":3,"file":"capabilities-defaults.d.ts","sourceRoot":"","sources":["../../src/adapters/capabilities-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAGpF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,mBAAmB,CA8BzE"}
|
|
@@ -30,14 +30,20 @@ function resolveCapabilities(adapter) {
|
|
|
30
30
|
const isTarget = roles.includes(constants_1.AdapterRole.TARGET);
|
|
31
31
|
const outbound = (_c = (_b = caps === null || caps === void 0 ? void 0 : caps.realtime) === null || _b === void 0 ? void 0 : _b.outbound) !== null && _c !== void 0 ? _c : isTarget;
|
|
32
32
|
const inbound = (_e = (_d = caps === null || caps === void 0 ? void 0 : caps.realtime) === null || _d === void 0 ? void 0 : _d.inbound) !== null && _e !== void 0 ? _e : false;
|
|
33
|
+
// Reflects the EXTERNAL adapter's re-fetch ability, so it gates INBOUND retry only
|
|
34
|
+
// (vendor is the source). Derived from method presence, not hand-declared — adding
|
|
35
|
+
// fetchByIds flips inbound retry on with nothing to keep in sync. Outbound flows
|
|
36
|
+
// source from Skedulo (always re-fetchable), so the UI treats them as always retryable.
|
|
37
|
+
const errorHandling = { retryable: typeof adapter.fetchByIds === 'function' };
|
|
33
38
|
if (!caps) {
|
|
34
39
|
return {
|
|
35
40
|
allowNewDataFlows: false,
|
|
36
41
|
hasDataFlows: false,
|
|
37
42
|
roles,
|
|
38
43
|
realtime: { outbound, inbound },
|
|
44
|
+
errorHandling,
|
|
39
45
|
};
|
|
40
46
|
}
|
|
41
|
-
return Object.assign(Object.assign({}, caps), { roles, realtime: { outbound, inbound } });
|
|
47
|
+
return Object.assign(Object.assign({}, caps), { roles, realtime: { outbound, inbound }, errorHandling });
|
|
42
48
|
}
|
|
43
49
|
//# sourceMappingURL=capabilities-defaults.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities-defaults.js","sourceRoot":"","sources":["../../src/adapters/capabilities-defaults.ts"],"names":[],"mappings":";;AAwBA,
|
|
1
|
+
{"version":3,"file":"capabilities-defaults.js","sourceRoot":"","sources":["../../src/adapters/capabilities-defaults.ts"],"names":[],"mappings":";;AAwBA,kDA8BC;AArDD,4CAA2C;AAE3C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAgB,mBAAmB,CAAC,OAAgB;;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;IAClC,MAAM,KAAK,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,mCAAI,CAAC,uBAAW,CAAC,MAAM,EAAE,uBAAW,CAAC,MAAM,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,uBAAW,CAAC,MAAM,CAAC,CAAC;IAEpD,MAAM,QAAQ,GAAG,MAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,0CAAE,QAAQ,mCAAI,QAAQ,CAAC;IACtD,MAAM,OAAO,GAAG,MAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,0CAAE,OAAO,mCAAI,KAAK,CAAC;IAEjD,mFAAmF;IACnF,mFAAmF;IACnF,iFAAiF;IACjF,wFAAwF;IACxF,MAAM,aAAa,GAAG,EAAE,SAAS,EAAE,OAAO,OAAO,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;IAE9E,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,iBAAiB,EAAE,KAAK;YACxB,YAAY,EAAE,KAAK;YACnB,KAAK;YACL,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;YAC/B,aAAa;SACd,CAAC;IACJ,CAAC;IAED,uCACK,IAAI,KACP,KAAK,EACL,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAC/B,aAAa,IACb;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { UpsertOutcome } from '../interfaces/adapter.interface';
|
|
2
|
+
interface MutationLike {
|
|
3
|
+
data?: {
|
|
4
|
+
schema?: Record<string, string | null> | null;
|
|
5
|
+
} | null;
|
|
6
|
+
errors?: unknown[];
|
|
7
|
+
}
|
|
8
|
+
export type ParsedMutation = {
|
|
9
|
+
attributed: true;
|
|
10
|
+
outcomes: UpsertOutcome[];
|
|
11
|
+
} | {
|
|
12
|
+
attributed: false;
|
|
13
|
+
reason: string;
|
|
14
|
+
};
|
|
15
|
+
export declare function parseMutationResult(result: MutationLike, recordCount: number, operation: 'upsert' | 'insert' | 'update'): ParsedMutation;
|
|
16
|
+
export declare function classifySkeduloError(message: string): 'transient' | 'permanent';
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=skedulo-mutation-result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skedulo-mutation-result.d.ts","sourceRoot":"","sources":["../../src/adapters/skedulo-mutation-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAerE,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IAChE,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;CACpB;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,UAAU,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,aAAa,EAAE,CAAA;CAAE,GAC/C;IAAE,UAAU,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AA0B1C,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GACxC,cAAc,CAoEhB;AA8BD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,WAAW,CAE/E"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseMutationResult = parseMutationResult;
|
|
4
|
+
exports.classifySkeduloError = classifySkeduloError;
|
|
5
|
+
const helpers_1 = require("../utils/helpers");
|
|
6
|
+
const ALIAS_RE = /^alias(\d+)$/;
|
|
7
|
+
// GraphQL error `path` for our mutation is ["schema", "alias<N>"]. Return the 1-based N,
|
|
8
|
+
// or null when no alias segment is present (a request/document-level error).
|
|
9
|
+
function aliasIndexOf(err) {
|
|
10
|
+
const path = err === null || err === void 0 ? void 0 : err.path;
|
|
11
|
+
if (!Array.isArray(path))
|
|
12
|
+
return null;
|
|
13
|
+
for (const seg of path) {
|
|
14
|
+
if (typeof seg === 'string') {
|
|
15
|
+
const m = ALIAS_RE.exec(seg);
|
|
16
|
+
if (m)
|
|
17
|
+
return Number(m[1]);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
function messageOf(err) {
|
|
23
|
+
var _a;
|
|
24
|
+
const m = err === null || err === void 0 ? void 0 : err.message;
|
|
25
|
+
if (typeof m === 'string' && m.length > 0)
|
|
26
|
+
return m;
|
|
27
|
+
// JSON.stringify(undefined) and stringifying a function both yield undefined — guard so
|
|
28
|
+
// callers (truncate, classifySkeduloError) always receive a string.
|
|
29
|
+
return (_a = JSON.stringify(err)) !== null && _a !== void 0 ? _a : 'unknown error';
|
|
30
|
+
}
|
|
31
|
+
function parseMutationResult(result, recordCount, operation) {
|
|
32
|
+
var _a, _b;
|
|
33
|
+
const errors = Array.isArray(result === null || result === void 0 ? void 0 : result.errors) ? result.errors : [];
|
|
34
|
+
// Split errors into per-record (alias in range) and document-level (no alias, or an alias
|
|
35
|
+
// outside this batch — a server contract violation we can't tie to a record).
|
|
36
|
+
const errByIndex = new Map();
|
|
37
|
+
let docLevelMessage = null;
|
|
38
|
+
for (const err of errors) {
|
|
39
|
+
const alias = aliasIndexOf(err);
|
|
40
|
+
const idx = alias === null ? null : alias - 1; // 1-based alias → 0-based record index
|
|
41
|
+
if (idx === null || idx < 0 || idx >= recordCount) {
|
|
42
|
+
if (docLevelMessage === null)
|
|
43
|
+
docLevelMessage = messageOf(err);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (!errByIndex.has(idx))
|
|
47
|
+
errByIndex.set(idx, messageOf(err));
|
|
48
|
+
}
|
|
49
|
+
const schema = (_a = result === null || result === void 0 ? void 0 : result.data) === null || _a === void 0 ? void 0 : _a.schema;
|
|
50
|
+
// No schema at all — we can't read a single UID, so nothing here is a CONFIRMED success.
|
|
51
|
+
// Re-probe one at a time (also the shape of a thrown/validation failure). Because nothing
|
|
52
|
+
// is confirmed, re-issuing is safe (the one exception — a commit that then threw client-side
|
|
53
|
+
// — is inherent at-least-once for a non-idempotent insert; see _mutate).
|
|
54
|
+
if (schema === undefined || schema === null) {
|
|
55
|
+
return {
|
|
56
|
+
attributed: false,
|
|
57
|
+
reason: docLevelMessage !== null && docLevelMessage !== void 0 ? docLevelMessage : (errors.length > 0 ? 'errors without data.schema' : 'empty response (no data.schema)'),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// Schema present ⇒ we can read every survivor's UID by key, so we attribute in place and
|
|
61
|
+
// NEVER fall back. Re-issuing a record that already has a UID would duplicate it.
|
|
62
|
+
const outcomes = [];
|
|
63
|
+
for (let i = 0; i < recordCount; i++) {
|
|
64
|
+
const errMsg = errByIndex.get(i);
|
|
65
|
+
if (errMsg !== undefined) {
|
|
66
|
+
outcomes.push({ status: classifySkeduloError(errMsg), error: (0, helpers_1.truncate)(errMsg) });
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const uid = (_b = schema[`alias${i + 1}`]) !== null && _b !== void 0 ? _b : null;
|
|
70
|
+
if (uid !== null) {
|
|
71
|
+
outcomes.push({ status: 'ok', result: uid }); // confirmed success — never re-issued
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
// No UID for this record and no per-alias error naming it. Only a DOCUMENT-level error
|
|
75
|
+
// (unattributable, whole-request) casts doubt here — then don't assume it landed. A
|
|
76
|
+
// per-alias error on OTHER records says nothing about this one, so we must not mass-fail
|
|
77
|
+
// no-UID records just because a sibling failed (some successful update/upsert writes may
|
|
78
|
+
// legitimately return no UID). Falls through to the insert/update defaults otherwise.
|
|
79
|
+
if (docLevelMessage !== null) {
|
|
80
|
+
outcomes.push({
|
|
81
|
+
status: classifySkeduloError(docLevelMessage),
|
|
82
|
+
error: (0, helpers_1.truncate)(docLevelMessage),
|
|
83
|
+
});
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (operation === 'insert') {
|
|
87
|
+
outcomes.push({
|
|
88
|
+
status: 'precondition',
|
|
89
|
+
error: 'insert returned no UID — IntegrationIdMapping may not be bootstrapped (run /setup then /on-initial-sync)',
|
|
90
|
+
});
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
outcomes.push({ status: 'ok', result: null });
|
|
94
|
+
}
|
|
95
|
+
return { attributed: true, outcomes };
|
|
96
|
+
}
|
|
97
|
+
// Fallback classifier for a Skedulo write error message, used only when the adapter didn't
|
|
98
|
+
// supply an errorClass (batch-level throws, mapping write-back). Transient = worth retrying
|
|
99
|
+
// (infra); permanent = won't change on retry (data). Prefer the adapter's own class
|
|
100
|
+
// (`classifyHttpStatus` in base.adapter.ts, from the HTTP status) — this is the last resort.
|
|
101
|
+
// Keyword-only on purpose: bare HTTP-status patterns (5xx / 429) were removed because this
|
|
102
|
+
// fallback only ever sees map/batch-throw text, which carries no genuine status code, so a
|
|
103
|
+
// number in prose would misclassify a permanent failure as transient and (with zero successes)
|
|
104
|
+
// wrongly trip decideCursor's outage hold — re-wedging the flow this feature exists to unwedge.
|
|
105
|
+
const TRANSIENT_ERROR = new RegExp([
|
|
106
|
+
'deadlock',
|
|
107
|
+
'lock (wait )?timeout',
|
|
108
|
+
'timeout',
|
|
109
|
+
'timed out',
|
|
110
|
+
'temporarily unavailable',
|
|
111
|
+
'service unavailable',
|
|
112
|
+
'too many requests',
|
|
113
|
+
'rate ?limit',
|
|
114
|
+
'throttl',
|
|
115
|
+
'econnreset',
|
|
116
|
+
'connection reset',
|
|
117
|
+
'socket hang up',
|
|
118
|
+
'(token|session|credentials?) expired',
|
|
119
|
+
'expired (token|session)',
|
|
120
|
+
].join('|'), 'i');
|
|
121
|
+
function classifySkeduloError(message) {
|
|
122
|
+
return TRANSIENT_ERROR.test(message) ? 'transient' : 'permanent';
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=skedulo-mutation-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skedulo-mutation-result.js","sourceRoot":"","sources":["../../src/adapters/skedulo-mutation-result.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,10 +16,14 @@ export declare class SkeduloAdapter implements Adapter<Record<string, unknown>>
|
|
|
16
16
|
checkBootstrap(ctx: IntegrationContext): Promise<BootstrapStatus>;
|
|
17
17
|
bootstrap(ctx: IntegrationContext): Promise<void>;
|
|
18
18
|
fetch(ctx: IntegrationContext, flow: DataFlow, since: Date | null, _filter: FilterSpec | null): AsyncIterable<Record<string, unknown>[]>;
|
|
19
|
+
fetchByIds(ctx: IntegrationContext, flow: DataFlow, ids: string[]): Promise<Record<string, unknown>[]>;
|
|
19
20
|
resolveLookups(ctx: IntegrationContext, flow: DataFlow, pairs: EnrichmentPair[]): Promise<void>;
|
|
20
21
|
upsert(ctx: IntegrationContext, flow: DataFlow, records: Record<string, unknown>[]): Promise<UpsertOutcome[]>;
|
|
21
22
|
private _attribution;
|
|
22
23
|
private _mutate;
|
|
24
|
+
private _rawMutate;
|
|
25
|
+
private _mutateEachSeparately;
|
|
26
|
+
private _mutateSingle;
|
|
23
27
|
delete(ctx: IntegrationContext, flow: DataFlow, ids: string[]): Promise<void>;
|
|
24
28
|
/** Delete by Skedulo UID directly — used by IdMappingSyncStrategy after mapping table lookup. */
|
|
25
29
|
deleteById(ctx: IntegrationContext, flow: DataFlow, ids: string[]): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skedulo.adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/skedulo.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,SAAS,EACT,UAAU,EACV,YAAY,EACZ,aAAa,EACd,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"skedulo.adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/skedulo.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,SAAS,EACT,UAAU,EACV,YAAY,EACZ,aAAa,EACd,MAAM,iCAAiC,CAAC;AAsBzC,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAKD,qBAAa,cAAe,YAAW,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrE,QAAQ,CAAC,eAAe,aAAkB;IAE1C,QAAQ,CAAC,YAAY;;;;MAIV;IAIX,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAkC;IAMlE,cAAc,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC;IAIjE,SAAS,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhD,KAAK,CACV,GAAG,EAAE,kBAAkB,EACvB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,IAAI,GAAG,IAAI,EAClB,OAAO,EAAE,UAAU,GAAG,IAAI,GACzB,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAoCrC,UAAU,CACd,GAAG,EAAE,kBAAkB,EACvB,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,MAAM,EAAE,GACZ,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAuB/B,cAAc,CAClB,GAAG,EAAE,kBAAkB,EACvB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,cAAc,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC;IAyCV,MAAM,CACV,GAAG,EAAE,kBAAkB,EACvB,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACjC,OAAO,CAAC,aAAa,EAAE,CAAC;IAqE3B,OAAO,CAAC,YAAY;YAYN,OAAO;YAkCP,UAAU;YAgCV,qBAAqB;YA2DrB,aAAa;IAwBrB,MAAM,CAAC,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBnF,iGAAiG;IAC3F,UAAU,CAAC,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvF,gBAAgB,IAAI,MAAM;IAI1B,mBAAmB,CACjB,SAAS,EAAE,MAAM,EAAE,EACnB,QAAQ,EAAE,aAAa,EAAE,GACxB,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAQ1C,UAAU,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAO1D,SAAS,CAAC,GAAG,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAe5E,kBAAkB,CACtB,GAAG,EAAE,kBAAkB,EACvB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAAE,EACpB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,YAAY,EAAE,CAAC;IAa1B;;;;;OAKG;YACW,mBAAmB;YA4BnB,YAAY;CA+B3B;AASD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
|