@skedulo/integration-sdk 0.8.2 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/.claude/worktrees/agent-a16acadaf5412dffd/jest.config.js +12 -0
  2. package/.claude/worktrees/agent-a33c3e4636d488e49/jest.config.js +12 -0
  3. package/.claude/worktrees/agent-a5b1d2ffa4ceef4a6/jest.config.js +12 -0
  4. package/.claude/worktrees/agent-aa1db4c22eabbde8e/jest.config.js +12 -0
  5. package/.claude/worktrees/agent-ac197ae8c69d7061c/jest.config.js +12 -0
  6. package/CHANGELOG.md +25 -0
  7. package/dist/actions/data-flow/preview.action.d.ts.map +1 -1
  8. package/dist/actions/data-flow/preview.action.js +18 -3
  9. package/dist/actions/data-flow/preview.action.js.map +1 -1
  10. package/dist/actions/event/on-skedulo.action.d.ts.map +1 -1
  11. package/dist/actions/event/on-skedulo.action.js +12 -1
  12. package/dist/actions/event/on-skedulo.action.js.map +1 -1
  13. package/dist/actions/event/on-vendor.action.d.ts.map +1 -1
  14. package/dist/actions/event/on-vendor.action.js +0 -3
  15. package/dist/actions/event/on-vendor.action.js.map +1 -1
  16. package/dist/actions/event/types.d.ts +2 -0
  17. package/dist/actions/event/types.d.ts.map +1 -1
  18. package/dist/actions/utils/types.d.ts +2 -0
  19. package/dist/actions/utils/types.d.ts.map +1 -1
  20. package/dist/adapters/base-adapter-handler.d.ts +2 -0
  21. package/dist/adapters/base-adapter-handler.d.ts.map +1 -1
  22. package/dist/adapters/base-adapter-handler.js +4 -1
  23. package/dist/adapters/base-adapter-handler.js.map +1 -1
  24. package/dist/adapters/skedulo.adapter.d.ts +1 -0
  25. package/dist/adapters/skedulo.adapter.d.ts.map +1 -1
  26. package/dist/adapters/skedulo.adapter.js +25 -18
  27. package/dist/adapters/skedulo.adapter.js.map +1 -1
  28. package/dist/constants.d.ts +6 -0
  29. package/dist/constants.d.ts.map +1 -1
  30. package/dist/constants.js +8 -1
  31. package/dist/constants.js.map +1 -1
  32. package/dist/handlers/metadata.handler.d.ts +17 -0
  33. package/dist/handlers/metadata.handler.d.ts.map +1 -0
  34. package/dist/handlers/metadata.handler.js +50 -0
  35. package/dist/handlers/metadata.handler.js.map +1 -0
  36. package/dist/index.d.ts +2 -1
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +5 -2
  39. package/dist/index.js.map +1 -1
  40. package/dist/services/field-mapping.service.d.ts +7 -0
  41. package/dist/services/field-mapping.service.d.ts.map +1 -1
  42. package/dist/services/field-mapping.service.js +16 -0
  43. package/dist/services/field-mapping.service.js.map +1 -1
  44. package/dist/services/sync-runner.d.ts +0 -6
  45. package/dist/services/sync-runner.d.ts.map +1 -1
  46. package/dist/services/sync-runner.js +6 -78
  47. package/dist/services/sync-runner.js.map +1 -1
  48. package/dist/services/sync.service.d.ts +11 -1
  49. package/dist/services/sync.service.d.ts.map +1 -1
  50. package/dist/services/sync.service.js +30 -4
  51. package/dist/services/sync.service.js.map +1 -1
  52. package/dist/utils/coerceFilterValues.d.ts +10 -0
  53. package/dist/utils/coerceFilterValues.d.ts.map +1 -0
  54. package/dist/utils/coerceFilterValues.js +51 -0
  55. package/dist/utils/coerceFilterValues.js.map +1 -0
  56. package/dist/utils/compileFilter.d.ts.map +1 -1
  57. package/dist/utils/compileFilter.js +13 -1
  58. package/dist/utils/compileFilter.js.map +1 -1
  59. package/dist/utils/normalizeDataFlow.d.ts +3 -0
  60. package/dist/utils/normalizeDataFlow.d.ts.map +1 -0
  61. package/dist/utils/normalizeDataFlow.js +37 -0
  62. package/dist/utils/normalizeDataFlow.js.map +1 -0
  63. package/dist/utils.d.ts +2 -0
  64. package/dist/utils.d.ts.map +1 -0
  65. package/dist/utils.js +10 -0
  66. package/dist/utils.js.map +1 -0
  67. package/package.json +2 -2
  68. package/yarn.lock +7 -7
  69. package/dist/actions/data-flow.action.d.ts +0 -62
  70. package/dist/actions/data-flow.action.d.ts.map +0 -1
  71. package/dist/actions/data-flow.action.js +0 -217
  72. package/dist/actions/data-flow.action.js.map +0 -1
  73. package/dist/actions/event.action.d.ts +0 -32
  74. package/dist/actions/event.action.d.ts.map +0 -1
  75. package/dist/actions/event.action.js +0 -113
  76. package/dist/actions/event.action.js.map +0 -1
  77. package/dist/actions/metadata.action.d.ts +0 -44
  78. package/dist/actions/metadata.action.d.ts.map +0 -1
  79. package/dist/actions/metadata.action.js +0 -96
  80. package/dist/actions/metadata.action.js.map +0 -1
  81. package/dist/actions/scheduled-job.action.d.ts +0 -73
  82. package/dist/actions/scheduled-job.action.d.ts.map +0 -1
  83. package/dist/actions/scheduled-job.action.js +0 -355
  84. package/dist/actions/scheduled-job.action.js.map +0 -1
  85. package/dist/actions/sync.action.d.ts +0 -26
  86. package/dist/actions/sync.action.d.ts.map +0 -1
  87. package/dist/actions/sync.action.js +0 -81
  88. package/dist/actions/sync.action.js.map +0 -1
  89. package/dist/services/artifact-builder.d.ts +0 -95
  90. package/dist/services/artifact-builder.d.ts.map +0 -1
  91. package/dist/services/artifact-builder.js +0 -142
  92. package/dist/services/artifact-builder.js.map +0 -1
