@skedulo/integration-sdk 0.3.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +38 -19
  3. package/dist/actions/action-registry.d.ts.map +1 -1
  4. package/dist/actions/action-registry.js +27 -23
  5. package/dist/actions/action-registry.js.map +1 -1
  6. package/dist/actions/data-flow/activate.action.d.ts +10 -0
  7. package/dist/actions/data-flow/activate.action.d.ts.map +1 -0
  8. package/dist/actions/data-flow/activate.action.js +22 -0
  9. package/dist/actions/data-flow/activate.action.js.map +1 -0
  10. package/dist/actions/data-flow/create.action.d.ts +9 -0
  11. package/dist/actions/data-flow/create.action.d.ts.map +1 -0
  12. package/dist/actions/data-flow/create.action.js +55 -0
  13. package/dist/actions/data-flow/create.action.js.map +1 -0
  14. package/dist/actions/data-flow/deactivate.action.d.ts +9 -0
  15. package/dist/actions/data-flow/deactivate.action.d.ts.map +1 -0
  16. package/dist/actions/data-flow/deactivate.action.js +21 -0
  17. package/dist/actions/data-flow/deactivate.action.js.map +1 -0
  18. package/dist/actions/data-flow/delete.action.d.ts +10 -0
  19. package/dist/actions/data-flow/delete.action.d.ts.map +1 -0
  20. package/dist/actions/data-flow/delete.action.js +33 -0
  21. package/dist/actions/data-flow/delete.action.js.map +1 -0
  22. package/dist/actions/data-flow/get.action.d.ts +5 -0
  23. package/dist/actions/data-flow/get.action.d.ts.map +1 -0
  24. package/dist/actions/data-flow/get.action.js +22 -0
  25. package/dist/actions/data-flow/get.action.js.map +1 -0
  26. package/dist/actions/data-flow/index.d.ts +9 -0
  27. package/dist/actions/data-flow/index.d.ts.map +1 -0
  28. package/dist/actions/data-flow/index.js +33 -0
  29. package/dist/actions/data-flow/index.js.map +1 -0
  30. package/dist/actions/data-flow/list.action.d.ts +6 -0
  31. package/dist/actions/data-flow/list.action.d.ts.map +1 -0
  32. package/dist/actions/data-flow/list.action.js +25 -0
  33. package/dist/actions/data-flow/list.action.js.map +1 -0
  34. package/dist/actions/data-flow/shared.d.ts +3 -0
  35. package/dist/actions/data-flow/shared.d.ts.map +1 -0
  36. package/dist/actions/data-flow/shared.js +16 -0
  37. package/dist/actions/data-flow/shared.js.map +1 -0
  38. package/dist/actions/data-flow/types.d.ts +21 -0
  39. package/dist/actions/data-flow/types.d.ts.map +1 -0
  40. package/dist/actions/data-flow/types.js +3 -0
  41. package/dist/actions/data-flow/types.js.map +1 -0
  42. package/dist/actions/data-flow/update.action.d.ts +16 -0
  43. package/dist/actions/data-flow/update.action.d.ts.map +1 -0
  44. package/dist/actions/data-flow/update.action.js +62 -0
  45. package/dist/actions/data-flow/update.action.js.map +1 -0
  46. package/dist/actions/data-flow.action.d.ts.map +1 -1
  47. package/dist/actions/data-flow.action.js +5 -9
  48. package/dist/actions/data-flow.action.js.map +1 -1
  49. package/dist/actions/event/index.d.ts +4 -0
  50. package/dist/actions/event/index.d.ts.map +1 -0
  51. package/dist/actions/event/index.js +23 -0
  52. package/dist/actions/event/index.js.map +1 -0
  53. package/dist/actions/event/on-skedulo.action.d.ts +4 -0
  54. package/dist/actions/event/on-skedulo.action.d.ts.map +1 -0
  55. package/dist/actions/event/on-skedulo.action.js +81 -0
  56. package/dist/actions/event/on-skedulo.action.js.map +1 -0
  57. package/dist/actions/event/on-vendor.action.d.ts +4 -0
  58. package/dist/actions/event/on-vendor.action.d.ts.map +1 -0
  59. package/dist/actions/event/on-vendor.action.js +39 -0
  60. package/dist/actions/event/on-vendor.action.js.map +1 -0
  61. package/dist/actions/event/types.d.ts +28 -0
  62. package/dist/actions/event/types.d.ts.map +1 -0
  63. package/dist/actions/event/types.js +3 -0
  64. package/dist/actions/event/types.js.map +1 -0
  65. package/dist/actions/event.action.d.ts +9 -4
  66. package/dist/actions/event.action.d.ts.map +1 -1
  67. package/dist/actions/event.action.js +57 -33
  68. package/dist/actions/event.action.js.map +1 -1
  69. package/dist/actions/metadata/get-fields.action.d.ts +5 -0
  70. package/dist/actions/metadata/get-fields.action.d.ts.map +1 -0
  71. package/dist/actions/metadata/get-fields.action.js +26 -0
  72. package/dist/actions/metadata/get-fields.action.js.map +1 -0
  73. package/dist/actions/metadata/get-objects.action.d.ts +5 -0
  74. package/dist/actions/metadata/get-objects.action.d.ts.map +1 -0
  75. package/dist/actions/metadata/get-objects.action.js +18 -0
  76. package/dist/actions/metadata/get-objects.action.js.map +1 -0
  77. package/dist/actions/metadata/get-sample-apis.action.d.ts +5 -0
  78. package/dist/actions/metadata/get-sample-apis.action.d.ts.map +1 -0
  79. package/dist/actions/metadata/get-sample-apis.action.js +19 -0
  80. package/dist/actions/metadata/get-sample-apis.action.js.map +1 -0
  81. package/dist/actions/metadata/get-sample-records.action.d.ts +5 -0
  82. package/dist/actions/metadata/get-sample-records.action.d.ts.map +1 -0
  83. package/dist/actions/metadata/get-sample-records.action.js +33 -0
  84. package/dist/actions/metadata/get-sample-records.action.js.map +1 -0
  85. package/dist/actions/metadata/get-templates.action.d.ts +5 -0
  86. package/dist/actions/metadata/get-templates.action.d.ts.map +1 -0
  87. package/dist/actions/metadata/get-templates.action.js +19 -0
  88. package/dist/actions/metadata/get-templates.action.js.map +1 -0
  89. package/dist/actions/metadata/index.d.ts +7 -0
  90. package/dist/actions/metadata/index.d.ts.map +1 -0
  91. package/dist/actions/metadata/index.js +29 -0
  92. package/dist/actions/metadata/index.js.map +1 -0
  93. package/dist/actions/metadata/shared.d.ts +6 -0
  94. package/dist/actions/metadata/shared.d.ts.map +1 -0
  95. package/dist/actions/metadata/shared.js +11 -0
  96. package/dist/actions/metadata/shared.js.map +1 -0
  97. package/dist/actions/metadata/types.d.ts +38 -0
  98. package/dist/actions/metadata/types.d.ts.map +1 -0
  99. package/dist/actions/metadata/types.js +3 -0
  100. package/dist/actions/metadata/types.js.map +1 -0
  101. package/dist/actions/scheduled-job/create.action.d.ts +5 -0
  102. package/dist/actions/scheduled-job/create.action.d.ts.map +1 -0
  103. package/dist/actions/scheduled-job/create.action.js +53 -0
  104. package/dist/actions/scheduled-job/create.action.js.map +1 -0
  105. package/dist/actions/scheduled-job/delete.action.d.ts +15 -0
  106. package/dist/actions/scheduled-job/delete.action.d.ts.map +1 -0
  107. package/dist/actions/scheduled-job/delete.action.js +42 -0
  108. package/dist/actions/scheduled-job/delete.action.js.map +1 -0
  109. package/dist/actions/scheduled-job/get.action.d.ts +7 -0
  110. package/dist/actions/scheduled-job/get.action.d.ts.map +1 -0
  111. package/dist/actions/scheduled-job/get.action.js +23 -0
  112. package/dist/actions/scheduled-job/get.action.js.map +1 -0
  113. package/dist/actions/scheduled-job/index.d.ts +7 -0
  114. package/dist/actions/scheduled-job/index.d.ts.map +1 -0
  115. package/dist/actions/scheduled-job/index.js +29 -0
  116. package/dist/actions/scheduled-job/index.js.map +1 -0
  117. package/dist/actions/scheduled-job/list.action.d.ts +5 -0
  118. package/dist/actions/scheduled-job/list.action.d.ts.map +1 -0
  119. package/dist/actions/scheduled-job/list.action.js +18 -0
  120. package/dist/actions/scheduled-job/list.action.js.map +1 -0
  121. package/dist/actions/scheduled-job/shared.d.ts +30 -0
  122. package/dist/actions/scheduled-job/shared.d.ts.map +1 -0
  123. package/dist/actions/scheduled-job/shared.js +129 -0
  124. package/dist/actions/scheduled-job/shared.js.map +1 -0
  125. package/dist/actions/scheduled-job/types.d.ts +23 -0
  126. package/dist/actions/scheduled-job/types.d.ts.map +1 -0
  127. package/dist/actions/scheduled-job/types.js +3 -0
  128. package/dist/actions/scheduled-job/types.js.map +1 -0
  129. package/dist/actions/scheduled-job/update.action.d.ts +5 -0
  130. package/dist/actions/scheduled-job/update.action.d.ts.map +1 -0
  131. package/dist/actions/scheduled-job/update.action.js +64 -0
  132. package/dist/actions/scheduled-job/update.action.js.map +1 -0
  133. package/dist/actions/scheduled-job.action.d.ts +73 -0
  134. package/dist/actions/scheduled-job.action.d.ts.map +1 -0
  135. package/dist/actions/scheduled-job.action.js +355 -0
  136. package/dist/actions/scheduled-job.action.js.map +1 -0
  137. package/dist/actions/setup.action.js +1 -1
  138. package/dist/actions/setup.action.js.map +1 -1
  139. package/dist/actions/sync/index.d.ts +4 -0
  140. package/dist/actions/sync/index.d.ts.map +1 -0
  141. package/dist/actions/sync/index.js +23 -0
  142. package/dist/actions/sync/index.js.map +1 -0
  143. package/dist/actions/sync/run-flow.action.d.ts +8 -0
  144. package/dist/actions/sync/run-flow.action.d.ts.map +1 -0
  145. package/dist/actions/sync/run-flow.action.js +81 -0
  146. package/dist/actions/sync/run-flow.action.js.map +1 -0
  147. package/dist/actions/sync/run-job.action.d.ts +11 -0
  148. package/dist/actions/sync/run-job.action.d.ts.map +1 -0
  149. package/dist/actions/sync/run-job.action.js +75 -0
  150. package/dist/actions/sync/run-job.action.js.map +1 -0
  151. package/dist/actions/sync/types.d.ts +41 -0
  152. package/dist/actions/sync/types.d.ts.map +1 -0
  153. package/dist/actions/sync/types.js +3 -0
  154. package/dist/actions/sync/types.js.map +1 -0
  155. package/dist/actions/sync.action.d.ts +8 -47
  156. package/dist/actions/sync.action.d.ts.map +1 -1
  157. package/dist/actions/sync.action.js +30 -150
  158. package/dist/actions/sync.action.js.map +1 -1
  159. package/dist/actions/utils/action-names.d.ts +23 -4
  160. package/dist/actions/utils/action-names.d.ts.map +1 -1
  161. package/dist/actions/utils/action-names.js +23 -4
  162. package/dist/actions/utils/action-names.js.map +1 -1
  163. package/dist/actions/utils/define-action.d.ts +36 -0
  164. package/dist/actions/utils/define-action.d.ts.map +1 -0
  165. package/dist/actions/utils/define-action.js +43 -0
  166. package/dist/actions/utils/define-action.js.map +1 -0
  167. package/dist/actions/utils/errors.d.ts +54 -8
  168. package/dist/actions/utils/errors.d.ts.map +1 -1
  169. package/dist/actions/utils/errors.js +104 -14
  170. package/dist/actions/utils/errors.js.map +1 -1
  171. package/dist/actions/utils/helpers.d.ts.map +1 -1
  172. package/dist/actions/utils/helpers.js +2 -1
  173. package/dist/actions/utils/helpers.js.map +1 -1
  174. package/dist/actions/utils/metrics.d.ts +12 -0
  175. package/dist/actions/utils/metrics.d.ts.map +1 -0
  176. package/dist/actions/utils/metrics.js +12 -0
  177. package/dist/actions/utils/metrics.js.map +1 -0
  178. package/dist/actions/utils/middleware.d.ts +39 -0
  179. package/dist/actions/utils/middleware.d.ts.map +1 -0
  180. package/dist/actions/utils/middleware.js +85 -0
  181. package/dist/actions/utils/middleware.js.map +1 -0
  182. package/dist/actions/utils/types.d.ts +18 -6
  183. package/dist/actions/utils/types.d.ts.map +1 -1
  184. package/dist/adapters/base-adapter-handler.d.ts +10 -0
  185. package/dist/adapters/base-adapter-handler.d.ts.map +1 -1
  186. package/dist/adapters/base-adapter-handler.js +30 -33
  187. package/dist/adapters/base-adapter-handler.js.map +1 -1
  188. package/dist/browser.d.ts +2 -0
  189. package/dist/browser.d.ts.map +1 -1
  190. package/dist/browser.js +3 -1
  191. package/dist/browser.js.map +1 -1
  192. package/dist/clients/integration-config.client.d.ts +21 -0
  193. package/dist/clients/integration-config.client.d.ts.map +1 -0
  194. package/dist/clients/integration-config.client.js +44 -0
  195. package/dist/clients/integration-config.client.js.map +1 -0
  196. package/dist/context.d.ts +18 -3
  197. package/dist/context.d.ts.map +1 -1
  198. package/dist/context.js +21 -5
  199. package/dist/context.js.map +1 -1
  200. package/dist/index.d.ts +11 -0
  201. package/dist/index.d.ts.map +1 -1
  202. package/dist/index.js +30 -1
  203. package/dist/index.js.map +1 -1
  204. package/dist/interfaces/data-flow-spec.interface.d.ts +14 -21
  205. package/dist/interfaces/data-flow-spec.interface.d.ts.map +1 -1
  206. package/dist/interfaces/data-flow-spec.interface.js +10 -26
  207. package/dist/interfaces/data-flow-spec.interface.js.map +1 -1
  208. package/dist/interfaces/integration-capabilities.interface.d.ts +2 -2
  209. package/dist/interfaces/scheduled-job.interface.d.ts +40 -0
  210. package/dist/interfaces/scheduled-job.interface.d.ts.map +1 -0
  211. package/dist/interfaces/scheduled-job.interface.js +38 -0
  212. package/dist/interfaces/scheduled-job.interface.js.map +1 -0
  213. package/dist/services/dataflow.service.d.ts +13 -6
  214. package/dist/services/dataflow.service.d.ts.map +1 -1
  215. package/dist/services/dataflow.service.js +34 -57
  216. package/dist/services/dataflow.service.js.map +1 -1
  217. package/dist/services/sync-runner.d.ts +7 -0
  218. package/dist/services/sync-runner.d.ts.map +1 -1
  219. package/dist/services/sync-runner.js +38 -45
  220. package/dist/services/sync-runner.js.map +1 -1
  221. package/dist/types.d.ts +2 -0
  222. package/dist/types.d.ts.map +1 -1
  223. package/dist/types.js +4 -1
  224. package/dist/types.js.map +1 -1
  225. package/dist/utils/artifact-builder.d.ts +41 -16
  226. package/dist/utils/artifact-builder.d.ts.map +1 -1
  227. package/dist/utils/artifact-builder.js +93 -18
  228. package/dist/utils/artifact-builder.js.map +1 -1
  229. package/package.json +1 -1
