@devrev/airsync-sdk 2.0.0-beta.0 → 2.0.0-beta.10

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 (227) hide show
  1. package/README.md +7 -21
  2. package/dist/attachments-streaming/attachments-streaming-pool.d.ts +7 -1
  3. package/dist/attachments-streaming/attachments-streaming-pool.d.ts.map +1 -1
  4. package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts +4 -3
  5. package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts.map +1 -1
  6. package/dist/attachments-streaming/attachments-streaming-pool.js +70 -33
  7. package/dist/common/constants.d.ts +15 -12
  8. package/dist/common/constants.d.ts.map +1 -1
  9. package/dist/common/constants.js +20 -34
  10. package/dist/common/helpers.d.ts +3 -27
  11. package/dist/common/helpers.d.ts.map +1 -1
  12. package/dist/common/helpers.js +6 -36
  13. package/dist/http/{axios-client-internal.d.ts → client.d.ts} +1 -1
  14. package/dist/http/client.d.ts.map +1 -0
  15. package/dist/http/{axios-client-internal.js → client.js} +7 -4
  16. package/dist/http/errors.d.ts +8 -0
  17. package/dist/http/errors.d.ts.map +1 -0
  18. package/dist/http/errors.js +31 -0
  19. package/dist/index.d.ts +30 -12
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +47 -28
  22. package/dist/logger/logger.d.ts +13 -70
  23. package/dist/logger/logger.d.ts.map +1 -1
  24. package/dist/logger/logger.interfaces.d.ts +4 -7
  25. package/dist/logger/logger.interfaces.d.ts.map +1 -1
  26. package/dist/logger/logger.js +67 -92
  27. package/dist/mappers/mappers.d.ts +10 -43
  28. package/dist/mappers/mappers.d.ts.map +1 -1
  29. package/dist/mappers/mappers.interfaces.d.ts +173 -0
  30. package/dist/mappers/mappers.interfaces.d.ts.map +1 -0
  31. package/dist/mappers/{mappers.interface.js → mappers.interfaces.js} +1 -10
  32. package/dist/mappers/mappers.js +32 -46
  33. package/dist/multithreading/adapters/base-adapter.d.ts +39 -0
  34. package/dist/multithreading/adapters/base-adapter.d.ts.map +1 -0
  35. package/dist/multithreading/adapters/base-adapter.js +212 -0
  36. package/dist/multithreading/adapters/extraction-adapter.d.ts +49 -0
  37. package/dist/multithreading/adapters/extraction-adapter.d.ts.map +1 -0
  38. package/dist/multithreading/adapters/extraction-adapter.js +375 -0
  39. package/dist/multithreading/adapters/loading-adapter.d.ts +26 -0
  40. package/dist/multithreading/adapters/loading-adapter.d.ts.map +1 -0
  41. package/dist/multithreading/adapters/loading-adapter.helpers.d.ts +12 -0
  42. package/dist/multithreading/adapters/loading-adapter.helpers.d.ts.map +1 -0
  43. package/dist/multithreading/{worker-adapter/worker-adapter.helpers.js → adapters/loading-adapter.helpers.js} +2 -12
  44. package/dist/multithreading/adapters/loading-adapter.js +279 -0
  45. package/dist/multithreading/emit.d.ts +11 -0
  46. package/dist/multithreading/emit.d.ts.map +1 -0
  47. package/dist/multithreading/emit.js +25 -0
  48. package/dist/multithreading/process-task.d.ts +6 -1
  49. package/dist/multithreading/process-task.d.ts.map +1 -1
  50. package/dist/multithreading/process-task.js +124 -51
  51. package/dist/multithreading/spawn/spawn.d.ts +11 -11
  52. package/dist/multithreading/spawn/spawn.d.ts.map +1 -1
  53. package/dist/multithreading/spawn/spawn.helpers.d.ts +12 -11
  54. package/dist/multithreading/spawn/spawn.helpers.d.ts.map +1 -1
  55. package/dist/multithreading/spawn/spawn.helpers.js +142 -77
  56. package/dist/multithreading/spawn/spawn.js +74 -75
  57. package/dist/multithreading/worker.js +16 -5
  58. package/dist/repo/repo.d.ts +14 -5
  59. package/dist/repo/repo.d.ts.map +1 -1
  60. package/dist/repo/repo.helpers.d.ts +6 -0
  61. package/dist/repo/repo.helpers.d.ts.map +1 -0
  62. package/dist/repo/repo.helpers.js +16 -0
  63. package/dist/repo/repo.interfaces.d.ts +11 -20
  64. package/dist/repo/repo.interfaces.d.ts.map +1 -1
  65. package/dist/repo/repo.js +36 -22
  66. package/dist/state/base-state.d.ts +58 -0
  67. package/dist/state/base-state.d.ts.map +1 -0
  68. package/dist/state/base-state.js +242 -0
  69. package/dist/state/extraction-state.d.ts +14 -0
  70. package/dist/state/extraction-state.d.ts.map +1 -0
  71. package/dist/state/extraction-state.js +140 -0
  72. package/dist/state/install-initial-domain-mapping.d.ts +4 -0
  73. package/dist/state/install-initial-domain-mapping.d.ts.map +1 -0
  74. package/dist/{common → state}/install-initial-domain-mapping.js +5 -7
  75. package/dist/state/loading-state.d.ts +8 -0
  76. package/dist/state/loading-state.d.ts.map +1 -0
  77. package/dist/state/loading-state.js +29 -0
  78. package/dist/state/state.d.ts +3 -29
  79. package/dist/state/state.d.ts.map +1 -1
  80. package/dist/state/state.interfaces.d.ts +36 -10
  81. package/dist/state/state.interfaces.d.ts.map +1 -1
  82. package/dist/state/state.interfaces.js +17 -1
  83. package/dist/state/state.js +9 -164
  84. package/dist/state/time-value-resolver.d.ts +17 -0
  85. package/dist/state/time-value-resolver.d.ts.map +1 -0
  86. package/dist/state/time-value-resolver.js +110 -0
  87. package/dist/testing/mock-event.d.ts +10 -0
  88. package/dist/testing/mock-event.d.ts.map +1 -0
  89. package/dist/testing/mock-event.js +96 -0
  90. package/dist/testing/mock-server.d.ts +31 -0
  91. package/dist/testing/mock-server.d.ts.map +1 -0
  92. package/dist/testing/mock-server.interfaces.d.ts +54 -0
  93. package/dist/testing/mock-server.interfaces.d.ts.map +1 -0
  94. package/dist/testing/mock-server.interfaces.js +4 -0
  95. package/dist/testing/mock-server.js +297 -0
  96. package/dist/testing/test-adapters.d.ts +22 -0
  97. package/dist/testing/test-adapters.d.ts.map +1 -0
  98. package/dist/testing/test-adapters.js +32 -0
  99. package/dist/types/common.d.ts +4 -37
  100. package/dist/types/common.d.ts.map +1 -1
  101. package/dist/types/common.js +2 -17
  102. package/dist/types/errors.d.ts +15 -0
  103. package/dist/types/errors.d.ts.map +1 -0
  104. package/dist/types/errors.js +28 -0
  105. package/dist/types/external-domain-metadata.d.ts +197 -0
  106. package/dist/types/external-domain-metadata.d.ts.map +1 -0
  107. package/dist/types/extraction.d.ts +135 -278
  108. package/dist/types/extraction.d.ts.map +1 -1
  109. package/dist/types/extraction.js +46 -133
  110. package/dist/types/loading.d.ts +15 -55
  111. package/dist/types/loading.d.ts.map +1 -1
  112. package/dist/types/loading.js +1 -23
  113. package/dist/types/workers.d.ts +70 -103
  114. package/dist/types/workers.d.ts.map +1 -1
  115. package/dist/types/workers.js +1 -6
  116. package/dist/uploader/uploader.d.ts +10 -61
  117. package/dist/uploader/uploader.d.ts.map +1 -1
  118. package/dist/uploader/uploader.helpers.d.ts +7 -27
  119. package/dist/uploader/uploader.helpers.d.ts.map +1 -1
  120. package/dist/uploader/uploader.helpers.js +80 -30
  121. package/dist/uploader/uploader.interfaces.d.ts +19 -54
  122. package/dist/uploader/uploader.interfaces.d.ts.map +1 -1
  123. package/dist/uploader/uploader.interfaces.js +8 -0
  124. package/dist/uploader/uploader.js +72 -124
  125. package/docs/MIGRATION.md +696 -0
  126. package/package.json +37 -20
  127. package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts +0 -2
  128. package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts.map +0 -1
  129. package/dist/attachments-streaming/attachments-streaming-pool.test.js +0 -267
  130. package/dist/common/control-protocol.d.ts +0 -10
  131. package/dist/common/control-protocol.d.ts.map +0 -1
  132. package/dist/common/control-protocol.js +0 -31
  133. package/dist/common/errors.d.ts +0 -6
  134. package/dist/common/errors.d.ts.map +0 -1
  135. package/dist/common/errors.js +0 -4
  136. package/dist/common/event-type-translation.d.ts +0 -24
  137. package/dist/common/event-type-translation.d.ts.map +0 -1
  138. package/dist/common/event-type-translation.js +0 -117
  139. package/dist/common/install-initial-domain-mapping.d.ts +0 -4
  140. package/dist/common/install-initial-domain-mapping.d.ts.map +0 -1
  141. package/dist/common/install-initial-domain-mapping.test.d.ts +0 -2
  142. package/dist/common/install-initial-domain-mapping.test.d.ts.map +0 -1
  143. package/dist/common/install-initial-domain-mapping.test.js +0 -207
  144. package/dist/deprecated/adapter/index.d.ts +0 -62
  145. package/dist/deprecated/adapter/index.d.ts.map +0 -1
  146. package/dist/deprecated/adapter/index.js +0 -151
  147. package/dist/deprecated/common/helpers.d.ts +0 -7
  148. package/dist/deprecated/common/helpers.d.ts.map +0 -1
  149. package/dist/deprecated/common/helpers.js +0 -47
  150. package/dist/deprecated/demo-extractor/external_domain_metadata.json +0 -38
  151. package/dist/deprecated/demo-extractor/index.d.ts +0 -18
  152. package/dist/deprecated/demo-extractor/index.d.ts.map +0 -1
  153. package/dist/deprecated/demo-extractor/index.js +0 -161
  154. package/dist/deprecated/http/client.d.ts +0 -22
  155. package/dist/deprecated/http/client.d.ts.map +0 -1
  156. package/dist/deprecated/http/client.js +0 -161
  157. package/dist/deprecated/uploader/index.d.ts +0 -35
  158. package/dist/deprecated/uploader/index.d.ts.map +0 -1
  159. package/dist/deprecated/uploader/index.js +0 -161
  160. package/dist/http/axios-client-internal.d.ts.map +0 -1
  161. package/dist/http/axios-client-internal.test.d.ts +0 -2
  162. package/dist/http/axios-client-internal.test.d.ts.map +0 -1
  163. package/dist/http/axios-client-internal.test.js +0 -154
  164. package/dist/http/axios-client.d.ts +0 -27
  165. package/dist/http/axios-client.d.ts.map +0 -1
  166. package/dist/http/axios-client.js +0 -57
  167. package/dist/http/constants.d.ts +0 -4
  168. package/dist/http/constants.d.ts.map +0 -1
  169. package/dist/http/constants.js +0 -6
  170. package/dist/http/index.d.ts +0 -3
  171. package/dist/http/index.d.ts.map +0 -1
  172. package/dist/http/index.js +0 -18
  173. package/dist/http/types.d.ts +0 -17
  174. package/dist/http/types.d.ts.map +0 -1
  175. package/dist/logger/logger.constants.d.ts +0 -6
  176. package/dist/logger/logger.constants.d.ts.map +0 -1
  177. package/dist/logger/logger.constants.js +0 -13
  178. package/dist/logger/logger.context.d.ts +0 -58
  179. package/dist/logger/logger.context.d.ts.map +0 -1
  180. package/dist/logger/logger.context.js +0 -86
  181. package/dist/logger/logger.test.d.ts +0 -2
  182. package/dist/logger/logger.test.d.ts.map +0 -1
  183. package/dist/logger/logger.test.js +0 -490
  184. package/dist/mappers/mappers.interface.d.ts +0 -294
  185. package/dist/mappers/mappers.interface.d.ts.map +0 -1
  186. package/dist/mappers/mappers.test.d.ts +0 -2
  187. package/dist/mappers/mappers.test.d.ts.map +0 -1
  188. package/dist/mappers/mappers.test.js +0 -107
  189. package/dist/multithreading/create-worker.test.d.ts +0 -2
  190. package/dist/multithreading/create-worker.test.d.ts.map +0 -1
  191. package/dist/multithreading/create-worker.test.js +0 -89
  192. package/dist/multithreading/spawn/spawn.helpers.test.d.ts +0 -2
  193. package/dist/multithreading/spawn/spawn.helpers.test.d.ts.map +0 -1
  194. package/dist/multithreading/spawn/spawn.helpers.test.js +0 -293
  195. package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.d.ts +0 -2
  196. package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.d.ts.map +0 -1
  197. package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.js +0 -127
  198. package/dist/multithreading/worker-adapter/worker-adapter.d.ts +0 -91
  199. package/dist/multithreading/worker-adapter/worker-adapter.d.ts.map +0 -1
  200. package/dist/multithreading/worker-adapter/worker-adapter.helpers.d.ts +0 -22
  201. package/dist/multithreading/worker-adapter/worker-adapter.helpers.d.ts.map +0 -1
  202. package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.d.ts +0 -2
  203. package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.d.ts.map +0 -1
  204. package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.js +0 -514
  205. package/dist/multithreading/worker-adapter/worker-adapter.js +0 -747
  206. package/dist/multithreading/worker-adapter/worker-adapter.test.d.ts +0 -2
  207. package/dist/multithreading/worker-adapter/worker-adapter.test.d.ts.map +0 -1
  208. package/dist/multithreading/worker-adapter/worker-adapter.test.js +0 -483
  209. package/dist/repo/repo.test.d.ts +0 -2
  210. package/dist/repo/repo.test.d.ts.map +0 -1
  211. package/dist/repo/repo.test.js +0 -131
  212. package/dist/state/state.test.d.ts +0 -2
  213. package/dist/state/state.test.d.ts.map +0 -1
  214. package/dist/state/state.test.js +0 -224
  215. package/dist/types/extraction.test.d.ts +0 -2
  216. package/dist/types/extraction.test.d.ts.map +0 -1
  217. package/dist/types/extraction.test.js +0 -70
  218. package/dist/types/index.d.ts +0 -9
  219. package/dist/types/index.d.ts.map +0 -1
  220. package/dist/types/index.js +0 -18
  221. package/dist/uploader/uploader.helpers.test.d.ts +0 -2
  222. package/dist/uploader/uploader.helpers.test.d.ts.map +0 -1
  223. package/dist/uploader/uploader.helpers.test.js +0 -267
  224. package/dist/uploader/uploader.test.d.ts +0 -2
  225. package/dist/uploader/uploader.test.d.ts.map +0 -1
  226. package/dist/uploader/uploader.test.js +0 -589
  227. /package/dist/{http/types.js → types/external-domain-metadata.js} +0 -0
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LoadingState = void 0;
4
+ exports.createLoadingState = createLoadingState;
5
+ const constants_1 = require("../common/constants");
6
+ const base_state_1 = require("./base-state");
7
+ const state_interfaces_1 = require("./state.interfaces");
8
+ /** State for loading workers: seeds loading SDK state; no extraction-window resolution. */
9
+ class LoadingState extends base_state_1.BaseState {
10
+ constructor(params) {
11
+ super(params, state_interfaces_1.loadingSdkState);
12
+ }
13
+ }
14
+ exports.LoadingState = LoadingState;
15
+ async function createLoadingState({ event, initialState, initialDomainMapping, options, }) {
16
+ // Clone so the caller's initialState is never mutated.
17
+ const deepCloneInitialState = structuredClone(initialState);
18
+ const state = new LoadingState({
19
+ event,
20
+ initialState: deepCloneInitialState,
21
+ initialDomainMapping,
22
+ options,
23
+ });
24
+ if (!constants_1.STATELESS_EVENT_TYPES.includes(event.payload.event_type)) {
25
+ await state.init(deepCloneInitialState);
26
+ await state.installInitialDomainMappingIfNeeded(initialDomainMapping);
27
+ }
28
+ return state;
29
+ }
@@ -1,30 +1,4 @@
1
- import { AdapterState, StateInterface } from './state.interfaces';
2
- export declare function createAdapterState<ConnectorState>({ event, initialState, initialDomainMapping, options, }: StateInterface<ConnectorState>): Promise<State<ConnectorState>>;
3
- export declare class State<ConnectorState> {
4
- private _state;
5
- private initialSdkState;
6
- private workerUrl;
7
- private devrevToken;
8
- private syncUnitId;
9
- private requestId;
10
- constructor({ event, initialState }: StateInterface<ConnectorState>);
11
- get state(): AdapterState<ConnectorState>;
12
- set state(value: AdapterState<ConnectorState>);
13
- /**
14
- * Initializes the state for this adapter instance by fetching from API
15
- * or creating an initial state if none exists (404).
16
- * @param initialState The initial connector state provided by the spawn function
17
- */
18
- init(initialState: ConnectorState): Promise<void>;
19
- /**
20
- * Updates the state of the adapter by posting to API.
21
- * @param {object} state - The state to be updated
22
- */
23
- postState(state?: AdapterState<ConnectorState>): Promise<void>;
24
- /**
25
- * Fetches the state of the adapter from API.
26
- * @return The raw state data from API
27
- */
28
- fetchState(): Promise<string>;
29
- }
1
+ export { BaseState } from './base-state';
2
+ export { createExtractionState, ExtractionState } from './extraction-state';
3
+ export { createLoadingState, LoadingState } from './loading-state';
30
4
  //# sourceMappingURL=state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/state/state.ts"],"names":[],"mappings":"AASA,OAAO,EACL,YAAY,EAIZ,cAAc,EACf,MAAM,oBAAoB,CAAC;AAE5B,wBAAsB,kBAAkB,CAAC,cAAc,EAAE,EACvD,KAAK,EACL,YAAY,EACZ,oBAAoB,EACpB,OAAO,GACR,EAAE,cAAc,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CA0DjE;AAED,qBAAa,KAAK,CAAC,cAAc;IAC/B,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,eAAe,CAAW;IAClC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;gBAEd,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,cAAc,CAAC,cAAc,CAAC;IAenE,IAAI,KAAK,IAAI,YAAY,CAAC,cAAc,CAAC,CAExC;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,cAAc,CAAC,EAE5C;IAED;;;;OAIG;IACG,IAAI,CAAC,YAAY,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCvD;;;OAGG;IACG,SAAS,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,cAAc,CAAC;IAuCpD;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;CAkBpC"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/state/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,40 +1,64 @@
