@devrev/airsync-sdk 2.0.0-beta.1 → 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.
- package/README.md +7 -21
- package/dist/attachments-streaming/attachments-streaming-pool.d.ts +6 -7
- package/dist/attachments-streaming/attachments-streaming-pool.d.ts.map +1 -1
- package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts +4 -3
- package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts.map +1 -1
- package/dist/attachments-streaming/attachments-streaming-pool.js +69 -61
- package/dist/common/constants.d.ts +15 -12
- package/dist/common/constants.d.ts.map +1 -1
- package/dist/common/constants.js +20 -34
- package/dist/common/helpers.d.ts +3 -27
- package/dist/common/helpers.d.ts.map +1 -1
- package/dist/common/helpers.js +6 -36
- package/dist/http/{axios-client-internal.d.ts → client.d.ts} +1 -1
- package/dist/http/client.d.ts.map +1 -0
- package/dist/http/{axios-client-internal.js → client.js} +7 -4
- package/dist/http/errors.d.ts +8 -0
- package/dist/http/errors.d.ts.map +1 -0
- package/dist/http/errors.js +31 -0
- package/dist/index.d.ts +30 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +47 -28
- package/dist/logger/logger.d.ts +13 -70
- package/dist/logger/logger.d.ts.map +1 -1
- package/dist/logger/logger.interfaces.d.ts +4 -7
- package/dist/logger/logger.interfaces.d.ts.map +1 -1
- package/dist/logger/logger.js +67 -92
- package/dist/mappers/mappers.d.ts +10 -43
- package/dist/mappers/mappers.d.ts.map +1 -1
- package/dist/mappers/mappers.interfaces.d.ts +173 -0
- package/dist/mappers/mappers.interfaces.d.ts.map +1 -0
- package/dist/mappers/{mappers.interface.js → mappers.interfaces.js} +1 -10
- package/dist/mappers/mappers.js +32 -46
- package/dist/multithreading/adapters/base-adapter.d.ts +39 -0
- package/dist/multithreading/adapters/base-adapter.d.ts.map +1 -0
- package/dist/multithreading/adapters/base-adapter.js +212 -0
- package/dist/multithreading/adapters/extraction-adapter.d.ts +49 -0
- package/dist/multithreading/adapters/extraction-adapter.d.ts.map +1 -0
- package/dist/multithreading/adapters/extraction-adapter.js +375 -0
- package/dist/multithreading/adapters/loading-adapter.d.ts +26 -0
- package/dist/multithreading/adapters/loading-adapter.d.ts.map +1 -0
- package/dist/multithreading/adapters/loading-adapter.helpers.d.ts +12 -0
- package/dist/multithreading/adapters/loading-adapter.helpers.d.ts.map +1 -0
- package/dist/multithreading/{worker-adapter/worker-adapter.helpers.js → adapters/loading-adapter.helpers.js} +2 -12
- package/dist/multithreading/adapters/loading-adapter.js +279 -0
- package/dist/multithreading/emit.d.ts +11 -0
- package/dist/multithreading/emit.d.ts.map +1 -0
- package/dist/multithreading/emit.js +25 -0
- package/dist/multithreading/process-task.d.ts +6 -1
- package/dist/multithreading/process-task.d.ts.map +1 -1
- package/dist/multithreading/process-task.js +120 -82
- package/dist/multithreading/spawn/spawn.d.ts +10 -11
- package/dist/multithreading/spawn/spawn.d.ts.map +1 -1
- package/dist/multithreading/spawn/spawn.helpers.d.ts +12 -11
- package/dist/multithreading/spawn/spawn.helpers.d.ts.map +1 -1
- package/dist/multithreading/spawn/spawn.helpers.js +142 -77
- package/dist/multithreading/spawn/spawn.js +59 -75
- package/dist/multithreading/worker.js +16 -5
- package/dist/repo/repo.d.ts +14 -5
- package/dist/repo/repo.d.ts.map +1 -1
- package/dist/repo/repo.helpers.d.ts +6 -0
- package/dist/repo/repo.helpers.d.ts.map +1 -0
- package/dist/repo/repo.helpers.js +16 -0
- package/dist/repo/repo.interfaces.d.ts +11 -20
- package/dist/repo/repo.interfaces.d.ts.map +1 -1
- package/dist/repo/repo.js +36 -22
- package/dist/state/base-state.d.ts +58 -0
- package/dist/state/base-state.d.ts.map +1 -0
- package/dist/state/base-state.js +242 -0
- package/dist/state/extraction-state.d.ts +14 -0
- package/dist/state/extraction-state.d.ts.map +1 -0
- package/dist/state/extraction-state.js +140 -0
- package/dist/state/install-initial-domain-mapping.d.ts +4 -0
- package/dist/state/install-initial-domain-mapping.d.ts.map +1 -0
- package/dist/{common → state}/install-initial-domain-mapping.js +5 -7
- package/dist/state/loading-state.d.ts +8 -0
- package/dist/state/loading-state.d.ts.map +1 -0
- package/dist/state/loading-state.js +29 -0
- package/dist/state/state.d.ts +3 -29
- package/dist/state/state.d.ts.map +1 -1
- package/dist/state/state.interfaces.d.ts +31 -12
- package/dist/state/state.interfaces.d.ts.map +1 -1
- package/dist/state/state.interfaces.js +17 -1
- package/dist/state/state.js +9 -164
- package/dist/state/time-value-resolver.d.ts +17 -0
- package/dist/state/time-value-resolver.d.ts.map +1 -0
- package/dist/state/time-value-resolver.js +110 -0
- package/dist/testing/mock-event.d.ts +10 -0
- package/dist/testing/mock-event.d.ts.map +1 -0
- package/dist/testing/mock-event.js +96 -0
- package/dist/testing/mock-server.d.ts +31 -0
- package/dist/testing/mock-server.d.ts.map +1 -0
- package/dist/testing/mock-server.interfaces.d.ts +54 -0
- package/dist/testing/mock-server.interfaces.d.ts.map +1 -0
- package/dist/testing/mock-server.interfaces.js +4 -0
- package/dist/testing/mock-server.js +297 -0
- package/dist/testing/test-adapters.d.ts +22 -0
- package/dist/testing/test-adapters.d.ts.map +1 -0
- package/dist/testing/test-adapters.js +32 -0
- package/dist/types/common.d.ts +4 -37
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/common.js +2 -17
- package/dist/types/errors.d.ts +15 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +28 -0
- package/dist/types/external-domain-metadata.d.ts +40 -162
- package/dist/types/external-domain-metadata.d.ts.map +1 -1
- package/dist/types/extraction.d.ts +135 -278
- package/dist/types/extraction.d.ts.map +1 -1
- package/dist/types/extraction.js +46 -133
- package/dist/types/loading.d.ts +15 -55
- package/dist/types/loading.d.ts.map +1 -1
- package/dist/types/loading.js +1 -23
- package/dist/types/workers.d.ts +70 -103
- package/dist/types/workers.d.ts.map +1 -1
- package/dist/types/workers.js +1 -6
- package/dist/uploader/uploader.d.ts +10 -61
- package/dist/uploader/uploader.d.ts.map +1 -1
- package/dist/uploader/uploader.helpers.d.ts +7 -27
- package/dist/uploader/uploader.helpers.d.ts.map +1 -1
- package/dist/uploader/uploader.helpers.js +80 -30
- package/dist/uploader/uploader.interfaces.d.ts +19 -54
- package/dist/uploader/uploader.interfaces.d.ts.map +1 -1
- package/dist/uploader/uploader.interfaces.js +8 -0
- package/dist/uploader/uploader.js +72 -124
- package/docs/MIGRATION.md +696 -0
- package/package.json +35 -22
- package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts +0 -2
- package/dist/attachments-streaming/attachments-streaming-pool.test.d.ts.map +0 -1
- package/dist/attachments-streaming/attachments-streaming-pool.test.js +0 -321
- package/dist/common/control-protocol.d.ts +0 -10
- package/dist/common/control-protocol.d.ts.map +0 -1
- package/dist/common/control-protocol.js +0 -31
- package/dist/common/errors.d.ts +0 -6
- package/dist/common/errors.d.ts.map +0 -1
- package/dist/common/errors.js +0 -4
- package/dist/common/event-type-translation.d.ts +0 -24
- package/dist/common/event-type-translation.d.ts.map +0 -1
- package/dist/common/event-type-translation.js +0 -117
- package/dist/common/install-initial-domain-mapping.d.ts +0 -4
- package/dist/common/install-initial-domain-mapping.d.ts.map +0 -1
- package/dist/common/install-initial-domain-mapping.test.d.ts +0 -2
- package/dist/common/install-initial-domain-mapping.test.d.ts.map +0 -1
- package/dist/common/install-initial-domain-mapping.test.js +0 -208
- package/dist/deprecated/adapter/index.d.ts +0 -62
- package/dist/deprecated/adapter/index.d.ts.map +0 -1
- package/dist/deprecated/adapter/index.js +0 -151
- package/dist/deprecated/common/helpers.d.ts +0 -7
- package/dist/deprecated/common/helpers.d.ts.map +0 -1
- package/dist/deprecated/common/helpers.js +0 -47
- package/dist/deprecated/demo-extractor/external_domain_metadata.json +0 -38
- package/dist/deprecated/demo-extractor/index.d.ts +0 -18
- package/dist/deprecated/demo-extractor/index.d.ts.map +0 -1
- package/dist/deprecated/demo-extractor/index.js +0 -161
- package/dist/deprecated/http/client.d.ts +0 -22
- package/dist/deprecated/http/client.d.ts.map +0 -1
- package/dist/deprecated/http/client.js +0 -161
- package/dist/deprecated/uploader/index.d.ts +0 -35
- package/dist/deprecated/uploader/index.d.ts.map +0 -1
- package/dist/deprecated/uploader/index.js +0 -161
- package/dist/http/axios-client-internal.d.ts.map +0 -1
- package/dist/http/axios-client-internal.test.d.ts +0 -2
- package/dist/http/axios-client-internal.test.d.ts.map +0 -1
- package/dist/http/axios-client-internal.test.js +0 -154
- package/dist/http/axios-client.d.ts +0 -27
- package/dist/http/axios-client.d.ts.map +0 -1
- package/dist/http/axios-client.js +0 -57
- package/dist/http/constants.d.ts +0 -4
- package/dist/http/constants.d.ts.map +0 -1
- package/dist/http/constants.js +0 -6
- package/dist/http/index.d.ts +0 -3
- package/dist/http/index.d.ts.map +0 -1
- package/dist/http/index.js +0 -18
- package/dist/http/types.d.ts +0 -17
- package/dist/http/types.d.ts.map +0 -1
- package/dist/http/types.js +0 -2
- package/dist/logger/logger.constants.d.ts +0 -6
- package/dist/logger/logger.constants.d.ts.map +0 -1
- package/dist/logger/logger.constants.js +0 -13
- package/dist/logger/logger.context.d.ts +0 -58
- package/dist/logger/logger.context.d.ts.map +0 -1
- package/dist/logger/logger.context.js +0 -86
- package/dist/logger/logger.test.d.ts +0 -2
- package/dist/logger/logger.test.d.ts.map +0 -1
- package/dist/logger/logger.test.js +0 -490
- package/dist/mappers/mappers.interface.d.ts +0 -294
- package/dist/mappers/mappers.interface.d.ts.map +0 -1
- package/dist/mappers/mappers.test.d.ts +0 -2
- package/dist/mappers/mappers.test.d.ts.map +0 -1
- package/dist/mappers/mappers.test.js +0 -107
- package/dist/multithreading/create-worker.test.d.ts +0 -2
- package/dist/multithreading/create-worker.test.d.ts.map +0 -1
- package/dist/multithreading/create-worker.test.js +0 -89
- package/dist/multithreading/spawn/spawn.helpers.test.d.ts +0 -2
- package/dist/multithreading/spawn/spawn.helpers.test.d.ts.map +0 -1
- package/dist/multithreading/spawn/spawn.helpers.test.js +0 -293
- package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.d.ts +0 -2
- package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.d.ts.map +0 -1
- package/dist/multithreading/worker-adapter/worker-adapter.artifacts.test.js +0 -127
- package/dist/multithreading/worker-adapter/worker-adapter.d.ts +0 -91
- package/dist/multithreading/worker-adapter/worker-adapter.d.ts.map +0 -1
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.d.ts +0 -22
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.d.ts.map +0 -1
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.d.ts +0 -2
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.d.ts.map +0 -1
- package/dist/multithreading/worker-adapter/worker-adapter.helpers.test.js +0 -514
- package/dist/multithreading/worker-adapter/worker-adapter.js +0 -745
- package/dist/multithreading/worker-adapter/worker-adapter.test.d.ts +0 -2
- package/dist/multithreading/worker-adapter/worker-adapter.test.d.ts.map +0 -1
- package/dist/multithreading/worker-adapter/worker-adapter.test.js +0 -483
- package/dist/repo/repo.test.d.ts +0 -2
- package/dist/repo/repo.test.d.ts.map +0 -1
- package/dist/repo/repo.test.js +0 -131
- package/dist/state/state.test.d.ts +0 -2
- package/dist/state/state.test.d.ts.map +0 -1
- package/dist/state/state.test.js +0 -224
- package/dist/types/extraction.test.d.ts +0 -2
- package/dist/types/extraction.test.d.ts.map +0 -1
- package/dist/types/extraction.test.js +0 -70
- package/dist/types/index.d.ts +0 -10
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -18
- package/dist/uploader/uploader.helpers.test.d.ts +0 -2
- package/dist/uploader/uploader.helpers.test.d.ts.map +0 -1
- package/dist/uploader/uploader.helpers.test.js +0 -267
- package/dist/uploader/uploader.test.d.ts +0 -2
- package/dist/uploader/uploader.test.d.ts.map +0 -1
- package/dist/uploader/uploader.test.js +0 -589
|
@@ -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
|
+
}
|
package/dist/state/state.d.ts
CHANGED
|
@@ -1,30 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
export
|
|
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":"
|
|
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,47 +1,64 @@
|
|
|
1
1
|
import { InitialDomainMapping } from '../types/common';
|
|
2
|
-
import {
|
|
2
|
+
import { AirSyncEvent } from '../types/extraction';
|
|
3
3
|
import { FileToLoad } from '../types/loading';
|
|
4
|
-
import {
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
30
|
lastProcessedAttachmentsIdsList?: ProcessedAttachment[];
|
|
22
31
|
};
|
|
23
32
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
33
|
+
export declare enum ProcessedAttachmentStatus {
|
|
34
|
+
Success = "success",
|
|
35
|
+
Failed = "failed"
|
|
36
|
+
}
|
|
37
|
+
/** id + parent_id identify an attachment for SDK-side deduplication. */
|
|
27
38
|
export interface ProcessedAttachment {
|
|
28
39
|
id: string;
|
|
29
40
|
parent_id: string;
|
|
41
|
+
status: ProcessedAttachmentStatus;
|
|
30
42
|
}
|
|
31
43
|
export interface FromDevRev {
|
|
32
44
|
filesToLoad: FileToLoad[];
|
|
33
45
|
}
|
|
34
46
|
export interface StateInterface<ConnectorState> {
|
|
35
|
-
event:
|
|
47
|
+
event: AirSyncEvent;
|
|
36
48
|
initialState: ConnectorState;
|
|
37
49
|
initialDomainMapping?: InitialDomainMapping;
|
|
38
|
-
options?:
|
|
50
|
+
options?: RuntimeOptions;
|
|
39
51
|
}
|
|
40
52
|
export declare const extractionSdkState: {
|
|
41
53
|
lastSyncStarted: string;
|
|
42
54
|
lastSuccessfulSyncStarted: string;
|
|
55
|
+
pendingWorkersOldest: string;
|
|
56
|
+
pendingWorkersNewest: string;
|
|
57
|
+
workersOldest: string;
|
|
58
|
+
workersNewest: string;
|
|
43
59
|
snapInVersionId: string;
|
|
44
60
|
toDevRev: {
|
|
61
|
+
deferredSsorArtifacts: never[];
|
|
45
62
|
attachmentsMetadata: {
|
|
46
63
|
artifactIds: never[];
|
|
47
64
|
lastProcessed: number;
|
|
@@ -55,4 +72,6 @@ export declare const loadingSdkState: {
|
|
|
55
72
|
filesToLoad: never[];
|
|
56
73
|
};
|
|
57
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>;
|
|
58
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,
|
|
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
|
+
]);
|
package/dist/state/state.js
CHANGED
|
@@ -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.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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"}
|