@@ -1,18 +1,64 @@
1
1
  /**
2
- * Throw from `parseInput` when validation fails. Becomes a 400 in the envelope.
2
+ * Coarse-grained error category. Drives HTTP status mapping at the dispatcher
3
+ * and the `retryable` signal echoed in the failure envelope so callers (PSS,
4
+ * IS, UI) know whether to back off and retry.
3
5
  */
4
- export declare class InvalidInputError extends Error {
5
- readonly details?: unknown | undefined;
6
- readonly code = "INVALID_INPUT";
7
- constructor(message: string, details?: unknown | undefined);
6
+ export type ErrorCategory = 'invalid_input' | 'forbidden' | 'not_found' | 'conflict' | 'precondition_failed' | 'upstream_transient' | 'upstream_permanent' | 'not_implemented' | 'internal';
7
+ /** Default HTTP status per category. */
8
+ export declare function categoryToStatus(c: ErrorCategory): number;
9
+ /** Default retryability per category. Only transient upstream failures retry. */
10
+ export declare function categoryRetryable(c: ErrorCategory): boolean;
11
+ interface ActionErrorOpts {
12
+ category?: ErrorCategory;
13
+ retryable?: boolean;
14
+ cause?: unknown;
8
15
  }
9
16
  /**
10
- * Throw from a handler to produce a structured failure envelope.
11
- * Use for known business errors (FLOW_NOT_FOUND, DIRECTION_IS_IMMUTABLE, etc.).
17
+ * Base class for all structured action failures. Throw a typed subclass
18
+ * (`InvalidInputError`, `ForbiddenError`, `NotFoundError`, …) — they pre-set
19
+ * `category` so HTTP status and retry signaling are automatic.
12
20
  */
13
21
  export declare class ActionError extends Error {
14
22
  readonly code: string;
15
23
  readonly details?: unknown | undefined;
16
- constructor(code: string, message: string, details?: unknown | undefined);
24
+ /** Coarse category — drives HTTP status and `retryable`. */
25
+ readonly category: ErrorCategory;
26
+ /** Whether a retry could succeed. Defaults from `category`. */
27
+ readonly retryable: boolean;
28
+ constructor(code: string, message: string, details?: unknown | undefined, opts?: ActionErrorOpts);
29
+ }
30
+ /** Throw from `parseInput` (or a handler) when the input is malformed. */
31
+ export declare class InvalidInputError extends ActionError {
32
+ constructor(message: string, details?: unknown);
33
+ }
34
+ export declare class ForbiddenError extends ActionError {
35
+ constructor(message: string, details?: unknown);
36
+ }
37
+ export declare class NotFoundError extends ActionError {
38
+ constructor(code: string, message: string, details?: unknown);
39
+ }
40
+ export declare class ConflictError extends ActionError {
41
+ constructor(code: string, message: string, details?: unknown);
42
+ }
43
+ export declare class PreconditionFailedError extends ActionError {
44
+ constructor(code: string, message: string, details?: unknown);
45
+ }
46
+ /** Vendor/IS responded with a transient failure (5xx, network, timeout). Safe to retry. */
47
+ export declare class UpstreamTransientError extends ActionError {
48
+ constructor(message: string, opts?: {
49
+ cause?: unknown;
50
+ details?: unknown;
51
+ });
52
+ }
53
+ /** Vendor/IS rejected the request permanently (4xx semantics). Don't retry. */
54
+ export declare class UpstreamPermanentError extends ActionError {
55
+ constructor(message: string, opts?: {
56
+ cause?: unknown;
57
+ details?: unknown;
58
+ });
59
+ }
60
+ export declare class NotImplementedError extends ActionError {
61
+ constructor(message: string, details?: unknown);
17
62
  }
63
+ export {};
18
64
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;aAIxB,OAAO,CAAC,EAAE,OAAO;IAHnC,QAAQ,CAAC,IAAI,mBAAmB;gBAE9B,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,OAAO,YAAA;CAKpC;AAED;;;GAGG;AACH,qBAAa,WAAY,SAAQ,KAAK;aAElB,IAAI,EAAE,MAAM;aAEZ,OAAO,CAAC,EAAE,OAAO;gBAFjB,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,OAAO,YAAA;CAKpC"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACrB,eAAe,GACf,WAAW,GACX,WAAW,GACX,UAAU,GACV,qBAAqB,GACrB,oBAAoB,GACpB,oBAAoB,GACpB,iBAAiB,GACjB,UAAU,CAAC;AAEf,wCAAwC;AACxC,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAqBzD;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,aAAa,GAAG,OAAO,CAE3D;AAED,UAAU,eAAe;IACvB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,qBAAa,WAAY,SAAQ,KAAK;aAOlB,IAAI,EAAE,MAAM;aAEZ,OAAO,CAAC,EAAE,OAAO;IARnC,4DAA4D;IAC5D,SAAgB,QAAQ,EAAE,aAAa,CAAC;IACxC,+DAA+D;IAC/D,SAAgB,SAAS,EAAE,OAAO,CAAC;gBAGjB,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,OAAO,YAAA,EACjC,IAAI,GAAE,eAAoB;CAW7B;AAED,0EAA0E;AAC1E,qBAAa,iBAAkB,SAAQ,WAAW;gBACpC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI/C;AAED,qBAAa,cAAe,SAAQ,WAAW;gBACjC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI/C;AAED,qBAAa,aAAc,SAAQ,WAAW;gBAChC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI7D;AAED,qBAAa,aAAc,SAAQ,WAAW;gBAChC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI7D;AAED,qBAAa,uBAAwB,SAAQ,WAAW;gBAC1C,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI7D;AAED,2FAA2F;AAC3F,qBAAa,sBAAuB,SAAQ,WAAW;gBACzC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO;CAO/E;AAED,+EAA+E;AAC/E,qBAAa,sBAAuB,SAAQ,WAAW;gBACzC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO;CAO/E;AAED,qBAAa,mBAAoB,SAAQ,WAAW;gBACtC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAI/C"}
@@ -1,29 +1,119 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ActionError = exports.InvalidInputError = void 0;
4
- /**
5
- * Throw from `parseInput` when validation fails. Becomes a 400 in the envelope.
6
- */
7
- class InvalidInputError extends Error {
8
- constructor(message, details) {
9
- super(message);
10
- this.details = details;
11
- this.code = 'INVALID_INPUT';
12
- this.name = 'InvalidInputError';
3
+ exports.NotImplementedError = exports.UpstreamPermanentError = exports.UpstreamTransientError = exports.PreconditionFailedError = exports.ConflictError = exports.NotFoundError = exports.ForbiddenError = exports.InvalidInputError = exports.ActionError = void 0;
4
+ exports.categoryToStatus = categoryToStatus;
5
+ exports.categoryRetryable = categoryRetryable;
6
+ /** Default HTTP status per category. */
7
+ function categoryToStatus(c) {
8
+ switch (c) {
9
+ case 'invalid_input':
10
+ return 422;
11
+ case 'forbidden':
12
+ return 403;
13
+ case 'not_found':
14
+ return 404;
15
+ case 'conflict':
16
+ return 409;
17
+ case 'precondition_failed':
18
+ return 412;
19
+ case 'upstream_transient':
20
+ return 503;
21
+ case 'upstream_permanent':
22
+ return 502;
23
+ case 'not_implemented':
24
+ return 501;
25
+ case 'internal':
26
+ return 500;
13
27
  }
14
28
  }
15
- exports.InvalidInputError = InvalidInputError;
29
+ /** Default retryability per category. Only transient upstream failures retry. */
30
+ function categoryRetryable(c) {
31
+ return c === 'upstream_transient';
32
+ }
16
33
  /**
17
- * Throw from a handler to produce a structured failure envelope.
18
- * Use for known business errors (FLOW_NOT_FOUND, DIRECTION_IS_IMMUTABLE, etc.).
34
+ * Base class for all structured action failures. Throw a typed subclass
35
+ * (`InvalidInputError`, `ForbiddenError`, `NotFoundError`, …) — they pre-set
36
+ * `category` so HTTP status and retry signaling are automatic.
19
37
  */
20
38
  class ActionError extends Error {
21
- constructor(code, message, details) {
39
+ constructor(code, message, details, opts = {}) {
40
+ var _a, _b;
22
41
  super(message);
23
42
  this.code = code;
24
43
  this.details = details;
25
44
  this.name = 'ActionError';
45
+ this.category = (_a = opts.category) !== null && _a !== void 0 ? _a : 'internal';
46
+ this.retryable = (_b = opts.retryable) !== null && _b !== void 0 ? _b : categoryRetryable(this.category);
47
+ if (opts.cause !== undefined) {
48
+ // Use ES2022 Error.cause — preserves the underlying stack across rewraps.
49
+ this.cause = opts.cause;
50
+ }
26
51
  }
27
52
  }
28
53
  exports.ActionError = ActionError;
54
+ /** Throw from `parseInput` (or a handler) when the input is malformed. */
55
+ class InvalidInputError extends ActionError {
56
+ constructor(message, details) {
57
+ super('INVALID_INPUT', message, details, { category: 'invalid_input' });
58
+ this.name = 'InvalidInputError';
59
+ }
60
+ }
61
+ exports.InvalidInputError = InvalidInputError;
62
+ class ForbiddenError extends ActionError {
63
+ constructor(message, details) {
64
+ super('FORBIDDEN', message, details, { category: 'forbidden' });
65
+ this.name = 'ForbiddenError';
66
+ }
67
+ }
68
+ exports.ForbiddenError = ForbiddenError;
69
+ class NotFoundError extends ActionError {
70
+ constructor(code, message, details) {
71
+ super(code, message, details, { category: 'not_found' });
72
+ this.name = 'NotFoundError';
73
+ }
74
+ }
75
+ exports.NotFoundError = NotFoundError;
76
+ class ConflictError extends ActionError {
77
+ constructor(code, message, details) {
78
+ super(code, message, details, { category: 'conflict' });
79
+ this.name = 'ConflictError';
80
+ }
81
+ }
82
+ exports.ConflictError = ConflictError;
83
+ class PreconditionFailedError extends ActionError {
84
+ constructor(code, message, details) {
85
+ super(code, message, details, { category: 'precondition_failed' });
86
+ this.name = 'PreconditionFailedError';
87
+ }
88
+ }
89
+ exports.PreconditionFailedError = PreconditionFailedError;
90
+ /** Vendor/IS responded with a transient failure (5xx, network, timeout). Safe to retry. */
91
+ class UpstreamTransientError extends ActionError {
92
+ constructor(message, opts = {}) {
93
+ super('UPSTREAM_TRANSIENT', message, opts.details, {
94
+ category: 'upstream_transient',
95
+ cause: opts.cause,
96
+ });
97
+ this.name = 'UpstreamTransientError';
98
+ }
99
+ }
100
+ exports.UpstreamTransientError = UpstreamTransientError;
101
+ /** Vendor/IS rejected the request permanently (4xx semantics). Don't retry. */
102
+ class UpstreamPermanentError extends ActionError {
103
+ constructor(message, opts = {}) {
104
+ super('UPSTREAM_PERMANENT', message, opts.details, {
105
+ category: 'upstream_permanent',
106
+ cause: opts.cause,
107
+ });
108
+ this.name = 'UpstreamPermanentError';
109
+ }
110
+ }
111
+ exports.UpstreamPermanentError = UpstreamPermanentError;
112
+ class NotImplementedError extends ActionError {
113
+ constructor(message, details) {
114
+ super('NOT_IMPLEMENTED', message, details, { category: 'not_implemented' });
115
+ this.name = 'NotImplementedError';
116
+ }
117
+ }
118
+ exports.NotImplementedError = NotImplementedError;
29
119
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/actions/utils/errors.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,iBAAkB,SAAQ,KAAK;IAE1C,YACE,OAAe,EACC,OAAiB;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,YAAO,GAAP,OAAO,CAAU;QAH1B,SAAI,GAAG,eAAe,CAAC;QAM9B,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AATD,8CASC;AAED;;;GAGG;AACH,MAAa,WAAY,SAAQ,KAAK;IACpC,YACkB,IAAY,EAC5B,OAAe,EACC,OAAiB;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAQ;QAEZ,YAAO,GAAP,OAAO,CAAU;QAGjC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AATD,kCASC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/actions/utils/errors.ts"],"names":[],"mappings":";;;AAiBA,4CAqBC;AAGD,8CAEC;AA3BD,wCAAwC;AACxC,SAAgB,gBAAgB,CAAC,CAAgB;IAC/C,QAAQ,CAAC,EAAE,CAAC;QACV,KAAK,eAAe;YAClB,OAAO,GAAG,CAAC;QACb,KAAK,WAAW;YACd,OAAO,GAAG,CAAC;QACb,KAAK,WAAW;YACd,OAAO,GAAG,CAAC;QACb,KAAK,UAAU;YACb,OAAO,GAAG,CAAC;QACb,KAAK,qBAAqB;YACxB,OAAO,GAAG,CAAC;QACb,KAAK,oBAAoB;YACvB,OAAO,GAAG,CAAC;QACb,KAAK,oBAAoB;YACvB,OAAO,GAAG,CAAC;QACb,KAAK,iBAAiB;YACpB,OAAO,GAAG,CAAC;QACb,KAAK,UAAU;YACb,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,SAAgB,iBAAiB,CAAC,CAAgB;IAChD,OAAO,CAAC,KAAK,oBAAoB,CAAC;AACpC,CAAC;AAQD;;;;GAIG;AACH,MAAa,WAAY,SAAQ,KAAK;IAMpC,YACkB,IAAY,EAC5B,OAAe,EACC,OAAiB,EACjC,OAAwB,EAAE;;QAE1B,KAAK,CAAC,OAAO,CAAC,CAAC;QALC,SAAI,GAAJ,IAAI,CAAQ;QAEZ,YAAO,GAAP,OAAO,CAAU;QAIjC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,MAAA,IAAI,CAAC,QAAQ,mCAAI,UAAU,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,MAAA,IAAI,CAAC,SAAS,mCAAI,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpE,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7B,0EAA0E;YACzE,IAA4B,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACnD,CAAC;IACH,CAAC;CACF;AArBD,kCAqBC;AAED,0EAA0E;AAC1E,MAAa,iBAAkB,SAAQ,WAAW;IAChD,YAAY,OAAe,EAAE,OAAiB;QAC5C,KAAK,CAAC,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AALD,8CAKC;AAED,MAAa,cAAe,SAAQ,WAAW;IAC7C,YAAY,OAAe,EAAE,OAAiB;QAC5C,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AALD,wCAKC;AAED,MAAa,aAAc,SAAQ,WAAW;IAC5C,YAAY,IAAY,EAAE,OAAe,EAAE,OAAiB;QAC1D,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AALD,sCAKC;AAED,MAAa,aAAc,SAAQ,WAAW;IAC5C,YAAY,IAAY,EAAE,OAAe,EAAE,OAAiB;QAC1D,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AALD,sCAKC;AAED,MAAa,uBAAwB,SAAQ,WAAW;IACtD,YAAY,IAAY,EAAE,OAAe,EAAE,OAAiB;QAC1D,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,qBAAqB,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AALD,0DAKC;AAED,2FAA2F;AAC3F,MAAa,sBAAuB,SAAQ,WAAW;IACrD,YAAY,OAAe,EAAE,OAA+C,EAAE;QAC5E,KAAK,CAAC,oBAAoB,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;YACjD,QAAQ,EAAE,oBAAoB;YAC9B,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AARD,wDAQC;AAED,+EAA+E;AAC/E,MAAa,sBAAuB,SAAQ,WAAW;IACrD,YAAY,OAAe,EAAE,OAA+C,EAAE;QAC5E,KAAK,CAAC,oBAAoB,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;YACjD,QAAQ,EAAE,oBAAoB;YAC9B,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AARD,wDAQC;AAED,MAAa,mBAAoB,SAAQ,WAAW;IAClD,YAAY,OAAe,EAAE,OAAiB;QAC5C,KAAK,CAAC,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AALD,kDAKC"}
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAElE,OAAO,EAAE,cAAc,EAAkB,MAAM,iBAAiB,CAAC;AAEjE;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAKtC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAEtE"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAElE,OAAO,EAAE,cAAc,EAAkB,MAAM,iBAAiB,CAAC;AAGjE;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAKtC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAEtE"}
@@ -4,6 +4,7 @@ exports.resolveSystem = resolveSystem;
4
4
  exports.resolveLookupStrategy = resolveLookupStrategy;
5
5
  const skedulo_adapter_1 = require("../../adapters/skedulo.adapter");
6
6
  const constants_1 = require("../../constants");
7
+ const errors_1 = require("./errors");
7
8
  /**
8
9
  * Resolve the adapter for the system named in an action's input. Falls back
9
10
  * to the action's own integrationType when `system` is omitted.
@@ -17,7 +18,7 @@ function resolveSystem(adapter, inputSystem) {
17
18
  return { system, adapter: skedulo_adapter_1.skeduloAdapter };
18
19
  if (system === adapter.integrationType)
19
20
  return { system, adapter };
20
- throw new Error(`Unknown system: ${system}`);
21
+ throw new errors_1.InvalidInputError(`Unknown system: ${system}`);
21
22
  }
22
23
  /**
23
24
  * Resolve the configured lookup strategy on an adapter, defaulting to ExternalId.
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/actions/utils/helpers.ts"],"names":[],"mappings":";;AAWA,sCAQC;AAKD,sDAEC;AAzBD,oEAAgE;AAChE,+CAAiE;AAEjE;;;;;;GAMG;AACH,SAAgB,aAAa,CAC3B,OAAgB,EAChB,WAA+B;IAE/B,MAAM,MAAM,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,OAAO,CAAC,eAAe,CAAC;IACtD,IAAI,MAAM,KAAK,0BAAc;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,gCAAc,EAAE,CAAC;IAC1E,IAAI,MAAM,KAAK,OAAO,CAAC,eAAe;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACnE,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,OAAgB;;IACpD,OAAO,MAAA,MAAA,OAAO,CAAC,YAAY,0CAAE,cAAc,mCAAI,0BAAc,CAAC,UAAU,CAAC;AAC3E,CAAC"}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/actions/utils/helpers.ts"],"names":[],"mappings":";;AAYA,sCAQC;AAKD,sDAEC;AA1BD,oEAAgE;AAChE,+CAAiE;AACjE,qCAA6C;AAE7C;;;;;;GAMG;AACH,SAAgB,aAAa,CAC3B,OAAgB,EAChB,WAA+B;IAE/B,MAAM,MAAM,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,OAAO,CAAC,eAAe,CAAC;IACtD,IAAI,MAAM,KAAK,0BAAc;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,gCAAc,EAAE,CAAC;IAC1E,IAAI,MAAM,KAAK,OAAO,CAAC,eAAe;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACnE,MAAM,IAAI,0BAAiB,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,OAAgB;;IACpD,OAAO,MAAA,MAAA,OAAO,CAAC,YAAY,0CAAE,cAAc,mCAAI,0BAAc,CAAC,UAAU,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Minimal metrics surface so actions can emit counters/histograms without
3
+ * coupling to a specific backend (StatsD, OTel, Datadog). Tenant functions
4
+ * inject a real impl via `BaseAdapterHandlerConfig.metrics`; the SDK defaults
5
+ * to a no-op.
6
+ */
7
+ export interface Metrics {
8
+ counter(name: string, value: number, tags?: Record<string, string>): void;
9
+ histogram(name: string, value: number, tags?: Record<string, string>): void;
10
+ }
11
+ export declare const noopMetrics: Metrics;
12
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/metrics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC1E,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CAC7E;AAED,eAAO,MAAM,WAAW,EAAE,OAOzB,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.noopMetrics = void 0;
4
+ exports.noopMetrics = {
5
+ counter() {
6
+ /* no-op */
7
+ },
8
+ histogram() {
9
+ /* no-op */
10
+ },
11
+ };
12
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/actions/utils/metrics.ts"],"names":[],"mappings":";;;AAWa,QAAA,WAAW,GAAY;IAClC,OAAO;QACL,WAAW;IACb,CAAC;IACD,SAAS;QACP,WAAW;IACb,CAAC;CACF,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { IntegrationContext } from '../../context';
2
+ /** The (input, ctx) → result function that middleware wraps. */
3
+ export type ActionHandler<I, O> = (input: I, ctx: IntegrationContext) => Promise<O>;
4
+ /** Metadata available to every middleware. Set once at definition time. */
5
+ export interface MiddlewareMeta {
6
+ actionName: string;
7
+ /** Safe to retry without side effects. */
8
+ idempotent: boolean;
9
+ /** Emit an audit log line on success. */
10
+ audit: boolean;
11
+ }
12
+ /**
13
+ * A middleware wraps `next` and returns a new handler. Order is outer-to-inner:
14
+ * `compose([A, B], handler)` runs A → B → handler.
15
+ */
16
+ export type Middleware = <I, O>(next: ActionHandler<I, O>, meta: MiddlewareMeta) => ActionHandler<I, O>;
17
+ export declare function compose<I, O>(middlewares: ReadonlyArray<Middleware>, handler: ActionHandler<I, O>, meta: MiddlewareMeta): ActionHandler<I, O>;
18
+ /**
19
+ * Log structured start/end lines for every action. Failure lines include the
20
+ * error code and message; the requestId threads through to downstream services.
21
+ */
22
+ export declare const withLogging: Middleware;
23
+ /**
24
+ * Emit a counter per (action, status[, code]) and a duration histogram. Tags
25
+ * stay low-cardinality — `code` is bounded by the error taxonomy.
26
+ */
27
+ export declare const withMetrics: Middleware;
28
+ /**
29
+ * Emit a single audit line on success when `meta.audit` is true. Mutating
30
+ * actions opt in via `defineAction({ audit: true })`. Failures are not audited
31
+ * (a rejected mutation didn't happen) — they show up in the standard logs.
32
+ */
33
+ export declare const withAudit: Middleware;
34
+ /**
35
+ * Gate the handler on admin privileges. Failure raises `ForbiddenError` so the
36
+ * dispatcher returns 403 and the error envelope is consistent across actions.
37
+ */
38
+ export declare const requireAdmin: Middleware;
39
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAIxD,gEAAgE;AAChE,MAAM,MAAM,aAAa,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAEpF,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,UAAU,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC,EAC5B,IAAI,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EACzB,IAAI,EAAE,cAAc,KACjB,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEzB,wBAAgB,OAAO,CAAC,CAAC,EAAE,CAAC,EAC1B,WAAW,EAAE,aAAa,CAAC,UAAU,CAAC,EACtC,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAC5B,IAAI,EAAE,cAAc,GACnB,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAErB;AAID;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,UAsBzB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,UAezB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,UAUvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,UAK1B,CAAC"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requireAdmin = exports.withAudit = exports.withMetrics = exports.withLogging = void 0;
4
+ exports.compose = compose;
5
+ const helpers_1 = require("../../utils/helpers");
6
+ const errors_1 = require("./errors");
7
+ function compose(middlewares, handler, meta) {
8
+ return middlewares.reduceRight((next, mw) => mw(next, meta), handler);
9
+ }
10
+ // ── stock middlewares ────────────────────────────────────────────────────────
11
+ /**
12
+ * Log structured start/end lines for every action. Failure lines include the
13
+ * error code and message; the requestId threads through to downstream services.
14
+ */
15
+ const withLogging = (next, meta) => async (input, ctx) => {
16
+ var _a, _b;
17
+ const startedAt = Date.now();
18
+ ctx.logger.info(`[action.start] name=${meta.actionName} requestId=${ctx.requestId} ` +
19
+ `idempotent=${meta.idempotent}`);
20
+ try {
21
+ const result = await next(input, ctx);
22
+ ctx.logger.info(`[action.end] name=${meta.actionName} requestId=${ctx.requestId} ` +
23
+ `status=ok duration_ms=${Date.now() - startedAt}`);
24
+ return result;
25
+ }
26
+ catch (err) {
27
+ const e = err;
28
+ ctx.logger.warn(`[action.end] name=${meta.actionName} requestId=${ctx.requestId} ` +
29
+ `status=error duration_ms=${Date.now() - startedAt} ` +
30
+ `code=${(_a = e.code) !== null && _a !== void 0 ? _a : 'INTERNAL'} message=${(_b = e.message) !== null && _b !== void 0 ? _b : String(err)}`);
31
+ throw err;
32
+ }
33
+ };
34
+ exports.withLogging = withLogging;
35
+ /**
36
+ * Emit a counter per (action, status[, code]) and a duration histogram. Tags
37
+ * stay low-cardinality — `code` is bounded by the error taxonomy.
38
+ */
39
+ const withMetrics = (next, meta) => async (input, ctx) => {
40
+ var _a;
41
+ const startedAt = Date.now();
42
+ try {
43
+ const result = await next(input, ctx);
44
+ const dur = Date.now() - startedAt;
45
+ ctx.metrics.counter('action.calls', 1, { name: meta.actionName, status: 'ok' });
46
+ ctx.metrics.histogram('action.duration_ms', dur, { name: meta.actionName, status: 'ok' });
47
+ return result;
48
+ }
49
+ catch (err) {
50
+ const dur = Date.now() - startedAt;
51
+ const code = (_a = err.code) !== null && _a !== void 0 ? _a : 'INTERNAL';
52
+ ctx.metrics.counter('action.calls', 1, { name: meta.actionName, status: 'error', code });
53
+ ctx.metrics.histogram('action.duration_ms', dur, { name: meta.actionName, status: 'error' });
54
+ throw err;
55
+ }
56
+ };
57
+ exports.withMetrics = withMetrics;
58
+ /**
59
+ * Emit a single audit line on success when `meta.audit` is true. Mutating
60
+ * actions opt in via `defineAction({ audit: true })`. Failures are not audited
61
+ * (a rejected mutation didn't happen) — they show up in the standard logs.
62
+ */
63
+ const withAudit = (next, meta) => async (input, ctx) => {
64
+ var _a, _b, _c;
65
+ if (!meta.audit)
66
+ return next(input, ctx);
67
+ const result = await next(input, ctx);
68
+ const tenantId = (_c = (_b = (_a = ctx.skedContext) === null || _a === void 0 ? void 0 : _a.tenant) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : 'unknown';
69
+ ctx.logger.info(`[audit] action=${meta.actionName} tenant=${tenantId} ` +
70
+ `requestId=${ctx.requestId} integration=${ctx.integrationType}`);
71
+ return result;
72
+ };
73
+ exports.withAudit = withAudit;
74
+ /**
75
+ * Gate the handler on admin privileges. Failure raises `ForbiddenError` so the
76
+ * dispatcher returns 403 and the error envelope is consistent across actions.
77
+ */
78
+ const requireAdmin = (next, meta) => async (input, ctx) => {
79
+ if (!(0, helpers_1.isAdminRequest)(ctx.skedContext)) {
80
+ throw new errors_1.ForbiddenError(`${meta.actionName} requires admin privileges`);
81
+ }
82
+ return next(input, ctx);
83
+ };
84
+ exports.requireAdmin = requireAdmin;
85
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/actions/utils/middleware.ts"],"names":[],"mappings":"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"}
@@ -17,9 +17,23 @@ export interface ActionFailure {
17
17
  code: string;
18
18
  message: string;
19
19
  details?: unknown;
20
+ /** Whether the caller may retry. Set when the thrown error carries a category. */
21
+ retryable?: boolean;
20
22
  };
21
23
  }
22
24
  export type ActionResult<T> = ActionSuccess<T> | ActionFailure;
25
+ /**
26
+ * Out-of-band values the dispatcher lifts off request headers and hands to
27
+ * `parseInput` alongside the raw body, so per-flow actions can read them
28
+ * without the body having to carry them (ES scheduled webhooks post an empty
29
+ * body, and triggered actions post a bare array).
30
+ */
31
+ export interface ParseMeta {
32
+ /** From the `sked-data-flow-id` header. */
33
+ dataFlowId?: number;
34
+ /** From the `sked-scheduled-job-name` header (a job's `webhook_name`). */
35
+ scheduledJobName?: string;
36
+ }
23
37
  /**
24
38
  * One registered action. The registry holds a map of name → Action.
25
39
  * `parseInput` validates the raw HTTP body and returns the typed input,
@@ -31,18 +45,16 @@ export interface Action<TInput, TOutput> {
31
45
  /**
32
46
  * Validate the raw incoming body. Throw InvalidInputError for malformed
33
47
  * input; return the typed input on success. Returning a value here is
34
- * how the dispatcher knows to invoke the handler.
48
+ * how the dispatcher knows to invoke the handler. `meta` carries values the
49
+ * dispatcher lifted off request headers (e.g. `dataFlowId`).
35
50
  */
36
- parseInput: (raw: unknown) => TInput;
51
+ parseInput: (raw: unknown, meta?: ParseMeta) => TInput;
37
52
  /**
38
53
  * Run the action. Returns the result (will be wrapped in ActionSuccess
39
54
  * by the dispatcher). Throw an `ActionError` to produce a failure envelope.
40
55
  */
41
56
  handler: (input: TInput, ctx: IntegrationContext) => Promise<TOutput>;
42
57
  }
43
- /**
44
- * The registry is keyed by action name. Action types are erased here —
45
- * the typed dispatch client (Task 10) re-introduces type-level inference.
46
- */
58
+ /** Registry keyed by action name; action input/output types are erased here. */
47
59
  export type ActionRegistry = Map<string, Action<any, any>>;
48
60
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,CAAC,CAAC;CACX;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;AAE/D;;;;GAIG;AACH,MAAM,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO;IACrC,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,UAAU,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;IACrC;;;OAGG;IACH,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,kBAAkB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACvE;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,CAAC,CAAC;CACX;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,kFAAkF;QAClF,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;CACH;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO;IACrC,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,UAAU,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,KAAK,MAAM,CAAC;IACvD;;;OAGG;IACH,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,kBAAkB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACvE;AAED,gFAAgF;AAChF,MAAM,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC"}
@@ -1,6 +1,10 @@
1
+ import { type ErrorCategory } from '../actions/utils/errors';
2
+ import type { Metrics } from '../actions/utils/metrics';
1
3
  import type { ActionRegistry } from '../actions/utils/types';
2
4
  import type { Adapter } from '../interfaces/adapter.interface';
3
5
  import { AdapterRegistry } from './adapter-registry';
6
+ /** Header carrying the upstream request id, threaded into ctx.requestId. */
7
+ export declare const REQUEST_ID_HEADER = "sked-request-id";
4
8
  export type RouteHandler = (body: any, headers: any, method: string, path: string, skedContext: any, querystring?: string | Record<string, string> | null) => Promise<{
5
9
  status: number;
6
10
  body?: unknown;
@@ -20,6 +24,11 @@ export interface BaseAdapterHandlerConfig {
20
24
  * the wire layer (header parsing, error mapping) with synthetic actions.
21
25
  */
22
26
  actionRegistry?: ActionRegistry;
27
+ /**
28
+ * Optional metrics sink, threaded onto every `IntegrationContext` so action
29
+ * middleware can emit counters/histograms. Defaults to a no-op.
30
+ */
31
+ metrics?: Metrics;
23
32
  }
24
33
  /**
25
34
  * Single-entry handler that dispatches every integration action through the
@@ -39,4 +48,5 @@ export declare class BaseAdapterHandler {
39
48
  */
40
49
  dispatch: RouteHandler;
41
50
  }
51
+ export type { ErrorCategory };
42
52
  //# sourceMappingURL=base-adapter-handler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-adapter-handler.d.ts","sourceRoot":"","sources":["../../src/adapters/base-adapter-handler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAA+B,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE1F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAKrD,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,GAAG,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,GAAG,EAChB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,KACjD,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAEjD,MAAM,WAAW,wBAAwB;IACvC,+EAA+E;IAC/E,OAAO,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B;;;;OAIG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED;;;;GAIG;AACH,qBAAa,kBAAkB;IAKjB,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,wBAAwB;IAJ/D,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAC3C,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IAC7C,SAAgB,cAAc,EAAE,cAAc,CAAC;gBAEhB,MAAM,EAAE,wBAAwB;IAU/D;;;;OAIG;IACH,QAAQ,EAAE,YAAY,CAmCpB;CACH"}
1
+ {"version":3,"file":"base-adapter-handler.d.ts","sourceRoot":"","sources":["../../src/adapters/base-adapter-handler.ts"],"names":[],"mappings":"AAOA,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAA+B,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE1F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,oBAAoB,CAAC;AAInD,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,GAAG,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,GAAG,EAChB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,KACjD,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAEjD,MAAM,WAAW,wBAAwB;IACvC,+EAA+E;IAC/E,OAAO,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B;;;;OAIG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,qBAAa,kBAAkB;IAKjB,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,wBAAwB;IAJ/D,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAC3C,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IAC7C,SAAgB,cAAc,EAAE,cAAc,CAAC;gBAEhB,MAAM,EAAE,wBAAwB;IAU/D;;;;OAIG;IACH,QAAQ,EAAE,YAAY,CAkDpB;CACH;AA8CD,YAAY,EAAE,aAAa,EAAE,CAAC"}
@@ -1,12 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BaseAdapterHandler = void 0;
3
+ exports.BaseAdapterHandler = exports.REQUEST_ID_HEADER = void 0;
4
+ const crypto_1 = require("crypto");
4
5
  const context_1 = require("../context");
5
6
  const action_names_1 = require("../actions/utils/action-names");
6
7
  const errors_1 = require("../actions/utils/errors");
7
8
  const action_registry_1 = require("../actions/action-registry");
8
9
  const adapter_registry_1 = require("./adapter-registry");
9
10
  const skedulo_adapter_1 = require("./skedulo.adapter");
11
+ /** Header carrying the upstream request id, threaded into ctx.requestId. */
12
+ exports.REQUEST_ID_HEADER = 'sked-request-id';
10
13
  /**
11
14
  * Single-entry handler that dispatches every integration action through the
12
15
  * action registry. Tenant functions wire one HTTP route to `dispatch` and
@@ -22,6 +25,8 @@ class BaseAdapterHandler {
22
25
  * action input. Returns an `ActionResult` wrapped in an HTTP status.
23
26
  */
24
27
  this.dispatch = async (body, headers, _method, _path, skedContext) => {
28
+ var _a;
29
+ const requestId = (_a = readHeader(headers, exports.REQUEST_ID_HEADER)) !== null && _a !== void 0 ? _a : (0, crypto_1.randomUUID)();
25
30
  const actionName = readHeader(headers, action_names_1.ACTION_HEADER);
26
31
  if (!actionName) {
27
32
  return failure(400, 'MISSING_ACTION_HEADER', `Missing required header: ${action_names_1.ACTION_HEADER}`);
@@ -32,7 +37,10 @@ class BaseAdapterHandler {
32
37
  }
33
38
  let input;
34
39
  try {
35
- input = action.parseInput(body);
40
+ input = action.parseInput(body, {
41
+ dataFlowId: readDataFlowId(headers),
42
+ scheduledJobName: readHeader(headers, action_names_1.SCHEDULED_JOB_NAME_HEADER),
43
+ });
36
44
  }
37
45
  catch (err) {
38
46
  if (err instanceof errors_1.InvalidInputError) {
@@ -43,14 +51,14 @@ class BaseAdapterHandler {
43
51
  const integrationContext = (0, context_1.createIntegrationContext)(skedContext, this.integrationType, {
44
52
  requestSource: `${this.integrationType}-${actionName}`,
45
53
  userAgent: `${this.integrationType}-function`,
46
- });
54
+ }, { requestId, metrics: this.config.metrics });
47
55
  try {
48
56
  const result = await action.handler(input, integrationContext);
49
57
  return { status: 200, body: { ok: true, result } };
50
58
  }
51
59
  catch (err) {
52
60
  if (err instanceof errors_1.ActionError) {
53
- return failure(actionErrorStatus(err.code), err.code, err.message, err.details);
61
+ return failure((0, errors_1.categoryToStatus)(err.category), err.code, err.message, err.details, err.retryable);
54
62
  }
55
63
  return failure(500, 'INTERNAL_ERROR', err instanceof Error ? err.message : String(err));
56
64
  }
@@ -78,36 +86,25 @@ function readHeader(headers, name) {
78
86
  }
79
87
  return undefined;
80
88
  }
81
- function failure(status, code, message, details) {
82
- const error = details !== undefined ? { code, message, details } : { code, message };
83
- return { status, body: { ok: false, error } };
84
- }
85
89
  /**
86
- * Map well-known action error codes to HTTP statuses. Default to 400
87
- * (caller error).
90
+ * ElasticServer scheduled webhooks post an empty body and triggered actions
91
+ * post a bare array; both carry the flow id on the `sked-data-flow-id` header.
92
+ * Lift it off so the dispatcher can hand it to `parseInput` as `meta` without
93
+ * mutating the body.
88
94
  */
89
- function actionErrorStatus(code) {
90
- switch (code) {
91
- case 'FORBIDDEN':
92
- return 403;
93
- case 'FLOW_NOT_FOUND':
94
- return 404;
95
- case 'PRECONDITION_FAILED':
96
- return 412;
97
- case 'NOT_IMPLEMENTED':
98
- return 501;
99
- case 'NO_ACTIVE_FLOWS':
100
- return 503;
101
- case 'PROCESSING_FAILED':
102
- return 502;
103
- case 'DIRECTION_IS_IMMUTABLE':
104
- case 'DEACTIVATE_BEFORE_STRATEGY_CHANGE':
105
- return 409;
106
- case 'UNSUPPORTED_STRATEGY':
107
- case 'MISSING_SYNC_STRATEGY':
108
- return 422;
109
- default:
110
- return 400;
111
- }
95
+ function readDataFlowId(headers) {
96
+ const raw = readHeader(headers, action_names_1.DATA_FLOW_ID_HEADER);
97
+ if (raw === undefined)
98
+ return undefined;
99
+ const id = Number(raw);
100
+ return Number.isInteger(id) ? id : undefined;
101
+ }
102
+ function failure(status, code, message, details, retryable) {
103
+ const error = { code, message };
104
+ if (details !== undefined)
105
+ error.details = details;
106
+ if (retryable !== undefined)
107
+ error.retryable = retryable;
108
+ return { status, body: { ok: false, error } };
112
109
  }
113
110
  //# sourceMappingURL=base-adapter-handler.js.map