1
1
  import { InitialDomainMapping } from '../types/common';
2
- import { AirdropEvent } from '../types/extraction';
2
+ import { AirSyncEvent } from '../types/extraction';
3
3
  import { FileToLoad } from '../types/loading';
4
- import { WorkerAdapterOptions } from '../types/workers';
4
+ import { RuntimeOptions } from '../types/workers';
5
+ import { Artifact } from '../uploader/uploader.interfaces';
5
6
  export interface SdkState {
6
7
  lastSyncStarted?: string;
7
8
  lastSuccessfulSyncStarted?: string;
9
+ pendingWorkersOldest?: string;
10
+ pendingWorkersNewest?: string;
11
+ workersOldest?: string;
12
+ workersNewest?: string;
8
13
  toDevRev?: ToDevRev;
9
14
  fromDevRev?: FromDevRev;
10
15
  snapInVersionId?: string;
11
16
  }
12
- /**
13
- * AdapterState is an interface that defines the structure of the adapter state that is used by the external extractor.
14
- * It extends the connector state with additional fields: lastSyncStarted, lastSuccessfulSyncStarted, snapInVersionId and attachmentsMetadata.
15
- */
16
- export type AdapterState<ConnectorState> = ConnectorState & SdkState;
17
+ export declare const STATE_VERSION = 2;
18
+ /** v2 on-disk state shape: SDK bookkeeping kept disjoint from connector keys. */
19
+ export interface AdapterStateEnvelope<ConnectorState> {
20
+ stateVersion: typeof STATE_VERSION;
21
+ connectorState: ConnectorState;
22
+ sdkState: SdkState;
23
+ }
17
24
  export interface ToDevRev {
25
+ /** SSOR artifacts from earlier phases, reported with ATTACHMENT_EXTRACTION_DONE. */
26
+ deferredSsorArtifacts?: Artifact[];
18
27
  attachmentsMetadata: {
19
28
  artifactIds: string[];
20
29
  lastProcessed: number;
21
- lastProcessedAttachmentsIdsList?: string[];
30
+ lastProcessedAttachmentsIdsList?: ProcessedAttachment[];
22
31
  };
23
32
  }
