@devrev/airsync-sdk 2.0.0-beta.2 → 2.0.0-beta.4
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 +5 -11
- package/dist/attachments-streaming/attachments-streaming-pool.d.ts +1 -8
- 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 +11 -39
- package/dist/common/constants.d.ts +1 -0
- package/dist/common/constants.d.ts.map +1 -1
- package/dist/common/constants.js +2 -1
- package/dist/common/helpers.d.ts +0 -14
- package/dist/common/helpers.d.ts.map +1 -1
- package/dist/common/helpers.js +0 -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/index.d.ts +25 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -30
- package/dist/logger/logger.d.ts +14 -0
- package/dist/logger/logger.d.ts.map +1 -1
- package/dist/logger/logger.js +55 -8
- package/dist/mappers/mappers.d.ts +9 -10
- package/dist/mappers/mappers.d.ts.map +1 -1
- package/dist/mappers/{mappers.interface.d.ts → mappers.interfaces.d.ts} +5 -5
- package/dist/mappers/mappers.interfaces.d.ts.map +1 -0
- package/dist/mappers/{mappers.interface.js → mappers.interfaces.js} +3 -3
- package/dist/mappers/mappers.js +13 -9
- package/dist/multithreading/adapters/base-adapter.d.ts +71 -0
- package/dist/multithreading/adapters/base-adapter.d.ts.map +1 -0
- package/dist/multithreading/adapters/base-adapter.js +138 -0
- package/dist/multithreading/adapters/extraction-adapter.d.ts +57 -0
- package/dist/multithreading/adapters/extraction-adapter.d.ts.map +1 -0
- package/dist/multithreading/adapters/extraction-adapter.js +323 -0
- package/dist/multithreading/adapters/loading-adapter.d.ts +44 -0
- package/dist/multithreading/adapters/loading-adapter.d.ts.map +1 -0
- package/dist/multithreading/{worker-adapter/worker-adapter.helpers.d.ts → adapters/loading-adapter.helpers.d.ts} +1 -1
- package/dist/multithreading/adapters/loading-adapter.helpers.d.ts.map +1 -0
- package/dist/multithreading/adapters/loading-adapter.js +431 -0
- package/dist/{common/control-protocol.d.ts → multithreading/emit.d.ts} +1 -1
- package/dist/multithreading/emit.d.ts.map +1 -0
- package/dist/{common/control-protocol.js → multithreading/emit.js} +3 -3
- package/dist/multithreading/process-task.d.ts +16 -1
- package/dist/multithreading/process-task.d.ts.map +1 -1
- package/dist/multithreading/process-task.js +115 -50
- package/dist/multithreading/spawn/spawn.helpers.d.ts +23 -3
- package/dist/multithreading/spawn/spawn.helpers.d.ts.map +1 -1
- package/dist/multithreading/spawn/spawn.helpers.js +152 -2
- package/dist/multithreading/spawn/spawn.js +7 -7
- package/dist/multithreading/worker.js +1 -2
- package/dist/repo/repo.js +2 -2
- package/dist/state/base-state.d.ts +75 -0
- package/dist/state/base-state.d.ts.map +1 -0
- package/dist/state/base-state.js +261 -0
- package/dist/state/extraction-state.d.ts +29 -0
- package/dist/state/extraction-state.d.ts.map +1 -0
- package/dist/state/extraction-state.js +122 -0
- package/dist/state/install-initial-domain-mapping.d.ts.map +1 -0
- package/dist/{common → state}/install-initial-domain-mapping.js +4 -4
- package/dist/state/loading-state.d.ts +18 -0
- package/dist/state/loading-state.d.ts.map +1 -0
- package/dist/state/loading-state.js +39 -0
- package/dist/state/state.d.ts +3 -35
- package/dist/state/state.d.ts.map +1 -1
- package/dist/state/state.interfaces.d.ts +20 -3
- package/dist/state/state.interfaces.d.ts.map +1 -1
- package/dist/state/state.interfaces.js +19 -1
- package/dist/state/state.js +9 -263
- package/dist/{common → state}/time-value-resolver.d.ts +4 -5
- package/dist/state/time-value-resolver.d.ts.map +1 -0
- package/dist/{common → state}/time-value-resolver.js +9 -8
- package/dist/{common/test-utils.d.ts → testing/mock-event.d.ts} +1 -2
- package/dist/testing/mock-event.d.ts.map +1 -0
- package/dist/{common/test-utils.js → testing/mock-event.js} +14 -3
- package/dist/{mock-server → testing}/mock-server.d.ts +5 -0
- package/dist/testing/mock-server.d.ts.map +1 -0
- package/dist/testing/mock-server.interfaces.d.ts.map +1 -0
- package/dist/{mock-server → testing}/mock-server.js +6 -1
- package/dist/types/errors.d.ts +9 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/extraction.d.ts +73 -18
- package/dist/types/extraction.d.ts.map +1 -1
- package/dist/types/extraction.js +4 -6
- package/dist/types/loading.d.ts +1 -2
- package/dist/types/loading.d.ts.map +1 -1
- package/dist/types/loading.js +0 -1
- package/dist/types/workers.d.ts +64 -20
- package/dist/types/workers.d.ts.map +1 -1
- package/dist/uploader/uploader.d.ts +5 -4
- package/dist/uploader/uploader.d.ts.map +1 -1
- package/dist/uploader/uploader.interfaces.d.ts +1 -1
- package/dist/uploader/uploader.js +10 -10
- package/package.json +3 -3
- package/dist/airsync-sdk.d.ts +0 -1802
- 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 -516
- package/dist/common/control-protocol.d.ts.map +0 -1
- package/dist/common/errors.d.ts +0 -6
- package/dist/common/errors.d.ts.map +0 -1
- 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 -211
- package/dist/common/test-utils.d.ts.map +0 -1
- package/dist/common/time-value-resolver.d.ts.map +0 -1
- package/dist/common/time-value-resolver.test.d.ts +0 -2
- package/dist/common/time-value-resolver.test.d.ts.map +0 -1
- package/dist/common/time-value-resolver.test.js +0 -268
- 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 -175
- 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 -60
- 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 -2
- package/dist/http/index.d.ts.map +0 -1
- package/dist/http/index.js +0 -17
- 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 -537
- 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 -105
- package/dist/mock-server/mock-server.d.ts.map +0 -1
- package/dist/mock-server/mock-server.interfaces.d.ts.map +0 -1
- 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 -108
- package/dist/multithreading/process-task.test.d.ts +0 -2
- package/dist/multithreading/process-task.test.d.ts.map +0 -1
- package/dist/multithreading/process-task.test.js +0 -146
- 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/spawn/spawn.test.d.ts +0 -2
- package/dist/multithreading/spawn/spawn.test.d.ts.map +0 -1
- package/dist/multithreading/spawn/spawn.test.js +0 -232
- 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 -175
- package/dist/multithreading/worker-adapter/worker-adapter.d.ts +0 -97
- package/dist/multithreading/worker-adapter/worker-adapter.d.ts.map +0 -1
- package/dist/multithreading/worker-adapter/worker-adapter.emit.test.d.ts +0 -2
- package/dist/multithreading/worker-adapter/worker-adapter.emit.test.d.ts.map +0 -1
- package/dist/multithreading/worker-adapter/worker-adapter.emit.test.js +0 -390
- package/dist/multithreading/worker-adapter/worker-adapter.extraction.test.d.ts +0 -2
- package/dist/multithreading/worker-adapter/worker-adapter.extraction.test.d.ts.map +0 -1
- package/dist/multithreading/worker-adapter/worker-adapter.extraction.test.js +0 -799
- 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 -846
- package/dist/multithreading/worker-adapter/worker-adapter.loading.test.d.ts +0 -2
- package/dist/multithreading/worker-adapter/worker-adapter.loading.test.d.ts.map +0 -1
- package/dist/multithreading/worker-adapter/worker-adapter.loading.test.js +0 -596
- package/dist/multithreading/worker-adapter/worker-adapter.serialization.test.d.ts +0 -2
- package/dist/multithreading/worker-adapter/worker-adapter.serialization.test.d.ts.map +0 -1
- package/dist/multithreading/worker-adapter/worker-adapter.serialization.test.js +0 -71
- 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 -184
- package/dist/state/state.extract-window.test.d.ts +0 -2
- package/dist/state/state.extract-window.test.d.ts.map +0 -1
- package/dist/state/state.extract-window.test.js +0 -163
- package/dist/state/state.pending-boundaries.test.d.ts +0 -2
- package/dist/state/state.pending-boundaries.test.d.ts.map +0 -1
- package/dist/state/state.pending-boundaries.test.js +0 -189
- package/dist/state/state.post-state.test.d.ts +0 -2
- package/dist/state/state.post-state.test.d.ts.map +0 -1
- package/dist/state/state.post-state.test.js +0 -77
- 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 -268
- package/dist/state/state.time-value-resolution.test.d.ts +0 -2
- package/dist/state/state.time-value-resolution.test.d.ts.map +0 -1
- package/dist/state/state.time-value-resolution.test.js +0 -175
- package/dist/tsdoc-metadata.json +0 -11
- 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 -96
- package/dist/types/index.d.ts +0 -11
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -21
- 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 -256
- 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 -601
- /package/dist/http/{axios-client-internal.js → client.js} +0 -0
- /package/dist/multithreading/{worker-adapter/worker-adapter.helpers.js → adapters/loading-adapter.helpers.js} +0 -0
- /package/dist/{common → state}/install-initial-domain-mapping.d.ts +0 -0
- /package/dist/{mock-server → testing}/mock-server.interfaces.d.ts +0 -0
- /package/dist/{mock-server → testing}/mock-server.interfaces.js +0 -0
- /package/dist/{common → types}/errors.js +0 -0
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
import { EventType, ExtractorEventType } from '../../types/extraction';
|
|
2
2
|
import { LoaderEventType } from '../../types/loading';
|
|
3
|
+
import { TaskStatus } from '../../types/workers';
|
|
4
|
+
/**
|
|
5
|
+
* Resolves the outgoing event type the SDK should emit for a given incoming
|
|
6
|
+
* event type and the {@link TaskResult} status a worker returned.
|
|
7
|
+
*
|
|
8
|
+
* The mapping follows the per-phase contract documented on `TaskResult`:
|
|
9
|
+
* resumable phases (data/attachment extraction, data/attachment loading) honor
|
|
10
|
+
* every status (success -> *_DONE, progress -> *_PROGRESS, delay -> *_DELAYED,
|
|
11
|
+
* error -> *_ERROR); non-resumable phases (external sync units, metadata, state
|
|
12
|
+
* deletion) only have a done and an error event, so a `progress`/`delay` status
|
|
13
|
+
* there is illegal and is mapped to the phase's error event.
|
|
14
|
+
*
|
|
15
|
+
* @param eventType - The incoming event type that started this worker.
|
|
16
|
+
* @param status - The status the worker's task/onTimeout returned.
|
|
17
|
+
* @returns The outgoing extractor/loader event type to emit, plus whether the
|
|
18
|
+
* status was illegal for the phase (so the caller can attach a descriptive
|
|
19
|
+
* error message).
|
|
20
|
+
*/
|
|
21
|
+
export declare function getEventTypeForResult(eventType: EventType, status: TaskStatus): {
|
|
22
|
+
eventType: ExtractorEventType | LoaderEventType;
|
|
23
|
+
illegal: boolean;
|
|
24
|
+
};
|
|
3
25
|
/**
|
|
4
26
|
* Gets the event type for the timeout error.
|
|
5
27
|
* @param {EventType} eventType - The event type to get the timeout error event type for
|
|
@@ -14,8 +36,6 @@ export declare function getTimeoutErrorEventType(eventType: EventType): {
|
|
|
14
36
|
* @returns {ExtractorEventType | LoaderEventType} The event type for the no script error
|
|
15
37
|
*/
|
|
16
38
|
export declare function getNoScriptEventType(eventType: EventType): {
|
|
17
|
-
eventType: ExtractorEventType;
|
|
18
|
-
} | {
|
|
19
|
-
eventType: LoaderEventType;
|
|
39
|
+
eventType: ExtractorEventType | LoaderEventType;
|
|
20
40
|
};
|
|
21
41
|
//# sourceMappingURL=spawn.helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spawn.helpers.d.ts","sourceRoot":"","sources":["../../../src/multithreading/spawn/spawn.helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"spawn.helpers.d.ts","sourceRoot":"","sources":["../../../src/multithreading/spawn/spawn.helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,UAAU,GACjB;IACD,SAAS,EAAE,kBAAkB,GAAG,eAAe,CAAC;IAChD,OAAO,EAAE,OAAO,CAAC;CAClB,CAiCA;AAoHD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,SAAS,GAAG;IAC9D,SAAS,EAAE,kBAAkB,GAAG,eAAe,CAAC;CACjD,CA2EA;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS;eAwBhB,kBAAkB,GAAG,eAAe;EAG5E"}
|
|
@@ -1,9 +1,159 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getEventTypeForResult = getEventTypeForResult;
|
|
3
4
|
exports.getTimeoutErrorEventType = getTimeoutErrorEventType;
|
|
4
5
|
exports.getNoScriptEventType = getNoScriptEventType;
|
|
6
|
+
const constants_1 = require("../../common/constants");
|
|
5
7
|
const extraction_1 = require("../../types/extraction");
|
|
6
8
|
const loading_1 = require("../../types/loading");
|
|
9
|
+
/**
|
|
10
|
+
* Resolves the outgoing event type the SDK should emit for a given incoming
|
|
11
|
+
* event type and the {@link TaskResult} status a worker returned.
|
|
12
|
+
*
|
|
13
|
+
* The mapping follows the per-phase contract documented on `TaskResult`:
|
|
14
|
+
* resumable phases (data/attachment extraction, data/attachment loading) honor
|
|
15
|
+
* every status (success -> *_DONE, progress -> *_PROGRESS, delay -> *_DELAYED,
|
|
16
|
+
* error -> *_ERROR); non-resumable phases (external sync units, metadata, state
|
|
17
|
+
* deletion) only have a done and an error event, so a `progress`/`delay` status
|
|
18
|
+
* there is illegal and is mapped to the phase's error event.
|
|
19
|
+
*
|
|
20
|
+
* @param eventType - The incoming event type that started this worker.
|
|
21
|
+
* @param status - The status the worker's task/onTimeout returned.
|
|
22
|
+
* @returns The outgoing extractor/loader event type to emit, plus whether the
|
|
23
|
+
* status was illegal for the phase (so the caller can attach a descriptive
|
|
24
|
+
* error message).
|
|
25
|
+
*/
|
|
26
|
+
function getEventTypeForResult(eventType, status) {
|
|
27
|
+
const phase = EVENT_PHASE_MAP[eventType];
|
|
28
|
+
if (!phase) {
|
|
29
|
+
console.error('Event type not recognized in getEventTypeForResult function: ' +
|
|
30
|
+
eventType);
|
|
31
|
+
return {
|
|
32
|
+
eventType: constants_1.UNKNOWN_EVENT_TYPE,
|
|
33
|
+
illegal: true,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// Non-resumable phases only define done/error events.
|
|
37
|
+
if (!phase.resumable) {
|
|
38
|
+
if (status === 'success') {
|
|
39
|
+
return { eventType: phase.done, illegal: false };
|
|
40
|
+
}
|
|
41
|
+
// progress/delay are illegal here; collapse them (and error) to the error event.
|
|
42
|
+
return { eventType: phase.error, illegal: status !== 'error' };
|
|
43
|
+
}
|
|
44
|
+
switch (status) {
|
|
45
|
+
case 'success':
|
|
46
|
+
return { eventType: phase.done, illegal: false };
|
|
47
|
+
case 'progress':
|
|
48
|
+
return { eventType: phase.progress, illegal: false };
|
|
49
|
+
case 'delay':
|
|
50
|
+
return { eventType: phase.delayed, illegal: false };
|
|
51
|
+
case 'error':
|
|
52
|
+
return { eventType: phase.error, illegal: false };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Per-phase outgoing event types, keyed by the incoming {@link EventType}.
|
|
57
|
+
* `resumable` phases define progress/delayed events; non-resumable ones do not.
|
|
58
|
+
*/
|
|
59
|
+
const EVENT_PHASE_MAP = {
|
|
60
|
+
// External sync units (non-resumable)
|
|
61
|
+
[extraction_1.EventType.StartExtractingExternalSyncUnits]: {
|
|
62
|
+
resumable: false,
|
|
63
|
+
done: extraction_1.ExtractorEventType.ExternalSyncUnitExtractionDone,
|
|
64
|
+
error: extraction_1.ExtractorEventType.ExternalSyncUnitExtractionError,
|
|
65
|
+
},
|
|
66
|
+
// Metadata (non-resumable)
|
|
67
|
+
[extraction_1.EventType.StartExtractingMetadata]: {
|
|
68
|
+
resumable: false,
|
|
69
|
+
done: extraction_1.ExtractorEventType.MetadataExtractionDone,
|
|
70
|
+
error: extraction_1.ExtractorEventType.MetadataExtractionError,
|
|
71
|
+
},
|
|
72
|
+
// Data extraction (resumable)
|
|
73
|
+
[extraction_1.EventType.StartExtractingData]: {
|
|
74
|
+
resumable: true,
|
|
75
|
+
done: extraction_1.ExtractorEventType.DataExtractionDone,
|
|
76
|
+
error: extraction_1.ExtractorEventType.DataExtractionError,
|
|
77
|
+
progress: extraction_1.ExtractorEventType.DataExtractionProgress,
|
|
78
|
+
delayed: extraction_1.ExtractorEventType.DataExtractionDelayed,
|
|
79
|
+
},
|
|
80
|
+
[extraction_1.EventType.ContinueExtractingData]: {
|
|
81
|
+
resumable: true,
|
|
82
|
+
done: extraction_1.ExtractorEventType.DataExtractionDone,
|
|
83
|
+
error: extraction_1.ExtractorEventType.DataExtractionError,
|
|
84
|
+
progress: extraction_1.ExtractorEventType.DataExtractionProgress,
|
|
85
|
+
delayed: extraction_1.ExtractorEventType.DataExtractionDelayed,
|
|
86
|
+
},
|
|
87
|
+
// Extractor state deletion (non-resumable)
|
|
88
|
+
[extraction_1.EventType.StartDeletingExtractorState]: {
|
|
89
|
+
resumable: false,
|
|
90
|
+
done: extraction_1.ExtractorEventType.ExtractorStateDeletionDone,
|
|
91
|
+
error: extraction_1.ExtractorEventType.ExtractorStateDeletionError,
|
|
92
|
+
},
|
|
93
|
+
// Attachment extraction (resumable)
|
|
94
|
+
[extraction_1.EventType.StartExtractingAttachments]: {
|
|
95
|
+
resumable: true,
|
|
96
|
+
done: extraction_1.ExtractorEventType.AttachmentExtractionDone,
|
|
97
|
+
error: extraction_1.ExtractorEventType.AttachmentExtractionError,
|
|
98
|
+
progress: extraction_1.ExtractorEventType.AttachmentExtractionProgress,
|
|
99
|
+
delayed: extraction_1.ExtractorEventType.AttachmentExtractionDelayed,
|
|
100
|
+
},
|
|
101
|
+
[extraction_1.EventType.ContinueExtractingAttachments]: {
|
|
102
|
+
resumable: true,
|
|
103
|
+
done: extraction_1.ExtractorEventType.AttachmentExtractionDone,
|
|
104
|
+
error: extraction_1.ExtractorEventType.AttachmentExtractionError,
|
|
105
|
+
progress: extraction_1.ExtractorEventType.AttachmentExtractionProgress,
|
|
106
|
+
delayed: extraction_1.ExtractorEventType.AttachmentExtractionDelayed,
|
|
107
|
+
},
|
|
108
|
+
// Extractor attachments state deletion (non-resumable)
|
|
109
|
+
[extraction_1.EventType.StartDeletingExtractorAttachmentsState]: {
|
|
110
|
+
resumable: false,
|
|
111
|
+
done: extraction_1.ExtractorEventType.ExtractorAttachmentsStateDeletionDone,
|
|
112
|
+
error: extraction_1.ExtractorEventType.ExtractorAttachmentsStateDeletionError,
|
|
113
|
+
},
|
|
114
|
+
// Data loading (resumable)
|
|
115
|
+
[extraction_1.EventType.StartLoadingData]: {
|
|
116
|
+
resumable: true,
|
|
117
|
+
done: loading_1.LoaderEventType.DataLoadingDone,
|
|
118
|
+
error: loading_1.LoaderEventType.DataLoadingError,
|
|
119
|
+
progress: loading_1.LoaderEventType.DataLoadingProgress,
|
|
120
|
+
delayed: loading_1.LoaderEventType.DataLoadingDelayed,
|
|
121
|
+
},
|
|
122
|
+
[extraction_1.EventType.ContinueLoadingData]: {
|
|
123
|
+
resumable: true,
|
|
124
|
+
done: loading_1.LoaderEventType.DataLoadingDone,
|
|
125
|
+
error: loading_1.LoaderEventType.DataLoadingError,
|
|
126
|
+
progress: loading_1.LoaderEventType.DataLoadingProgress,
|
|
127
|
+
delayed: loading_1.LoaderEventType.DataLoadingDelayed,
|
|
128
|
+
},
|
|
129
|
+
// Attachment loading (resumable)
|
|
130
|
+
[extraction_1.EventType.StartLoadingAttachments]: {
|
|
131
|
+
resumable: true,
|
|
132
|
+
done: loading_1.LoaderEventType.AttachmentLoadingDone,
|
|
133
|
+
error: loading_1.LoaderEventType.AttachmentLoadingError,
|
|
134
|
+
progress: loading_1.LoaderEventType.AttachmentLoadingProgress,
|
|
135
|
+
delayed: loading_1.LoaderEventType.AttachmentLoadingDelayed,
|
|
136
|
+
},
|
|
137
|
+
[extraction_1.EventType.ContinueLoadingAttachments]: {
|
|
138
|
+
resumable: true,
|
|
139
|
+
done: loading_1.LoaderEventType.AttachmentLoadingDone,
|
|
140
|
+
error: loading_1.LoaderEventType.AttachmentLoadingError,
|
|
141
|
+
progress: loading_1.LoaderEventType.AttachmentLoadingProgress,
|
|
142
|
+
delayed: loading_1.LoaderEventType.AttachmentLoadingDelayed,
|
|
143
|
+
},
|
|
144
|
+
// Loader state deletion (non-resumable)
|
|
145
|
+
[extraction_1.EventType.StartDeletingLoaderState]: {
|
|
146
|
+
resumable: false,
|
|
147
|
+
done: loading_1.LoaderEventType.LoaderStateDeletionDone,
|
|
148
|
+
error: loading_1.LoaderEventType.LoaderStateDeletionError,
|
|
149
|
+
},
|
|
150
|
+
// Loader attachment state deletion (non-resumable)
|
|
151
|
+
[extraction_1.EventType.StartDeletingLoaderAttachmentState]: {
|
|
152
|
+
resumable: false,
|
|
153
|
+
done: loading_1.LoaderEventType.LoaderAttachmentStateDeletionDone,
|
|
154
|
+
error: loading_1.LoaderEventType.LoaderAttachmentStateDeletionError,
|
|
155
|
+
},
|
|
156
|
+
};
|
|
7
157
|
/**
|
|
8
158
|
* Gets the event type for the timeout error.
|
|
9
159
|
* @param {EventType} eventType - The event type to get the timeout error event type for
|
|
@@ -69,7 +219,7 @@ function getTimeoutErrorEventType(eventType) {
|
|
|
69
219
|
console.error('Event type not recognized in getTimeoutErrorEventType function: ' +
|
|
70
220
|
eventType);
|
|
71
221
|
return {
|
|
72
|
-
eventType:
|
|
222
|
+
eventType: constants_1.UNKNOWN_EVENT_TYPE,
|
|
73
223
|
};
|
|
74
224
|
}
|
|
75
225
|
}
|
|
@@ -100,7 +250,7 @@ function getNoScriptEventType(eventType) {
|
|
|
100
250
|
console.error('Event type not recognized in getNoScriptEventType function: ' +
|
|
101
251
|
eventType);
|
|
102
252
|
return {
|
|
103
|
-
eventType:
|
|
253
|
+
eventType: constants_1.UNKNOWN_EVENT_TYPE,
|
|
104
254
|
};
|
|
105
255
|
}
|
|
106
256
|
}
|
|
@@ -7,7 +7,7 @@ exports.Spawn = void 0;
|
|
|
7
7
|
exports.spawn = spawn;
|
|
8
8
|
const yargs_1 = __importDefault(require("yargs"));
|
|
9
9
|
const helpers_1 = require("yargs/helpers");
|
|
10
|
-
const
|
|
10
|
+
const emit_1 = require("../emit");
|
|
11
11
|
const helpers_2 = require("../../common/helpers");
|
|
12
12
|
const logger_1 = require("../../logger/logger");
|
|
13
13
|
const extraction_1 = require("../../types/extraction");
|
|
@@ -66,13 +66,13 @@ async function spawn({ event, initialState, initialDomainMapping, options, baseW
|
|
|
66
66
|
if (options === null || options === void 0 ? void 0 : options.isLocalDevelopment) {
|
|
67
67
|
console.log('Snap-in is running in local development mode.');
|
|
68
68
|
}
|
|
69
|
-
const eventType = event.payload.event_type;
|
|
70
69
|
let script = null;
|
|
71
70
|
if (baseWorkerPath != null &&
|
|
72
71
|
(options === null || options === void 0 ? void 0 : options.workerPathOverrides) != null &&
|
|
73
|
-
options.workerPathOverrides[
|
|
72
|
+
options.workerPathOverrides[event.payload.event_type] != null) {
|
|
74
73
|
script =
|
|
75
|
-
baseWorkerPath +
|
|
74
|
+
baseWorkerPath +
|
|
75
|
+
options.workerPathOverrides[event.payload.event_type];
|
|
76
76
|
}
|
|
77
77
|
else {
|
|
78
78
|
script = getWorkerPath({
|
|
@@ -109,7 +109,7 @@ async function spawn({ event, initialState, initialDomainMapping, options, baseW
|
|
|
109
109
|
}
|
|
110
110
|
else {
|
|
111
111
|
const { eventType } = (0, spawn_helpers_1.getNoScriptEventType)(event.payload.event_type);
|
|
112
|
-
await (0,
|
|
112
|
+
await (0, emit_1.emit)({
|
|
113
113
|
event,
|
|
114
114
|
eventType,
|
|
115
115
|
});
|
|
@@ -188,7 +188,7 @@ class Spawn {
|
|
|
188
188
|
}
|
|
189
189
|
// If worker sends a message that it has emitted an event, then set alreadyEmitted to true.
|
|
190
190
|
if ((message === null || message === void 0 ? void 0 : message.subject) === workers_1.WorkerMessageSubject.WorkerMessageEmitted) {
|
|
191
|
-
console.info('Worker has emitted message to
|
|
191
|
+
console.info('Worker has emitted message to AirSync.');
|
|
192
192
|
this.alreadyEmitted = true;
|
|
193
193
|
}
|
|
194
194
|
// If worker sends a failure message before exiting, capture it for use in the error event.
|
|
@@ -236,7 +236,7 @@ class Spawn {
|
|
|
236
236
|
this.alreadyEmitted = true;
|
|
237
237
|
const { eventType } = (0, spawn_helpers_1.getTimeoutErrorEventType)(this.event.payload.event_type);
|
|
238
238
|
try {
|
|
239
|
-
await (0,
|
|
239
|
+
await (0, emit_1.emit)({
|
|
240
240
|
eventType,
|
|
241
241
|
event: this.event,
|
|
242
242
|
data: {
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const { workerData } = require('node:worker_threads');
|
|
3
3
|
require('ts-node').register();
|
|
4
|
-
const { Logger } = require('../logger/logger');
|
|
5
|
-
const { runWithUserLogContext } = require('../logger/logger.context');
|
|
4
|
+
const { Logger, runWithUserLogContext } = require('../logger/logger');
|
|
6
5
|
console = new Logger({ event: workerData.event, options: workerData.options });
|
|
7
6
|
runWithUserLogContext(() => {
|
|
8
7
|
require(workerData.workerPath);
|
package/dist/repo/repo.js
CHANGED
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Repo = void 0;
|
|
4
4
|
const constants_1 = require("../common/constants");
|
|
5
5
|
const uploader_1 = require("../uploader/uploader");
|
|
6
|
-
const
|
|
6
|
+
const logger_1 = require("../logger/logger");
|
|
7
7
|
class Repo {
|
|
8
8
|
constructor({ event, itemType, normalize, onUpload, options, }) {
|
|
9
9
|
this.items = [];
|
|
@@ -49,7 +49,7 @@ class Repo {
|
|
|
49
49
|
if (this.normalize &&
|
|
50
50
|
this.itemType != constants_1.AirSyncDefaultItemTypes.EXTERNAL_DOMAIN_METADATA &&
|
|
51
51
|
this.itemType != constants_1.SSOR_ATTACHMENT) {
|
|
52
|
-
recordsToPush = (0,
|
|
52
|
+
recordsToPush = (0, logger_1.runWithUserLogContext)(() => items.map((item) => this.normalize(item)));
|
|
53
53
|
}
|
|
54
54
|
else {
|
|
55
55
|
recordsToPush = items;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { InitialDomainMapping } from '../types/common';
|
|
2
|
+
import { AirSyncEvent } from '../types/extraction';
|
|
3
|
+
import { ExtractionScope } from '../types/workers';
|
|
4
|
+
import { SdkState, StateInterface } from './state.interfaces';
|
|
5
|
+
/**
|
|
6
|
+
* BaseState owns the state lifecycle shared by every sync mode: connector vs.
|
|
7
|
+
* SDK state separation, fetch/init/post against the platform, the v1->v2
|
|
8
|
+
* migration shim, and the snap-in-version-gated initial domain mapping install.
|
|
9
|
+
*
|
|
10
|
+
* Mode-specific subclasses (`ExtractionState`, `LoadingState`) seed the
|
|
11
|
+
* SDK-owned portion of the state and add mode-specific setup in their factories.
|
|
12
|
+
*
|
|
13
|
+
* @typeParam ConnectorState - the connector-owned state shape
|
|
14
|
+
*/
|
|
15
|
+
export declare abstract class BaseState<ConnectorState> {
|
|
16
|
+
protected _connectorState: ConnectorState;
|
|
17
|
+
protected _sdkState: SdkState;
|
|
18
|
+
protected _extractionScope: ExtractionScope;
|
|
19
|
+
protected readonly initialSdkState: SdkState;
|
|
20
|
+
protected readonly event: AirSyncEvent;
|
|
21
|
+
private workerUrl;
|
|
22
|
+
private devrevToken;
|
|
23
|
+
private syncUnitId;
|
|
24
|
+
private requestId;
|
|
25
|
+
constructor({ event, initialState }: StateInterface<ConnectorState>, initialSdkState: SdkState);
|
|
26
|
+
/** Connector-owned state. This is what `adapter.state` exposes to snap-in code. */
|
|
27
|
+
get state(): ConnectorState;
|
|
28
|
+
set state(value: ConnectorState);
|
|
29
|
+
/** SDK-internal bookkeeping state. Never exposed to connector code. */
|
|
30
|
+
get sdkState(): SdkState;
|
|
31
|
+
set sdkState(value: SdkState);
|
|
32
|
+
get extractionScope(): ExtractionScope;
|
|
33
|
+
/**
|
|
34
|
+
* Installs the initial domain mapping when the snap-in version in state does
|
|
35
|
+
* not match the version in the event context. Shared by all modes so that a
|
|
36
|
+
* loading run still installs the mapping if extraction has not done so.
|
|
37
|
+
* @param initialDomainMapping The initial domain mapping passed to spawn
|
|
38
|
+
*/
|
|
39
|
+
installInitialDomainMappingIfNeeded(initialDomainMapping?: InitialDomainMapping): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Initializes the state for this adapter instance by fetching from API
|
|
42
|
+
* or creating an initial state if none exists (404).
|
|
43
|
+
*
|
|
44
|
+
* Reads both the v2 `{ connectorState, sdkState }` envelope and a legacy flat
|
|
45
|
+
* v1 blob (connector keys merged with SDK keys), migrating the latter on read.
|
|
46
|
+
* Always persists the v2 envelope going forward.
|
|
47
|
+
* @param initialState The initial connector state provided by the spawn function
|
|
48
|
+
*/
|
|
49
|
+
init(initialState: ConnectorState): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Normalizes a parsed on-disk state into the `{ connectorState, sdkState }`
|
|
52
|
+
* envelope, migrating a legacy flat v1 blob if needed.
|
|
53
|
+
*
|
|
54
|
+
* - v2 envelope (`{ connectorState, sdkState }`): used as-is.
|
|
55
|
+
* - v1 flat blob: SDK-owned keys (`V1_SDK_STATE_KEYS`) split into `sdkState`,
|
|
56
|
+
* everything else becomes connector state.
|
|
57
|
+
* - Malformed envelope (one side present, the other missing) fails loud.
|
|
58
|
+
*/
|
|
59
|
+
private normalizeFetchedState;
|
|
60
|
+
/**
|
|
61
|
+
* Updates the state of the adapter by posting to API.
|
|
62
|
+
* Persists the v2 `{ connectorState, sdkState }` envelope.
|
|
63
|
+
* @param {object} state - The connector state to be updated
|
|
64
|
+
*/
|
|
65
|
+
postState(state?: ConnectorState): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Fetches the state of the adapter from API.
|
|
68
|
+
* @return The raw state data from API
|
|
69
|
+
*/
|
|
70
|
+
fetchState(): Promise<{
|
|
71
|
+
state: string;
|
|
72
|
+
objects?: string;
|
|
73
|
+
}>;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=base-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-state.d.ts","sourceRoot":"","sources":["../../src/state/base-state.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAEL,QAAQ,EACR,cAAc,EAEf,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;GASG;AACH,8BAAsB,SAAS,CAAC,cAAc;IAC5C,SAAS,CAAC,eAAe,EAAE,cAAc,CAAC;IAC1C,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC;IAC9B,SAAS,CAAC,gBAAgB,EAAE,eAAe,CAAM;IACjD,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC;IAC7C,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IACvC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;gBAGxB,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,cAAc,CAAC,cAAc,CAAC,EACvD,eAAe,EAAE,QAAQ;IAY3B,mFAAmF;IACnF,IAAI,KAAK,IAAI,cAAc,CAE1B;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,cAAc,EAE9B;IAED,uEAAuE;IACvE,IAAI,QAAQ,IAAI,QAAQ,CAEvB;IAED,IAAI,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAE3B;IAED,IAAI,eAAe,IAAI,eAAe,CAErC;IAED;;;;;OAKG;IACG,mCAAmC,CACvC,oBAAoB,CAAC,EAAE,oBAAoB,GAC1C,OAAO,CAAC,IAAI,CAAC;IAwChB;;;;;;;;OAQG;IACG,IAAI,CAAC,YAAY,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAkDvD;;;;;;;;OAQG;IACH,OAAO,CAAC,qBAAqB;IAyC7B;;;;OAIG;IACG,SAAS,CAAC,KAAK,CAAC,EAAE,cAAc;IA4DtC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAqBjE"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.BaseState = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const node_worker_threads_1 = require("node:worker_threads");
|
|
9
|
+
const install_initial_domain_mapping_1 = require("./install-initial-domain-mapping");
|
|
10
|
+
const client_1 = require("../http/client");
|
|
11
|
+
const logger_1 = require("../logger/logger");
|
|
12
|
+
const workers_1 = require("../types/workers");
|
|
13
|
+
const state_interfaces_1 = require("./state.interfaces");
|
|
14
|
+
/**
|
|
15
|
+
* BaseState owns the state lifecycle shared by every sync mode: connector vs.
|
|
16
|
+
* SDK state separation, fetch/init/post against the platform, the v1->v2
|
|
17
|
+
* migration shim, and the snap-in-version-gated initial domain mapping install.
|
|
18
|
+
*
|
|
19
|
+
* Mode-specific subclasses (`ExtractionState`, `LoadingState`) seed the
|
|
20
|
+
* SDK-owned portion of the state and add mode-specific setup in their factories.
|
|
21
|
+
*
|
|
22
|
+
* @typeParam ConnectorState - the connector-owned state shape
|
|
23
|
+
*/
|
|
24
|
+
class BaseState {
|
|
25
|
+
constructor({ event, initialState }, initialSdkState) {
|
|
26
|
+
this._extractionScope = {};
|
|
27
|
+
this.event = event;
|
|
28
|
+
this.initialSdkState = initialSdkState;
|
|
29
|
+
this._connectorState = initialState;
|
|
30
|
+
this._sdkState = Object.assign({}, initialSdkState);
|
|
31
|
+
this.workerUrl = event.payload.event_context.worker_data_url;
|
|
32
|
+
this.devrevToken = event.context.secrets.service_account_token;
|
|
33
|
+
this.syncUnitId = event.payload.event_context.sync_unit_id;
|
|
34
|
+
this.requestId = event.payload.event_context.request_id_adaas;
|
|
35
|
+
}
|
|
36
|
+
/** Connector-owned state. This is what `adapter.state` exposes to snap-in code. */
|
|
37
|
+
get state() {
|
|
38
|
+
return this._connectorState;
|
|
39
|
+
}
|
|
40
|
+
set state(value) {
|
|
41
|
+
this._connectorState = value;
|
|
42
|
+
}
|
|
43
|
+
/** SDK-internal bookkeeping state. Never exposed to connector code. */
|
|
44
|
+
get sdkState() {
|
|
45
|
+
return this._sdkState;
|
|
46
|
+
}
|
|
47
|
+
set sdkState(value) {
|
|
48
|
+
this._sdkState = value;
|
|
49
|
+
}
|
|
50
|
+
get extractionScope() {
|
|
51
|
+
return this._extractionScope;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Installs the initial domain mapping when the snap-in version in state does
|
|
55
|
+
* not match the version in the event context. Shared by all modes so that a
|
|
56
|
+
* loading run still installs the mapping if extraction has not done so.
|
|
57
|
+
* @param initialDomainMapping The initial domain mapping passed to spawn
|
|
58
|
+
*/
|
|
59
|
+
async installInitialDomainMappingIfNeeded(initialDomainMapping) {
|
|
60
|
+
const snapInVersionId = this.event.context.snap_in_version_id;
|
|
61
|
+
const hasSnapInVersionInState = 'snapInVersionId' in this.sdkState;
|
|
62
|
+
const shouldUpdateIDM = !hasSnapInVersionInState ||
|
|
63
|
+
this.sdkState.snapInVersionId !== snapInVersionId;
|
|
64
|
+
if (!shouldUpdateIDM) {
|
|
65
|
+
console.log(`Snap-in version in state matches the version in event context "${snapInVersionId}". Skipping initial domain mapping installation.`);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
console.log(`Snap-in version in state "${this.sdkState.snapInVersionId}" does not match the version in event context "${snapInVersionId}". Installing initial domain mapping.`);
|
|
70
|
+
if (initialDomainMapping) {
|
|
71
|
+
await (0, install_initial_domain_mapping_1.installInitialDomainMapping)(this.event, initialDomainMapping);
|
|
72
|
+
this.sdkState.snapInVersionId = snapInVersionId;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
throw new Error('No initial domain mapping was passed to spawn function. Skipping initial domain mapping installation.');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
const errorMessage = `Error while installing initial domain mapping. ${(0, logger_1.serializeError)(error)}`;
|
|
80
|
+
console.error(errorMessage);
|
|
81
|
+
node_worker_threads_1.parentPort === null || node_worker_threads_1.parentPort === void 0 ? void 0 : node_worker_threads_1.parentPort.postMessage({
|
|
82
|
+
subject: workers_1.WorkerMessageSubject.WorkerMessageFailed,
|
|
83
|
+
payload: { message: errorMessage },
|
|
84
|
+
});
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Initializes the state for this adapter instance by fetching from API
|
|
90
|
+
* or creating an initial state if none exists (404).
|
|
91
|
+
*
|
|
92
|
+
* Reads both the v2 `{ connectorState, sdkState }` envelope and a legacy flat
|
|
93
|
+
* v1 blob (connector keys merged with SDK keys), migrating the latter on read.
|
|
94
|
+
* Always persists the v2 envelope going forward.
|
|
95
|
+
* @param initialState The initial connector state provided by the spawn function
|
|
96
|
+
*/
|
|
97
|
+
async init(initialState) {
|
|
98
|
+
var _a;
|
|
99
|
+
try {
|
|
100
|
+
const { state: stringifiedState, objects } = await this.fetchState();
|
|
101
|
+
if (!stringifiedState) {
|
|
102
|
+
throw new Error('No state found in response.');
|
|
103
|
+
}
|
|
104
|
+
let parsed;
|
|
105
|
+
try {
|
|
106
|
+
parsed = JSON.parse(stringifiedState);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
throw new Error(`Failed to parse state. ${error}`);
|
|
110
|
+
}
|
|
111
|
+
const { connectorState, sdkState } = this.normalizeFetchedState(parsed);
|
|
112
|
+
this.state = connectorState;
|
|
113
|
+
this.sdkState = sdkState;
|
|
114
|
+
console.log('State fetched successfully. Current state', {
|
|
115
|
+
connectorState: (0, logger_1.getPrintableState)(this.state),
|
|
116
|
+
sdkState: (0, logger_1.getPrintableState)(this.sdkState),
|
|
117
|
+
});
|
|
118
|
+
if (objects) {
|
|
119
|
+
try {
|
|
120
|
+
this._extractionScope = JSON.parse(objects);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
console.warn(`Failed to parse extractionScope. ${error}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
if (axios_1.default.isAxiosError(error) && ((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) === 404) {
|
|
129
|
+
console.log('State not found. Initializing state with initial state.');
|
|
130
|
+
this.state = initialState;
|
|
131
|
+
this.sdkState = Object.assign({}, this.initialSdkState);
|
|
132
|
+
await this.postState();
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
const errorMessage = `Failed to init state. ${(0, logger_1.serializeError)(error)}`;
|
|
136
|
+
console.error(errorMessage);
|
|
137
|
+
node_worker_threads_1.parentPort === null || node_worker_threads_1.parentPort === void 0 ? void 0 : node_worker_threads_1.parentPort.postMessage({
|
|
138
|
+
subject: workers_1.WorkerMessageSubject.WorkerMessageFailed,
|
|
139
|
+
payload: { message: errorMessage },
|
|
140
|
+
});
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Normalizes a parsed on-disk state into the `{ connectorState, sdkState }`
|
|
147
|
+
* envelope, migrating a legacy flat v1 blob if needed.
|
|
148
|
+
*
|
|
149
|
+
* - v2 envelope (`{ connectorState, sdkState }`): used as-is.
|
|
150
|
+
* - v1 flat blob: SDK-owned keys (`V1_SDK_STATE_KEYS`) split into `sdkState`,
|
|
151
|
+
* everything else becomes connector state.
|
|
152
|
+
* - Malformed envelope (one side present, the other missing) fails loud.
|
|
153
|
+
*/
|
|
154
|
+
normalizeFetchedState(parsed) {
|
|
155
|
+
if (parsed === null || typeof parsed !== 'object') {
|
|
156
|
+
throw new Error('Fetched state is not a JSON object.');
|
|
157
|
+
}
|
|
158
|
+
const record = parsed;
|
|
159
|
+
const hasConnector = 'connectorState' in record;
|
|
160
|
+
const hasSdk = 'sdkState' in record;
|
|
161
|
+
if (hasConnector || hasSdk) {
|
|
162
|
+
if (!hasConnector || !hasSdk) {
|
|
163
|
+
throw new Error('Malformed state envelope: expected both "connectorState" and "sdkState".');
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
connectorState: record.connectorState,
|
|
167
|
+
sdkState: Object.assign(Object.assign({}, this.initialSdkState), record.sdkState),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
// Legacy flat v1 blob: split known SDK keys out of the connector state.
|
|
171
|
+
const connectorState = {};
|
|
172
|
+
const sdkState = {};
|
|
173
|
+
for (const [key, value] of Object.entries(record)) {
|
|
174
|
+
if (state_interfaces_1.V1_SDK_STATE_KEYS.has(key)) {
|
|
175
|
+
sdkState[key] = value;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
connectorState[key] = value;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
connectorState: connectorState,
|
|
183
|
+
sdkState: Object.assign(Object.assign({}, this.initialSdkState), sdkState),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Updates the state of the adapter by posting to API.
|
|
188
|
+
* Persists the v2 `{ connectorState, sdkState }` envelope.
|
|
189
|
+
* @param {object} state - The connector state to be updated
|
|
190
|
+
*/
|
|
191
|
+
async postState(state) {
|
|
192
|
+
const url = this.workerUrl + '.update';
|
|
193
|
+
this.state = state || this.state;
|
|
194
|
+
const envelope = {
|
|
195
|
+
connectorState: this.state,
|
|
196
|
+
sdkState: this.sdkState,
|
|
197
|
+
};
|
|
198
|
+
let stringifiedState;
|
|
199
|
+
try {
|
|
200
|
+
stringifiedState = JSON.stringify(envelope);
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
const errorMessage = `Failed to stringify state. ${(0, logger_1.serializeError)(error)}`;
|
|
204
|
+
console.error(errorMessage);
|
|
205
|
+
node_worker_threads_1.parentPort === null || node_worker_threads_1.parentPort === void 0 ? void 0 : node_worker_threads_1.parentPort.postMessage({
|
|
206
|
+
subject: workers_1.WorkerMessageSubject.WorkerMessageFailed,
|
|
207
|
+
payload: { message: errorMessage },
|
|
208
|
+
});
|
|
209
|
+
process.exit(1);
|
|
210
|
+
}
|
|
211
|
+
try {
|
|
212
|
+
await client_1.axiosClient.post(url, {
|
|
213
|
+
state: stringifiedState,
|
|
214
|
+
}, {
|
|
215
|
+
headers: {
|
|
216
|
+
Authorization: this.devrevToken,
|
|
217
|
+
},
|
|
218
|
+
params: {
|
|
219
|
+
sync_unit: this.syncUnitId,
|
|
220
|
+
request_id: this.requestId,
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
console.log('State updated successfully to', {
|
|
224
|
+
connectorState: (0, logger_1.getPrintableState)(this.state),
|
|
225
|
+
sdkState: (0, logger_1.getPrintableState)(this.sdkState),
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
const errorMessage = `Failed to update the state. ${(0, logger_1.serializeError)(error)}`;
|
|
230
|
+
console.error(errorMessage);
|
|
231
|
+
node_worker_threads_1.parentPort === null || node_worker_threads_1.parentPort === void 0 ? void 0 : node_worker_threads_1.parentPort.postMessage({
|
|
232
|
+
subject: workers_1.WorkerMessageSubject.WorkerMessageFailed,
|
|
233
|
+
payload: { message: errorMessage },
|
|
234
|
+
});
|
|
235
|
+
process.exit(1);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Fetches the state of the adapter from API.
|
|
240
|
+
* @return The raw state data from API
|
|
241
|
+
*/
|
|
242
|
+
async fetchState() {
|
|
243
|
+
var _a, _b;
|
|
244
|
+
console.log(`Fetching state with sync unit id ${this.syncUnitId} and request id ${this.requestId}.`);
|
|
245
|
+
const url = this.workerUrl + '.get';
|
|
246
|
+
const response = await client_1.axiosClient.get(url, {
|
|
247
|
+
headers: {
|
|
248
|
+
Authorization: this.devrevToken,
|
|
249
|
+
},
|
|
250
|
+
params: {
|
|
251
|
+
sync_unit: this.syncUnitId,
|
|
252
|
+
request_id: this.requestId,
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
return {
|
|
256
|
+
state: (_a = response.data) === null || _a === void 0 ? void 0 : _a.state,
|
|
257
|
+
objects: (_b = response.data) === null || _b === void 0 ? void 0 : _b.objects,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
exports.BaseState = BaseState;
|