@@ -1,355 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.makeRunJobAction = makeRunJobAction;
4
- exports.makeScheduledJobListAction = makeScheduledJobListAction;
5
- exports.makeScheduledJobGetAction = makeScheduledJobGetAction;
6
- exports.makeScheduledJobCreateAction = makeScheduledJobCreateAction;
7
- exports.makeScheduledJobUpdateAction = makeScheduledJobUpdateAction;
8
- exports.makeScheduledJobDeleteAction = makeScheduledJobDeleteAction;
9
- const pulse_solution_services_1 = require("@skedulo/pulse-solution-services");
10
- const constants_1 = require("../constants");
11
- const scheduled_job_interface_1 = require("../interfaces/scheduled-job.interface");
12
- const sync_runner_1 = require("../services/sync-runner");
13
- const helpers_1 = require("../utils/helpers");
14
- const artifact_builder_1 = require("../utils/artifact-builder");
15
- const action_names_1 = require("./utils/action-names");
16
- const helpers_2 = require("./utils/helpers");
17
- const errors_1 = require("./utils/errors");
18
- // ── shared helpers ─────────────────────────────────────────────────────────
19
- function readConfig(ctx, integrationType) {
20
- return ctx.integrationConfigClient.get(integrationType).then((raw) => (0, scheduled_job_interface_1.asIntegrationConfig)(raw));
21
- }
22
- function jobCron(job) {
23
- return (0, artifact_builder_1.intervalMinutesToCron)((0, artifact_builder_1.jobIntervalToMinutes)(job));
24
- }
25
- /** A job fires only when enabled with at least one flow. */
26
- function jobShouldRun(job) {
27
- return job.enabled && job.flow_ids.length > 0;
28
- }
29
- /**
30
- * Reconcile the ES webhook for a job: provision when it should run, otherwise
31
- * tear it down (404-tolerant). `webhook_name` is both the artifact name and the
32
- * job-id header.
33
- */
34
- async function reconcileJobArtifact(ctx, job) {
35
- const client = ctx.newArtifactClient(pulse_solution_services_1.ArtifactType.WEBHOOK);
36
- if (jobShouldRun(job)) {
37
- await (0, artifact_builder_1.upsertArtifact)(client, job.webhook_name, (0, artifact_builder_1.buildJobWebhookArtifact)({
38
- webhookName: job.webhook_name,
39
- url: (0, artifact_builder_1.functionCallbackUrl)(ctx.integrationType),
40
- cron: jobCron(job),
41
- }));
42
- }
43
- else {
44
- await (0, artifact_builder_1.deleteArtifactIfExists)(client, job.webhook_name);
45
- }
46
- }
47
- /**
48
- * Validate that every `flow_id` belongs to this integration and that no id is
49
- * already claimed by another job (J5 — the per-flow cursor can't be shared).
50
- */
51
- async function validateFlowIds(ctx, integrationType, flowIds, otherJobs) {
52
- const claimed = new Map();
53
- for (const j of otherJobs) {
54
- for (const id of j.flow_ids)
55
- claimed.set(id, j.webhook_name);
56
- }
57
- for (const id of flowIds) {
58
- const owner = claimed.get(id);
59
- if (owner) {
60
- throw new errors_1.InvalidInputError(`Flow ${id} is already in scheduled job '${owner}'`);
61
- }
62
- }
63
- if (flowIds.length === 0)
64
- return;
65
- const existing = await ctx.dataFlowService.list({ integrationType });
66
- const validIds = new Set(existing.map((f) => f.id));
67
- for (const id of flowIds) {
68
- if (!validIds.has(id)) {
69
- throw new errors_1.InvalidInputError(`Flow ${id} does not exist for integration '${integrationType}'`);
70
- }
71
- }
72
- }
73
- // ── input parsing ────────────────────────────────────────────────────────────
74
- function asRecord(raw) {
75
- return (raw !== null && raw !== void 0 ? raw : {});
76
- }
77
- function parseName(value) {
78
- if (typeof value !== 'string' || value.trim().length === 0) {
79
- throw new errors_1.InvalidInputError('name must be a non-empty string');
80
- }
81
- return value;
82
- }
83
- function parseIntervalUnit(value) {
84
- if (value === scheduled_job_interface_1.JobIntervalUnit.MINUTES || value === scheduled_job_interface_1.JobIntervalUnit.HOURS)
85
- return value;
86
- throw new errors_1.InvalidInputError('interval_unit must be "minutes" or "hours"');
87
- }
88
- function parseFlowIds(value) {
89
- if (!Array.isArray(value) || value.some((id) => !Number.isInteger(id) || id <= 0)) {
90
- throw new errors_1.InvalidInputError('flow_ids must be an array of positive integers');
91
- }
92
- // Reject duplicates within the same job — ordering must be unambiguous.
93
- if (new Set(value).size !== value.length) {
94
- throw new errors_1.InvalidInputError('flow_ids must not contain duplicates');
95
- }
96
- return value;
97
- }
98
- function parseWebhookName(raw) {
99
- var _a;
100
- const obj = asRecord(raw);
101
- // Accept both casings at the wire boundary: the persisted shape uses
102
- // `webhook_name`, while UI/TS callers send `webhookName`.
103
- const name = (_a = obj.webhook_name) !== null && _a !== void 0 ? _a : obj.webhookName;
104
- if (typeof name !== 'string' || name.length === 0) {
105
- throw new errors_1.InvalidInputError('webhook_name must be a non-empty string');
106
- }
107
- return name;
108
- }
109
- /**
110
- * Run a scheduled job: load it from config by `webhook_name`, then run its
111
- * `flow_ids` sequentially in order. Continue-on-error — one flow failing does
112
- * not stop the rest; the failed flow's cursor holds (SyncRunner only advances on
113
- * zero failures) so it retries next cycle. Per-flow direction is decided by the
114
- * flow's own `sourceSystem`.
115
- */
116
- function makeRunJobAction(deps) {
117
- return {
118
- name: action_names_1.ACTIONS.sync.runJob,
119
- parseInput(raw, meta) {
120
- const fromMeta = meta === null || meta === void 0 ? void 0 : meta.scheduledJobName;
121
- if (typeof fromMeta === 'string' && fromMeta.length > 0) {
122
- return { webhookName: fromMeta };
123
- }
124
- return { webhookName: parseWebhookName(raw) };
125
- },
126
- async handler(input, ctx) {
127
- var _a, _b;
128
- const integrationType = deps.adapter.integrationType;
129
- const lookupStrategy = (0, helpers_2.resolveLookupStrategy)(deps.adapter);
130
- const config = await readConfig(ctx, integrationType);
131
- const job = config.scheduled_jobs.find((j) => j.webhook_name === input.webhookName);
132
- if (!job) {
133
- throw new errors_1.ActionError('JOB_NOT_FOUND', `Scheduled job '${input.webhookName}' not found`);
134
- }
135
- if (!jobShouldRun(job)) {
136
- ctx.logger.info(`[run-job] ${job.webhook_name} skipped (disabled or no flows)`);
137
- return { webhookName: job.webhook_name, skipped: true, results: [] };
138
- }
139
- ctx.logger.info(`[run-job] ${job.webhook_name} running ${job.flow_ids.length} flow(s) in order: ` +
140
- job.flow_ids.join(', '));
141
- const runner = new sync_runner_1.SyncRunner(deps.registry);
142
- const results = [];
143
- for (const flowId of job.flow_ids) {
144
- const startedAt = Date.now();
145
- try {
146
- const flow = await ctx.dataFlowService.getFlowById(flowId);
147
- if (!flow) {
148
- ctx.logger.warn(`[run-job] ${job.webhook_name} flow=${flowId} not found — skipping`);
149
- results.push({ flowId, skipped: true, reason: 'flow not found' });
150
- continue;
151
- }
152
- const stats = await runner.run({
153
- flowId,
154
- since: null,
155
- sourceSystem: (_a = flow.sourceSystem) !== null && _a !== void 0 ? _a : integrationType,
156
- targetSystem: (_b = flow.targetSystem) !== null && _b !== void 0 ? _b : constants_1.SKEDULO_SYSTEM,
157
- options: { lookupStrategy },
158
- }, ctx);
159
- const durationMs = Date.now() - startedAt;
160
- ctx.logger.info(`[run-job] ${job.webhook_name} flow=${flowId} ${flow.sourceObject}→${flow.targetObject} ` +
161
- `${JSON.stringify(stats)} took=${durationMs}ms`);
162
- results.push(Object.assign({ flowId, sourceObject: flow.sourceObject, targetObject: flow.targetObject, durationMs }, stats));
163
- }
164
- catch (err) {
165
- const msg = err instanceof Error ? err.message : String(err);
166
- ctx.logger.error(`[run-job] ${job.webhook_name} flow=${flowId} failed: ${msg}`);
167
- results.push({ flowId, error: msg });
168
- }
169
- }
170
- return { webhookName: job.webhook_name, results };
171
- },
172
- };
173
- }
174
- // ── scheduled-job.list / .get ────────────────────────────────────────────────
175
- function makeScheduledJobListAction(deps) {
176
- return {
177
- name: action_names_1.ACTIONS.scheduledJob.list,
178
- parseInput() {
179
- return undefined;
180
- },
181
- async handler(_input, ctx) {
182
- const config = await readConfig(ctx, deps.adapter.integrationType);
183
- return config.scheduled_jobs;
184
- },
185
- };
186
- }
187
- function makeScheduledJobGetAction(deps) {
188
- return {
189
- name: action_names_1.ACTIONS.scheduledJob.get,
190
- parseInput(raw) {
191
- return { webhookName: parseWebhookName(raw) };
192
- },
193
- async handler(input, ctx) {
194
- const config = await readConfig(ctx, deps.adapter.integrationType);
195
- const job = config.scheduled_jobs.find((j) => j.webhook_name === input.webhookName);
196
- if (!job) {
197
- throw new errors_1.ActionError('JOB_NOT_FOUND', `Scheduled job '${input.webhookName}' not found`);
198
- }
199
- return job;
200
- },
201
- };
202
- }
203
- function makeScheduledJobCreateAction(deps) {
204
- return {
205
- name: action_names_1.ACTIONS.scheduledJob.create,
206
- parseInput(raw) {
207
- var _a;
208
- const obj = asRecord(raw);
209
- // Validate interval bounds eagerly so bad input is rejected at parse time.
210
- const interval_value = typeof obj.interval_value === 'number' ? obj.interval_value : Number.NaN;
211
- const input = {
212
- name: parseName(obj.name),
213
- interval_value,
214
- interval_unit: parseIntervalUnit(obj.interval_unit),
215
- flow_ids: parseFlowIds((_a = obj.flow_ids) !== null && _a !== void 0 ? _a : []),
216
- enabled: obj.enabled === undefined ? true : Boolean(obj.enabled),
217
- };
218
- (0, artifact_builder_1.jobIntervalToMinutes)(input); // throws InvalidInputError on out-of-range
219
- return input;
220
- },
221
- async handler(input, ctx) {
222
- if (!(0, helpers_1.isAdminRequest)(ctx.skedContext)) {
223
- throw new errors_1.ActionError('FORBIDDEN', 'scheduled-job.create requires admin privileges');
224
- }
225
- const integrationType = deps.adapter.integrationType;
226
- const webhook_name = (0, artifact_builder_1.buildJobArtifactName)(integrationType, input.name);
227
- const prev = await readConfig(ctx, integrationType);
228
- if (prev.scheduled_jobs.some((j) => j.webhook_name === webhook_name)) {
229
- throw new errors_1.InvalidInputError(`A scheduled job named '${input.name}' already exists (webhook_name '${webhook_name}')`);
230
- }
231
- await validateFlowIds(ctx, integrationType, input.flow_ids, prev.scheduled_jobs);
232
- const job = {
233
- webhook_name,
234
- name: input.name,
235
- interval_value: input.interval_value,
236
- interval_unit: input.interval_unit,
237
- flow_ids: input.flow_ids,
238
- enabled: input.enabled,
239
- };
240
- const next = { scheduled_jobs: [...prev.scheduled_jobs, job] };
241
- await writeConfigThenArtifact(ctx, integrationType, prev, next, job);
242
- return job;
243
- },
244
- };
245
- }
246
- function makeScheduledJobUpdateAction(deps) {
247
- return {
248
- name: action_names_1.ACTIONS.scheduledJob.update,
249
- parseInput(raw) {
250
- const obj = asRecord(raw);
251
- const input = { webhook_name: parseWebhookName(raw) };
252
- if (obj.name !== undefined)
253
- input.name = parseName(obj.name);
254
- if (obj.interval_value !== undefined) {
255
- if (typeof obj.interval_value !== 'number') {
256
- throw new errors_1.InvalidInputError('interval_value must be a number');
257
- }
258
- input.interval_value = obj.interval_value;
259
- }
260
- if (obj.interval_unit !== undefined)
261
- input.interval_unit = parseIntervalUnit(obj.interval_unit);
262
- if (obj.flow_ids !== undefined)
263
- input.flow_ids = parseFlowIds(obj.flow_ids);
264
- if (obj.enabled !== undefined)
265
- input.enabled = Boolean(obj.enabled);
266
- return input;
267
- },
268
- async handler(input, ctx) {
269
- var _a, _b, _c, _d, _e;
270
- if (!(0, helpers_1.isAdminRequest)(ctx.skedContext)) {
271
- throw new errors_1.ActionError('FORBIDDEN', 'scheduled-job.update requires admin privileges');
272
- }
273
- const integrationType = deps.adapter.integrationType;
274
- const prev = await readConfig(ctx, integrationType);
275
- const existing = prev.scheduled_jobs.find((j) => j.webhook_name === input.webhook_name);
276
- if (!existing) {
277
- throw new errors_1.ActionError('JOB_NOT_FOUND', `Scheduled job '${input.webhook_name}' not found`);
278
- }
279
- // webhook_name is immutable — only the mutable fields change.
280
- const merged = {
281
- webhook_name: existing.webhook_name,
282
- name: (_a = input.name) !== null && _a !== void 0 ? _a : existing.name,
283
- interval_value: (_b = input.interval_value) !== null && _b !== void 0 ? _b : existing.interval_value,
284
- interval_unit: (_c = input.interval_unit) !== null && _c !== void 0 ? _c : existing.interval_unit,
285
- flow_ids: (_d = input.flow_ids) !== null && _d !== void 0 ? _d : existing.flow_ids,
286
- enabled: (_e = input.enabled) !== null && _e !== void 0 ? _e : existing.enabled,
287
- };
288
- (0, artifact_builder_1.jobIntervalToMinutes)(merged); // re-validate bounds after merge
289
- const others = prev.scheduled_jobs.filter((j) => j.webhook_name !== input.webhook_name);
290
- if (input.flow_ids !== undefined) {
291
- await validateFlowIds(ctx, integrationType, merged.flow_ids, others);
292
- }
293
- const next = {
294
- scheduled_jobs: prev.scheduled_jobs.map((j) => j.webhook_name === merged.webhook_name ? merged : j),
295
- };
296
- await writeConfigThenArtifact(ctx, integrationType, prev, next, merged);
297
- return merged;
298
- },
299
- };
300
- }
301
- // ── scheduled-job.delete ─────────────────────────────────────────────────────
302
- /**
303
- * Delete a scheduled job. Config is the source of truth, so the job is dropped
304
- * from config first, then the webhook is torn down (404-tolerant, best-effort).
305
- * If ES returns a 5xx the config write still stands and an orphan webhook may
306
- * remain — safe to retry the delete, which is idempotent.
307
- */
308
- function makeScheduledJobDeleteAction(deps) {
309
- return {
310
- name: action_names_1.ACTIONS.scheduledJob.delete,
311
- parseInput(raw) {
312
- return { webhookName: parseWebhookName(raw) };
313
- },
314
- async handler(input, ctx) {
315
- if (!(0, helpers_1.isAdminRequest)(ctx.skedContext)) {
316
- throw new errors_1.ActionError('FORBIDDEN', 'scheduled-job.delete requires admin privileges');
317
- }
318
- const integrationType = deps.adapter.integrationType;
319
- const prev = await readConfig(ctx, integrationType);
320
- const existed = prev.scheduled_jobs.some((j) => j.webhook_name === input.webhookName);
321
- // Config is source of truth: drop the job first, then tear down the webhook
322
- // (404-tolerant, so no rollback needed). Idempotent if already gone.
323
- if (existed) {
324
- const next = {
325
- scheduled_jobs: prev.scheduled_jobs.filter((j) => j.webhook_name !== input.webhookName),
326
- };
327
- await ctx.integrationConfigClient.replace(integrationType, next);
328
- }
329
- await (0, artifact_builder_1.deleteArtifactIfExists)(ctx.newArtifactClient(pulse_solution_services_1.ArtifactType.WEBHOOK), input.webhookName);
330
- return { webhookName: input.webhookName, deleted: existed };
331
- },
332
- };
333
- }
334
- /**
335
- * Two-phase fail-closed write for create/update: persist config first, then
336
- * reconcile the ES artifact. If the artifact step throws, roll the config back
337
- * to `prev` (IS uses replace semantics) before re-raising — no orphaned webhook,
338
- * no lost config.
339
- */
340
- async function writeConfigThenArtifact(ctx, integrationType, prev, next, job) {
341
- await ctx.integrationConfigClient.replace(integrationType, next);
342
- try {
343
- await reconcileJobArtifact(ctx, job);
344
- }
345
- catch (err) {
346
- try {
347
- await ctx.integrationConfigClient.replace(integrationType, prev);
348
- }
349
- catch (_a) {
350
- // best-effort rollback; surface the original artifact error
351
- }
352
- throw err;
353
- }
354
- }
355
- //# sourceMappingURL=scheduled-job.action.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scheduled-job.action.js","sourceRoot":"","sources":["../../src/actions/scheduled-job.action.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,81 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync.action.js","sourceRoot":"","sources":["../../src/actions/sync.action.ts"],"names":[],"mappings":"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"}
@@ -1,95 +0,0 @@
1
- import type { ArtifactClient } from '@skedulo/pulse-solution-services';
2
- import type { DataFlow } from '../interfaces/data-flow-spec.interface';
3
- import { ACTIONS } from '../actions/utils/action-names';
4
- /**
5
- * Deterministic artifact name used as the idempotency key for the
6
- * webhook / triggered action provisioned for a DataFlow.
7
- *
8
- * Format: `sked-int-${integrationType}-${sourceObject}-to-${targetObject}-flow${id}`
9
- * Throws if the result exceeds 100 chars (we don't truncate, since collisions
10
- * on the prefix would cause silent cross-flow overwrites).
11
- */
12
- export declare function buildArtifactName(flow: DataFlow, integrationType: string): string;
13
- /**
14
- * Convert `intervalMinutes` to a 5-field cron expression.
15
- * - n <= 1 → `* * * * *` (every minute)
16
- * - 1 < n < 60 → `*\/n * * * *`
17
- * - 60 <= n, multiples of 60 → `0 *\/h * * *` (every h hours)
18
- * - otherwise → fall back to `*\/n * * * *` (cron itself rejects > 59 in min field;
19
- * callers should pass a divisor of 60 for n >= 60)
20
- */
21
- export declare function intervalMinutesToCron(intervalMinutes: number): string;
22
- /**
23
- * GraphQL selection-set fragment for the triggered action's `action.query`.
24
- * ES executes this against the Skedulo schema and POSTs the result as the
25
- * function body, so it MUST include every Skedulo field the mapping reads.
26
- * `UID` is always included since we use it as the record identifier.
27
- */
28
- export declare function buildSkeduloQuery(flow: DataFlow): string;
29
- export interface BuildScheduledWebhookOpts {
30
- name: string;
31
- url: string;
32
- cron: string;
33
- /** Value placed on the dispatcher action header so the function knows which action to run. */
34
- action: typeof ACTIONS.sync.push | typeof ACTIONS.sync.scheduledPull;
35
- dataFlowId: number;
36
- }
37
- export declare function buildScheduledWebhookArtifact(opts: BuildScheduledWebhookOpts): {
38
- name: string;
39
- metadata: {
40
- type: string;
41
- };
42
- webhook: {
43
- type: string;
44
- url: string;
45
- cron: string;
46
- headers: {
47
- Authorization: string;
48
- "sked-integration-action": "sync.push" | "sync.scheduled-pull";
49
- 'sked-data-flow-id': string;
50
- };
51
- };
52
- };
53
- export interface BuildTriggeredActionOpts {
54
- name: string;
55
- url: string;
56
- /** Skedulo schema name to subscribe to (e.g. `"Jobs"`). */
57
- schemaName: string;
58
- /** GraphQL selection-set fragment, e.g. `"{ UID Name JobStatus }"`. */
59
- query: string;
60
- dataFlowId: number;
61
- }
62
- export declare function buildTriggeredActionArtifact(opts: BuildTriggeredActionOpts): {
63
- name: string;
64
- metadata: {
65
- type: string;
66
- };
67
- enabled: boolean;
68
- trigger: {
69
- type: string;
70
- schemaName: string;
71
- filter: string;
72
- };
73
- action: {
74
- type: string;
75
- url: string;
76
- headers: {
77
- Authorization: string;
78
- "sked-integration-action": "event.on-skedulo";
79
- 'sked-data-flow-id': string;
80
- };
81
- query: string;
82
- };
83
- };
84
- /**
85
- * Idempotent upsert: try `get` then `update`; on any error (including not-found)
86
- * fall back to `create`. The PSS artifact API is name-keyed, so this collapses
87
- * "create" and "replace" into a single safe call.
88
- */
89
- export declare function upsertArtifact(client: ArtifactClient, name: string, artifact: unknown): Promise<void>;
90
- /**
91
- * Delete by name, swallowing not-found errors so deactivate is idempotent.
92
- * The PSS client throws `Error("HTTP error! Status: 404. …")`; match on that.
93
- */
94
- export declare function deleteArtifactIfExists(client: ArtifactClient, name: string): Promise<void>;
95
- //# sourceMappingURL=artifact-builder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"artifact-builder.d.ts","sourceRoot":"","sources":["../../src/services/artifact-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AACvE,OAAO,EAAiB,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAWvE;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAajF;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAQrE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAUxD;AAMD,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,8FAA8F;IAC9F,MAAM,EAAE,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;IACrE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,yBAAyB;;;;;;;;;;;;;;;EAe5E;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,wBAAwB;;;;;;;;;;;;;;;;;;;;;EAqB1E;AAID;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhG"}