33
+ export declare enum ProcessedAttachmentStatus {
34
+ Success = "success",
35
+ Failed = "failed"
36
+ }
37
+ /** id + parent_id identify an attachment for SDK-side deduplication. */
38
+ export interface ProcessedAttachment {
39
+ id: string;
40
+ parent_id: string;
41
+ status: ProcessedAttachmentStatus;
42
+ }
24
43
  export interface FromDevRev {
25
44
  filesToLoad: FileToLoad[];
26
45
  }
27
46
  export interface StateInterface<ConnectorState> {
28
- event: AirdropEvent;
47
+ event: AirSyncEvent;
29
48
  initialState: ConnectorState;
30
49
  initialDomainMapping?: InitialDomainMapping;
31
- options?: WorkerAdapterOptions;
50
+ options?: RuntimeOptions;
32
51
  }
33
52
  export declare const extractionSdkState: {
34
53
  lastSyncStarted: string;
35
54
  lastSuccessfulSyncStarted: string;
55
+ pendingWorkersOldest: string;
56
+ pendingWorkersNewest: string;
57
+ workersOldest: string;
58
+ workersNewest: string;
36
59
  snapInVersionId: string;
37
60
  toDevRev: {
61
+ deferredSsorArtifacts: never[];
38
62
  attachmentsMetadata: {
39
63
  artifactIds: never[];
40
64
  lastProcessed: number;
@@ -48,4 +72,6 @@ export declare const loadingSdkState: {
48
72
  filesToLoad: never[];
49
73
  };
50
74
  };
75
+ /** SDK-owned top-level state keys, used to split a flat v1 blob during migration. */
76
+ export declare const V1_SDK_STATE_KEYS: ReadonlySet<string>;
51
77
  //# sourceMappingURL=state.interfaces.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.interfaces.d.ts","sourceRoot":"","sources":["../../src/state/state.interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,QAAQ;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,CAAC,cAAc,IAAI,cAAc,GAAG,QAAQ,CAAC;AAErE,MAAM,WAAW,QAAQ;IACvB,mBAAmB,EAAE;QACnB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,+BAA+B,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5C,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc,CAAC,cAAc;IAC5C,KAAK,EAAE,YAAY,CAAC;IACpB,YAAY,EAAE,cAAc,CAAC;IAC7B,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC;AAED,eAAO,MAAM,kBAAkB;;;;;;;;;;;CAW9B,CAAC;AAEF,eAAO,MAAM,eAAe;;;;;CAK3B,CAAC"}
1
+ {"version":3,"file":"state.interfaces.d.ts","sourceRoot":"","sources":["../../src/state/state.interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAE3D,MAAM,WAAW,QAAQ;IAGvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAGnC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,aAAa,IAAI,CAAC;AAE/B,iFAAiF;AACjF,MAAM,WAAW,oBAAoB,CAAC,cAAc;IAClD,YAAY,EAAE,OAAO,aAAa,CAAC;IACnC,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,oFAAoF;IACpF,qBAAqB,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnC,mBAAmB,EAAE;QACnB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,+BAA+B,CAAC,EAAE,mBAAmB,EAAE,CAAC;KACzD,CAAC;CACH;AAED,oBAAY,yBAAyB;IACnC,OAAO,YAAY;IACnB,MAAM,WAAW;CAClB;AAED,wEAAwE;AACxE,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,yBAAyB,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc,CAAC,cAAc;IAC5C,KAAK,EAAE,YAAY,CAAC;IACpB,YAAY,EAAE,cAAc,CAAC;IAC7B,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;CAgB9B,CAAC;AAEF,eAAO,MAAM,eAAe;;;;;CAK3B,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAGhD,CAAC"}
@@ -1,11 +1,22 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.loadingSdkState = exports.extractionSdkState = void 0;
3
+ exports.V1_SDK_STATE_KEYS = exports.loadingSdkState = exports.extractionSdkState = exports.ProcessedAttachmentStatus = exports.STATE_VERSION = void 0;
4
+ exports.STATE_VERSION = 2;
5
+ var ProcessedAttachmentStatus;
6
+ (function (ProcessedAttachmentStatus) {
7
+ ProcessedAttachmentStatus["Success"] = "success";
8
+ ProcessedAttachmentStatus["Failed"] = "failed";
9
+ })(ProcessedAttachmentStatus || (exports.ProcessedAttachmentStatus = ProcessedAttachmentStatus = {}));
4
10
  exports.extractionSdkState = {
5
11
  lastSyncStarted: '',
6
12
  lastSuccessfulSyncStarted: '',
13
+ pendingWorkersOldest: '',
14
+ pendingWorkersNewest: '',
15
+ workersOldest: '',
16
+ workersNewest: '',
7
17
  snapInVersionId: '',
8
18
  toDevRev: {
19
+ deferredSsorArtifacts: [],
9
20
  attachmentsMetadata: {
10
21
  artifactIds: [],
11
22
  lastProcessed: 0,
@@ -19,3 +30,8 @@ exports.loadingSdkState = {
19
30
  filesToLoad: [],
20
31
  },
21
32
  };
33
+ /** SDK-owned top-level state keys, used to split a flat v1 blob during migration. */
34
+ exports.V1_SDK_STATE_KEYS = new Set([
35
+ ...Object.keys(exports.extractionSdkState),
36
+ ...Object.keys(exports.loadingSdkState),
37
+ ]);
@@ -1,166 +1,11 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.State = void 0;
7
- exports.createAdapterState = createAdapterState;
8
- const axios_1 = __importDefault(require("axios"));
9
- const constants_1 = require("../common/constants");
10
- const install_initial_domain_mapping_1 = require("../common/install-initial-domain-mapping");
11
- const axios_client_internal_1 = require("../http/axios-client-internal");
12
- const logger_1 = require("../logger/logger");
13
- const common_1 = require("../types/common");
14
- const extraction_1 = require("../types/extraction");
15
- const state_interfaces_1 = require("./state.interfaces");
16
- async function createAdapterState({ event, initialState, initialDomainMapping, options, }) {
17
- // Deep clone the initial state to avoid mutating the original state
18
- const deepCloneInitialState = structuredClone(initialState);
19
- const as = new State({
20
- event,
21
- initialState: deepCloneInitialState,
22
- initialDomainMapping,
23
- options,
24
- });
25
- if (!constants_1.STATELESS_EVENT_TYPES.includes(event.payload.event_type)) {
26
- await as.init(deepCloneInitialState);
27
- // Check if IDM needs to be updated
28
- const snapInVersionId = event.context.snap_in_version_id;
29
- const hasSnapInVersionInState = 'snapInVersionId' in as.state;
30
- const shouldUpdateIDM = !hasSnapInVersionInState || as.state.snapInVersionId !== snapInVersionId;
31
- if (!shouldUpdateIDM) {
32
- console.log(`Snap-in version in state matches the version in event context "${snapInVersionId}". Skipping initial domain mapping installation.`);
33
- }
34
- else {
35
- try {
36
- console.log(`Snap-in version in state "${as.state.snapInVersionId}" does not match the version in event context "${snapInVersionId}". Installing initial domain mapping.`);
37
- if (initialDomainMapping) {
38
- await (0, install_initial_domain_mapping_1.installInitialDomainMapping)(event, initialDomainMapping);
39
- as.state.snapInVersionId = snapInVersionId;
40
- }
41
- else {
42
- throw new Error('No initial domain mapping was passed to spawn function. Skipping initial domain mapping installation.');
43
- }
44
- }
45
- catch (error) {
46
- console.error('Error while installing initial domain mapping.', (0, logger_1.serializeError)(error));
47
- process.exit(1);
48
- }
49
- }
50
- // Set lastSyncStarted if the event type is StartExtractingData
51
- if (event.payload.event_type === extraction_1.EventType.StartExtractingData &&
52
- !as.state.lastSyncStarted) {
53
- as.state.lastSyncStarted = new Date().toISOString();
54
- console.log(`Setting lastSyncStarted to ${as.state.lastSyncStarted}.`);
55
- }
56
- }
57
- return as;
58
- }
59
- class State {
60
- constructor({ event, initialState }) {
61
- this.initialSdkState =
62
- event.payload.event_context.mode === common_1.SyncMode.LOADING
63
- ? state_interfaces_1.loadingSdkState
64
- : state_interfaces_1.extractionSdkState;
65
- this._state = Object.assign(Object.assign({}, initialState), this.initialSdkState);
66
- this.workerUrl = event.payload.event_context.worker_data_url;
67
- this.devrevToken = event.context.secrets.service_account_token;
68
- this.syncUnitId = event.payload.event_context.sync_unit_id;
69
- this.requestId = event.payload.event_context.request_id_adaas;
70
- }
71
- get state() {
72
- return this._state;
73
- }
74
- set state(value) {
75
- this._state = value;
76
- }
77
- /**
78
- * Initializes the state for this adapter instance by fetching from API
79
- * or creating an initial state if none exists (404).
80
- * @param initialState The initial connector state provided by the spawn function
81
- */
82
- async init(initialState) {
83
- var _a;
84
- try {
85
- const stringifiedState = await this.fetchState();
86
- if (!stringifiedState) {
87
- throw new Error('No state found in response.');
88
- }
89
- let parsedState;
90
- try {
91
- parsedState = JSON.parse(stringifiedState);
92
- }
93
- catch (error) {
94
- throw new Error(`Failed to parse state. ${error}`);
95
- }
96
- this.state = parsedState;
97
- console.log('State fetched successfully. Current state', (0, logger_1.getPrintableState)(this.state));
98
- }
99
- catch (error) {
100
- if (axios_1.default.isAxiosError(error) && ((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) === 404) {
101
- console.log('State not found. Initializing state with initial state.');
102
- const initialAdapterState = Object.assign(Object.assign({}, initialState), this.initialSdkState);
103
- this.state = initialAdapterState;
104
- await this.postState(initialAdapterState);
105
- }
106
- else {
107
- console.error('Failed to init state.', (0, logger_1.serializeError)(error));
108
- process.exit(1);
109
- }
110
- }
111
- }
112
- /**
113
- * Updates the state of the adapter by posting to API.
114
- * @param {object} state - The state to be updated
115
- */
116
- async postState(state) {
117
- const url = this.workerUrl + '.update';
118
- this.state = state || this.state;
119
- let stringifiedState;
120
- try {
121
- stringifiedState = JSON.stringify(this.state);
122
- }
123
- catch (error) {
124
- console.error('Failed to stringify state.', (0, logger_1.serializeError)(error));
125
- process.exit(1);
126
- }
127
- try {
128
- await axios_client_internal_1.axiosClient.post(url, {
129
- state: stringifiedState,
130
- }, {
131
- headers: {
132
- Authorization: this.devrevToken,
133
- },
134
- params: {
135
- sync_unit: this.syncUnitId,
136
- request_id: this.requestId,
137
- },
138
- });
139
- console.log('State updated successfully to', (0, logger_1.getPrintableState)(this.state));
140
- }
141
- catch (error) {
142
- console.error('Failed to update the state.', (0, logger_1.serializeError)(error));
143
- process.exit(1);
144
- }
145
- }
146
- /**
147
- * Fetches the state of the adapter from API.
148
- * @return The raw state data from API
149
- */
150
- async fetchState() {
151
- var _a;
152
- console.log(`Fetching state with sync unit id ${this.syncUnitId} and request id ${this.requestId}.`);
153
- const url = this.workerUrl + '.get';
154
- const response = await axios_client_internal_1.axiosClient.get(url, {
155
- headers: {
156
- Authorization: this.devrevToken,
157
- },
158
- params: {
159
- sync_unit: this.syncUnitId,
160
- request_id: this.requestId,
161
- },
162
- });
163
- return (_a = response.data) === null || _a === void 0 ? void 0 : _a.state;
164
- }
165
- }
166
- exports.State = State;
3
+ exports.LoadingState = exports.createLoadingState = exports.ExtractionState = exports.createExtractionState = exports.BaseState = void 0;
4
+ var base_state_1 = require("./base-state");
5
+ Object.defineProperty(exports, "BaseState", { enumerable: true, get: function () { return base_state_1.BaseState; } });
6
+ var extraction_state_1 = require("./extraction-state");
7
+ Object.defineProperty(exports, "createExtractionState", { enumerable: true, get: function () { return extraction_state_1.createExtractionState; } });
8
+ Object.defineProperty(exports, "ExtractionState", { enumerable: true, get: function () { return extraction_state_1.ExtractionState; } });
9
+ var loading_state_1 = require("./loading-state");
10
+ Object.defineProperty(exports, "createLoadingState", { enumerable: true, get: function () { return loading_state_1.createLoadingState; } });
11
+ Object.defineProperty(exports, "LoadingState", { enumerable: true, get: function () { return loading_state_1.LoadingState; } });
@@ -0,0 +1,17 @@
1
+ import { SdkState } from '../state/state.interfaces';
2
+ import { TimeUnit, TimeValue } from '../types/extraction';
3
+ /** Parses a shorthand duration (e.g. '100ns', '500ms', '5m', '2h'); units are the `TimeUnit` values. */
4
+ export declare function parseDuration(shorthand: string): {
5
+ value: number;
6
+ unit: TimeUnit;
7
+ };
8
+ /** Adds/subtracts a shorthand duration to/from an ISO 8601 timestamp. */
9
+ export declare function applyDuration(baseTimestamp: string, duration: string, operation: 'add' | 'subtract'): string;
10
+ /**
11
+ * Resolves a TimeValue into a concrete ISO 8601 timestamp. WORKERS_* types
12
+ * read the boundaries from state and fall back to UNBOUNDED when unset
13
+ * (backwards compatibility with old state); *_WINDOW types apply the duration
14
+ * in `timeValue.value` to the boundary.
15
+ */
16
+ export declare function resolveTimeValue(timeValue: TimeValue, state: SdkState): string;
17
+ //# sourceMappingURL=time-value-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-value-resolver.d.ts","sourceRoot":"","sources":["../../src/state/time-value-resolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAiB,MAAM,qBAAqB,CAAC;AAEzE,wGAAwG;AACxG,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;CAChB,CAcA;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAC3B,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,KAAK,GAAG,UAAU,GAC5B,MAAM,CA6BR;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,QAAQ,GACd,MAAM,CAsER"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseDuration = parseDuration;
4
+ exports.applyDuration = applyDuration;
5
+ exports.resolveTimeValue = resolveTimeValue;
6
+ const constants_1 = require("../common/constants");
7
+ const extraction_1 = require("../types/extraction");
8
+ /** Parses a shorthand duration (e.g. '100ns', '500ms', '5m', '2h'); units are the `TimeUnit` values. */
9
+ function parseDuration(shorthand) {
10
+ const validUnits = Object.values(extraction_1.TimeUnit).join('|');
11
+ const match = shorthand.match(new RegExp(`^(\\d+(?:\\.\\d+)?)(${validUnits})$`));
12
+ if (!match) {
13
+ throw new Error(`Invalid duration format: '${shorthand}'. Expected format like '100ns', '500ms', '30s', '5m', or '2h'.`);
14
+ }
15
+ return {
16
+ value: parseFloat(match[1]),
17
+ unit: match[2],
18
+ };
19
+ }
20
+ /** Adds/subtracts a shorthand duration to/from an ISO 8601 timestamp. */
21
+ function applyDuration(baseTimestamp, duration, operation) {
22
+ const { value, unit } = parseDuration(duration);
23
+ const date = new Date(baseTimestamp);
24
+ const sign = operation === 'add' ? 1 : -1;
25
+ switch (unit) {
26
+ case extraction_1.TimeUnit.NANOSECONDS:
27
+ // JavaScript Date works in milliseconds, so convert nanoseconds
28
+ date.setTime(date.getTime() + sign * value * 0.000001);
29
+ break;
30
+ case extraction_1.TimeUnit.MICROSECONDS:
31
+ case extraction_1.TimeUnit.MICROSECONDS_MU:
32
+ date.setTime(date.getTime() + sign * value * 0.001);
33
+ break;
34
+ case extraction_1.TimeUnit.MILLISECONDS:
35
+ date.setTime(date.getTime() + sign * value);
36
+ break;
37
+ case extraction_1.TimeUnit.SECONDS:
38
+ date.setUTCSeconds(date.getUTCSeconds() + sign * value);
39
+ break;
40
+ case extraction_1.TimeUnit.MINUTES:
41
+ date.setUTCMinutes(date.getUTCMinutes() + sign * value);
42
+ break;
43
+ case extraction_1.TimeUnit.HOURS:
44
+ date.setUTCHours(date.getUTCHours() + sign * value);
45
+ break;
46
+ }
47
+ return date.toISOString();
48
+ }
49
+ /**
50
+ * Resolves a TimeValue into a concrete ISO 8601 timestamp. WORKERS_* types
51
+ * read the boundaries from state and fall back to UNBOUNDED when unset
52
+ * (backwards compatibility with old state); *_WINDOW types apply the duration
53
+ * in `timeValue.value` to the boundary.
54
+ */
55
+ function resolveTimeValue(timeValue, state) {
56
+ switch (timeValue.type) {
57
+ case extraction_1.TimeValueType.ABSOLUTE_TIME: {
58
+ if (!timeValue.value) {
59
+ throw new Error('TimeValue of type ABSOLUTE must have a value (ISO 8601 timestamp).');
60
+ }
61
+ // Normalize to consistent ISO 8601 format (YYYY-MM-DDTHH:mm:ss.sssZ)
62
+ // to ensure string comparisons in boundary expansion are safe.
63
+ const parsed = new Date(timeValue.value);
64
+ if (isNaN(parsed.getTime())) {
65
+ throw new Error(`TimeValue of type ABSOLUTE has an invalid ISO 8601 timestamp: '${timeValue.value}'.`);
66
+ }
67
+ return parsed.toISOString();
68
+ }
69
+ case extraction_1.TimeValueType.CURRENT_TIME: {
70
+ return new Date().toISOString();
71
+ }
72
+ case extraction_1.TimeValueType.UNBOUNDED: {
73
+ return constants_1.UNBOUNDED_DATE_TIME_VALUE;
74
+ }
75
+ case extraction_1.TimeValueType.WORKERS_OLDEST: {
76
+ if (!state.workersOldest) {
77
+ return constants_1.UNBOUNDED_DATE_TIME_VALUE;
78
+ }
79
+ return state.workersOldest;
80
+ }
81
+ case extraction_1.TimeValueType.WORKERS_NEWEST: {
82
+ if (!state.workersNewest) {
83
+ // State from before workers boundaries existed only has the sync start.
84
+ return state.lastSuccessfulSyncStarted || constants_1.UNBOUNDED_DATE_TIME_VALUE;
85
+ }
86
+ return state.workersNewest;
87
+ }
88
+ case extraction_1.TimeValueType.WORKERS_OLDEST_MINUS_WINDOW: {
89
+ if (!timeValue.value) {
90
+ throw new Error("TimeValue of type WORKERS_OLDEST_MINUS_WINDOW must have a value (duration, e.g. '30s', '5m', '2h').");
91
+ }
92
+ if (!state.workersOldest) {
93
+ return constants_1.UNBOUNDED_DATE_TIME_VALUE;
94
+ }
95
+ return applyDuration(state.workersOldest, timeValue.value, 'subtract');
96
+ }
97
+ case extraction_1.TimeValueType.WORKERS_NEWEST_PLUS_WINDOW: {
98
+ if (!timeValue.value) {
99
+ throw new Error("TimeValue of type WORKERS_NEWEST_PLUS_WINDOW must have a value (duration, e.g. '30s', '5m', '2h').");
100
+ }
101
+ if (!state.workersNewest) {
102
+ return state.lastSuccessfulSyncStarted || constants_1.UNBOUNDED_DATE_TIME_VALUE;
103
+ }
104
+ return applyDuration(state.workersNewest, timeValue.value, 'add');
105
+ }
106
+ default: {
107
+ throw new Error(`Unknown TimeValueType: '${timeValue.type}'.`);
108
+ }
109
+ }
110
+ }
@@ -0,0 +1,10 @@
1
+ import { AirSyncEvent } from '../types/extraction';
2
+ export type DeepPartial<T> = {
3
+ [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
4
+ };
5
+ /**
6
+ * Creates a mock AirSyncEvent for testing. `callback_url`, `worker_data_url`,
7
+ * and `devrev_endpoint` derive from `mockServerUrl` unless explicitly overridden.
8
+ */
9
+ export declare function createMockEvent(mockServerUrl?: string, overrides?: DeepPartial<AirSyncEvent>): AirSyncEvent;
10
+ //# sourceMappingURL=mock-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-event.d.ts","sourceRoot":"","sources":["../../src/testing/mock-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAa,MAAM,qBAAqB,CAAC;AAI9D,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;KAC1B,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAChE,CAAC;AAiCF;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,aAAa,GAAE,MAAgC,EAC/C,SAAS,GAAE,WAAW,CAAC,YAAY,CAAM,GACxC,YAAY,CAuEd"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMockEvent = createMockEvent;
4
+ const extraction_1 = require("../types/extraction");
5
+ const mock_server_1 = require("./mock-server");
6
+ /** Arrays and primitives from source replace target's; plain objects merge recursively. */
7
+ function deepMerge(target, source) {
8
+ const result = Object.assign({}, target);
9
+ for (const key of Object.keys(source)) {
10
+ const sourceVal = source[key];
11
+ const targetVal = target[key];
12
+ if (sourceVal !== null &&
13
+ typeof sourceVal === 'object' &&
14
+ !Array.isArray(sourceVal) &&
15
+ targetVal !== null &&
16
+ typeof targetVal === 'object' &&
17
+ !Array.isArray(targetVal)) {
18
+ result[key] = deepMerge(targetVal, sourceVal);
19
+ }
20
+ else {
21
+ result[key] = sourceVal;
22
+ }
23
+ }
24
+ return result;
25
+ }
26
+ /**
27
+ * Creates a mock AirSyncEvent for testing. `callback_url`, `worker_data_url`,
28
+ * and `devrev_endpoint` derive from `mockServerUrl` unless explicitly overridden.
29
+ */
30
+ function createMockEvent(mockServerUrl = mock_server_1.MOCK_SERVER_DEFAULT_URL, overrides = {}) {
31
+ var _a, _b, _c, _d;
32
+ const base = {
33
+ context: {
34
+ secrets: {
35
+ service_account_token: 'test_token',
36
+ },
37
+ snap_in_version_id: 'test_snap_in_version_id',
38
+ snap_in_id: 'test_snap_in_id',
39
+ user_id: 'test_user_id',
40
+ dev_oid: 'test_dev_oid',
41
+ source_id: 'test_source_id',
42
+ service_account_id: 'test_service_account_id',
43
+ },
44
+ payload: {
45
+ connection_data: {
46
+ org_id: 'test_org_id',
47
+ org_name: 'test_org_name',
48
+ key: 'test_key',
49
+ key_type: 'test_key_type',
50
+ },
51
+ event_context: {
52
+ callback_url: `${mockServerUrl}/callback_url`,
53
+ dev_oid: 'test_dev_oid',
54
+ dev_org_id: 'test_dev_org_id',
55
+ dev_uid: 'test_dev_uid',
56
+ event_type_adaas: 'test_event_type_adaas',
57
+ external_sync_unit_id: 'test_external_sync_unit_id',
58
+ external_sync_unit_name: 'test_external_sync_unit_name',
59
+ external_system_id: 'test_external_system_id',
60
+ external_system_name: 'test_external_system_name',
61
+ external_system_type: 'test_external_system_type',
62
+ import_slug: 'test_import_slug',
63
+ mode: 'INITIAL',
64
+ request_id: 'test_request_id',
65
+ request_id_adaas: 'test_request_id_adaas',
66
+ run_id: 'test_run_id',
67
+ sequence_version: 'test_sequence_version',
68
+ snap_in_slug: 'test_snap_in_slug',
69
+ snap_in_version_id: 'test_snap_in_version_id',
70
+ sync_tier: 'test_sync_tier',
71
+ sync_unit: 'test_sync_unit',
72
+ sync_unit_id: 'test_sync_unit_id',
73
+ worker_data_url: `${mockServerUrl}/worker_data_url`,
74
+ },
75
+ event_type: extraction_1.EventType.StartExtractingData,
76
+ event_data: {},
77
+ },
78
+ execution_metadata: {
79
+ devrev_endpoint: mockServerUrl,
80
+ },
81
+ input_data: {
82
+ global_values: {},
83
+ event_sources: {},
84
+ },
85
+ };
86
+ const merged = deepMerge(base, overrides);
87
+ // Ensure mock server URLs always win over overrides, unless the caller
88
+ // explicitly provided them.
89
+ if (!((_b = (_a = overrides.payload) === null || _a === void 0 ? void 0 : _a.event_context) === null || _b === void 0 ? void 0 : _b.callback_url)) {
90
+ merged.payload.event_context.callback_url = `${mockServerUrl}/callback_url`;
91
+ }
92
+ if (!((_d = (_c = overrides.payload) === null || _c === void 0 ? void 0 : _c.event_context) === null || _d === void 0 ? void 0 : _d.worker_data_url)) {
93
+ merged.payload.event_context.worker_data_url = `${mockServerUrl}/worker_data_url`;
94
+ }
95
+ return merged;
96
+ }
@@ -0,0 +1,31 @@
1
+ import { RequestInfo, RouteConfig } from './mock-server.interfaces';
2
+ export declare const MOCK_SERVER_DEFAULT_URL = "http://localhost:0";
3
+ /**
4
+ * Mocks internal AirSync endpoints in tests, with per-test route
5
+ * configuration to simulate different response scenarios.
6
+ */
7
+ export declare class MockServer {
8
+ private server;
9
+ private internalPort;
10
+ port: number;
11
+ baseUrl: string;
12
+ private routeHandlers;
13
+ private requests;
14
+ private requestCounts;
15
+ constructor(port?: number);
16
+ start(): Promise<void>;
17
+ stop(): Promise<void>;
18
+ private handleRequest;
19
+ /** Falls back to { success: true } for routes not explicitly set. */
20
+ private defaultRouteHandler;
21
+ private getRouteKey;
22
+ setRoute(config: RouteConfig): void;
23
+ /** Restores default handlers and clears request tracking data. */
24
+ resetRoutes(): void;
25
+ getLastRequest(): RequestInfo | undefined;
26
+ /** POST requests to the platform callback URL, i.e. emitted events. */
27
+ getCallbackRequests(): RequestInfo[];
28
+ getRequestCount(method: string, path: string): number;
29
+ getRequests(method: string, path: string): RequestInfo[];
30
+ }
31
+ //# sourceMappingURL=mock-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-server.d.ts","sourceRoot":"","sources":["../../src/testing/mock-server.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,WAAW,EACX,WAAW,EAEZ,MAAM,0BAA0B,CAAC;AAIlC,eAAO,MAAM,uBAAuB,uBAAuB,CAAC;AAsE5D;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,YAAY,CAAS;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,aAAa,CAA4B;gBAErC,IAAI,GAAE,MAAiC;IAMtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAkBpB,aAAa;IA+B3B,qEAAqE;IACrE,OAAO,CAAC,mBAAmB;IA6B3B,OAAO,CAAC,WAAW;IAIZ,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IA+G1C,kEAAkE;IAC3D,WAAW,IAAI,IAAI;IAMnB,cAAc,IAAI,WAAW,GAAG,SAAS;IAOhD,uEAAuE;IAChE,mBAAmB,IAAI,WAAW,EAAE;IAOpC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAIrD,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE;CAQhE"}