@devrev/airsync-sdk 2.0.0-beta.3 → 2.0.0-beta.5
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/MIGRATION.md +1028 -0
- package/README.md +5 -11
- package/dist/attachments-streaming/attachments-streaming-pool.d.ts +7 -9
- package/dist/attachments-streaming/attachments-streaming-pool.d.ts.map +1 -1
- package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts +2 -7
- package/dist/attachments-streaming/attachments-streaming-pool.interfaces.d.ts.map +1 -1
- package/dist/attachments-streaming/attachments-streaming-pool.js +54 -56
- package/dist/common/constants.d.ts +4 -5
- package/dist/common/constants.d.ts.map +1 -1
- package/dist/common/constants.js +6 -7
- package/dist/common/helpers.d.ts +3 -35
- package/dist/common/helpers.d.ts.map +1 -1
- package/dist/common/helpers.js +5 -50
- 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} +4 -8
- package/dist/index.d.ts +24 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +43 -32
- package/dist/logger/logger.d.ts +12 -53
- package/dist/logger/logger.d.ts.map +1 -1
- package/dist/logger/logger.interfaces.d.ts +0 -1
- package/dist/logger/logger.interfaces.d.ts.map +1 -1
- package/dist/logger/logger.js +36 -68
- package/dist/mappers/mappers.d.ts +7 -46
- package/dist/mappers/mappers.d.ts.map +1 -1
- package/dist/mappers/mappers.interfaces.d.ts +175 -0
- package/dist/mappers/mappers.interfaces.d.ts.map +1 -0
- package/dist/mappers/{mappers.interface.js → mappers.interfaces.js} +4 -13
- package/dist/mappers/mappers.js +11 -45
- package/dist/multithreading/adapters/base-adapter.d.ts +30 -32
- package/dist/multithreading/adapters/base-adapter.d.ts.map +1 -1
- package/dist/multithreading/adapters/base-adapter.js +97 -62
- package/dist/multithreading/adapters/extraction-adapter.d.ts +16 -29
- package/dist/multithreading/adapters/extraction-adapter.d.ts.map +1 -1
- package/dist/multithreading/adapters/extraction-adapter.js +203 -206
- package/dist/multithreading/adapters/loading-adapter.d.ts +8 -13
- package/dist/multithreading/adapters/loading-adapter.d.ts.map +1 -1
- package/dist/multithreading/adapters/loading-adapter.helpers.d.ts +2 -12
- package/dist/multithreading/adapters/loading-adapter.helpers.d.ts.map +1 -1
- package/dist/multithreading/adapters/loading-adapter.helpers.js +2 -12
- package/dist/multithreading/adapters/loading-adapter.js +294 -346
- package/dist/multithreading/emit.d.ts +11 -0
- package/dist/multithreading/emit.d.ts.map +1 -0
- package/dist/{common/control-protocol.js → multithreading/emit.js} +5 -7
- package/dist/multithreading/process-task.d.ts +2 -12
- package/dist/multithreading/process-task.d.ts.map +1 -1
- package/dist/multithreading/process-task.js +46 -43
- package/dist/multithreading/spawn/spawn.d.ts +3 -9
- 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 +128 -20
- package/dist/multithreading/spawn/spawn.js +24 -39
- package/dist/multithreading/worker.js +1 -4
- package/dist/repo/repo.d.ts +10 -0
- 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 +4 -16
- package/dist/repo/repo.interfaces.d.ts.map +1 -1
- package/dist/repo/repo.js +23 -8
- package/dist/state/base-state.d.ts +16 -38
- package/dist/state/base-state.d.ts.map +1 -1
- package/dist/state/base-state.js +19 -41
- package/dist/state/extraction-state.d.ts +6 -21
- package/dist/state/extraction-state.d.ts.map +1 -1
- package/dist/state/extraction-state.js +8 -25
- package/dist/{common → state}/install-initial-domain-mapping.d.ts +1 -1
- 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 +3 -14
- package/dist/state/loading-state.d.ts.map +1 -1
- package/dist/state/loading-state.js +3 -14
- package/dist/state/state.d.ts +4 -0
- package/dist/state/state.d.ts.map +1 -0
- package/dist/state/state.interfaces.d.ts +33 -37
- package/dist/state/state.interfaces.d.ts.map +1 -1
- package/dist/state/state.interfaces.js +16 -11
- package/dist/state/state.js +11 -0
- package/dist/state/time-value-resolver.d.ts +17 -0
- package/dist/state/time-value-resolver.d.ts.map +1 -0
- package/dist/{common → state}/time-value-resolver.js +9 -41
- package/dist/testing/mock-event.d.ts +10 -0
- package/dist/testing/mock-event.d.ts.map +1 -0
- package/dist/{common/test-utils.js → testing/mock-event.js} +17 -14
- package/dist/testing/mock-server.d.ts +29 -0
- package/dist/testing/mock-server.d.ts.map +1 -0
- package/dist/testing/mock-server.interfaces.d.ts +48 -0
- package/dist/testing/mock-server.interfaces.d.ts.map +1 -0
- package/dist/{mock-server → testing}/mock-server.js +21 -33
- package/dist/types/common.d.ts +1 -12
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/common.js +1 -6
- package/dist/types/errors.d.ts +9 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/external-domain-metadata.d.ts +30 -171
- package/dist/types/external-domain-metadata.d.ts.map +1 -1
- package/dist/types/extraction.d.ts +64 -94
- package/dist/types/extraction.d.ts.map +1 -1
- package/dist/types/extraction.js +6 -34
- 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 +39 -94
- package/dist/types/workers.d.ts.map +1 -1
- package/dist/types/workers.js +0 -6
- package/dist/uploader/uploader.d.ts +8 -59
- package/dist/uploader/uploader.d.ts.map +1 -1
- package/dist/uploader/uploader.helpers.d.ts +4 -27
- package/dist/uploader/uploader.helpers.d.ts.map +1 -1
- package/dist/uploader/uploader.helpers.js +64 -30
- package/dist/uploader/uploader.interfaces.d.ts +15 -25
- package/dist/uploader/uploader.interfaces.d.ts.map +1 -1
- package/dist/uploader/uploader.interfaces.js +8 -0
- package/dist/uploader/uploader.js +23 -89
- package/package.json +8 -6
- package/dist/airsync-sdk.d.ts +0 -2059
- 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 -540
- package/dist/common/control-protocol.d.ts +0 -10
- 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 +0 -19
- package/dist/common/test-utils.d.ts.map +0 -1
- package/dist/common/time-value-resolver.d.ts +0 -47
- 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 +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 -105
- package/dist/mock-server/mock-server.d.ts +0 -47
- package/dist/mock-server/mock-server.d.ts.map +0 -1
- package/dist/mock-server/mock-server.interfaces.d.ts +0 -73
- package/dist/mock-server/mock-server.interfaces.d.ts.map +0 -1
- package/dist/multithreading/adapters/base-adapter.emit.test.d.ts +0 -2
- package/dist/multithreading/adapters/base-adapter.emit.test.d.ts.map +0 -1
- package/dist/multithreading/adapters/base-adapter.emit.test.js +0 -403
- package/dist/multithreading/adapters/extraction-adapter.artifacts.test.d.ts +0 -2
- package/dist/multithreading/adapters/extraction-adapter.artifacts.test.d.ts.map +0 -1
- package/dist/multithreading/adapters/extraction-adapter.artifacts.test.js +0 -175
- package/dist/multithreading/adapters/extraction-adapter.test.d.ts +0 -2
- package/dist/multithreading/adapters/extraction-adapter.test.d.ts.map +0 -1
- package/dist/multithreading/adapters/extraction-adapter.test.js +0 -789
- package/dist/multithreading/adapters/loading-adapter.helpers.test.d.ts +0 -2
- package/dist/multithreading/adapters/loading-adapter.helpers.test.d.ts.map +0 -1
- package/dist/multithreading/adapters/loading-adapter.helpers.test.js +0 -514
- package/dist/multithreading/adapters/loading-adapter.test.d.ts +0 -2
- package/dist/multithreading/adapters/loading-adapter.test.d.ts.map +0 -1
- package/dist/multithreading/adapters/loading-adapter.test.js +0 -589
- package/dist/multithreading/adapters/serialization.test.d.ts +0 -2
- package/dist/multithreading/adapters/serialization.test.d.ts.map +0 -1
- package/dist/multithreading/adapters/serialization.test.js +0 -71
- 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/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 -78
- 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 -271
- 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 -10
- 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/{mock-server → testing}/mock-server.interfaces.js +0 -0
- /package/dist/{common → types}/errors.js +0 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AxiosResponse } from 'axios';
|
|
2
|
+
import { AirSyncEvent, EventData, ExtractorEventType, WorkerMetadata } from '../types/extraction';
|
|
3
|
+
import { LoaderEventType } from '../types/loading';
|
|
4
|
+
export interface EmitInterface {
|
|
5
|
+
event: AirSyncEvent;
|
|
6
|
+
eventType: ExtractorEventType | LoaderEventType;
|
|
7
|
+
data?: EventData;
|
|
8
|
+
worker_metadata?: WorkerMetadata;
|
|
9
|
+
}
|
|
10
|
+
export declare const emit: ({ event, eventType, data, worker_metadata, }: EmitInterface) => Promise<AxiosResponse>;
|
|
11
|
+
//# sourceMappingURL=emit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/multithreading/emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAItC,OAAO,EACL,YAAY,EACZ,SAAS,EAET,kBAAkB,EAElB,cAAc,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,kBAAkB,GAAG,eAAe,CAAC;IAChD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,eAAe,CAAC,EAAE,cAAc,CAAC;CAClC;AAED,eAAO,MAAM,IAAI,GAAU,8CAKxB,aAAa,KAAG,OAAO,CAAC,aAAa,CA+BvC,CAAC"}
|
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.emit = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const emit = async ({ event, eventType, data, }) => {
|
|
4
|
+
const constants_1 = require("../common/constants");
|
|
5
|
+
const client_1 = require("../http/client");
|
|
6
|
+
const emit = async ({ event, eventType, data, worker_metadata, }) => {
|
|
7
7
|
const newEvent = {
|
|
8
8
|
event_type: eventType,
|
|
9
9
|
event_context: event.payload.event_context,
|
|
10
10
|
event_data: Object.assign({}, data),
|
|
11
|
-
worker_metadata: {
|
|
12
|
-
adaas_library_version: constants_1.LIBRARY_VERSION,
|
|
13
|
-
},
|
|
11
|
+
worker_metadata: Object.assign(Object.assign({}, worker_metadata), { newest_state_date: event.payload.event_context.extract_to, oldest_state_date: event.payload.event_context.extract_from, adaas_library_version: constants_1.LIBRARY_VERSION }),
|
|
14
12
|
};
|
|
15
13
|
console.info('Emitting event', newEvent);
|
|
16
|
-
return
|
|
14
|
+
return client_1.axiosClient.post(event.payload.event_context.callback_url, Object.assign({}, newEvent), {
|
|
17
15
|
headers: {
|
|
18
16
|
Accept: 'application/json, text/plain, */*',
|
|
19
17
|
Authorization: event.context.secrets.service_account_token,
|
|
@@ -1,18 +1,8 @@
|
|
|
1
1
|
import { ProcessTaskInterface } from '../types/workers';
|
|
2
2
|
import { ExtractionAdapter } from './adapters/extraction-adapter';
|
|
3
3
|
import { LoadingAdapter } from './adapters/loading-adapter';
|
|
4
|
-
/**
|
|
5
|
-
* Entry point for an extraction worker. Builds an {@link ExtractionAdapter} and
|
|
6
|
-
* runs the provided task against it.
|
|
7
|
-
*
|
|
8
|
-
* @public
|
|
9
|
-
*/
|
|
4
|
+
/** Entry point for an extraction worker. @public */
|
|
10
5
|
export declare function processExtractionTask<ConnectorState>({ task, onTimeout, }: ProcessTaskInterface<ExtractionAdapter<ConnectorState>>): void;
|
|
11
|
-
/**
|
|
12
|
-
* Entry point for a loading worker. Builds a {@link LoadingAdapter} and runs the
|
|
13
|
-
* provided task against it.
|
|
14
|
-
*
|
|
15
|
-
* @public
|
|
16
|
-
*/
|
|
6
|
+
/** Entry point for a loading worker. @public */
|
|
17
7
|
export declare function processLoadingTask<ConnectorState>({ task, onTimeout, }: ProcessTaskInterface<LoadingAdapter<ConnectorState>>): void;
|
|
18
8
|
//# sourceMappingURL=process-task.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-task.d.ts","sourceRoot":"","sources":["../../src/multithreading/process-task.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"process-task.d.ts","sourceRoot":"","sources":["../../src/multithreading/process-task.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,oBAAoB,EAIrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AA6D5D,oDAAoD;AACpD,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,EACpD,IAAI,EACJ,SAAS,GACV,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,QA6BzD;AAED,gDAAgD;AAChD,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,EACjD,IAAI,EACJ,SAAS,GACV,EAAE,oBAAoB,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,QA6BtD"}
|
|
@@ -4,54 +4,62 @@ exports.processExtractionTask = processExtractionTask;
|
|
|
4
4
|
exports.processLoadingTask = processLoadingTask;
|
|
5
5
|
const node_worker_threads_1 = require("node:worker_threads");
|
|
6
6
|
const logger_1 = require("../logger/logger");
|
|
7
|
-
const logger_context_1 = require("../logger/logger.context");
|
|
8
7
|
const extraction_state_1 = require("../state/extraction-state");
|
|
9
8
|
const loading_state_1 = require("../state/loading-state");
|
|
10
9
|
const workers_1 = require("../types/workers");
|
|
11
10
|
const extraction_adapter_1 = require("./adapters/extraction-adapter");
|
|
12
11
|
const loading_adapter_1 = require("./adapters/loading-adapter");
|
|
12
|
+
const spawn_helpers_1 = require("./spawn/spawn.helpers");
|
|
13
13
|
/**
|
|
14
|
-
* Shared worker-thread driver
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
14
|
+
* Shared worker-thread driver: builds the adapter, runs the task, maps the
|
|
15
|
+
* returned {@link TaskResult} to a platform event and emits it exactly once.
|
|
16
|
+
* On soft timeout the timeout outcome always wins: the `onTimeout` result (or
|
|
17
|
+
* a phase-appropriate default) is emitted and the task's return value is
|
|
18
|
+
* ignored.
|
|
18
19
|
*/
|
|
19
20
|
async function runWorkerTask(buildAdapter, { task, onTimeout }) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if (
|
|
32
|
-
|
|
21
|
+
try {
|
|
22
|
+
const adapter = await buildAdapter();
|
|
23
|
+
node_worker_threads_1.parentPort === null || node_worker_threads_1.parentPort === void 0 ? void 0 : node_worker_threads_1.parentPort.on(workers_1.WorkerEvent.WorkerMessage, (message) => {
|
|
24
|
+
if (message.subject !== workers_1.WorkerMessageSubject.WorkerMessageExit) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
console.log('Timeout received. Waiting for the task to finish.');
|
|
28
|
+
adapter.isTimeout = true;
|
|
29
|
+
});
|
|
30
|
+
let result = await task({ adapter });
|
|
31
|
+
if (adapter.isTimeout) {
|
|
32
|
+
if (onTimeout) {
|
|
33
|
+
result = await onTimeout({ adapter });
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// Non-resumable phases can't hand off with `progress`; report a timeout error.
|
|
37
|
+
const eventType = adapter.event.payload.event_type;
|
|
38
|
+
const { illegal } = (0, spawn_helpers_1.getEventTypeForResult)(eventType, 'progress');
|
|
39
|
+
result = illegal
|
|
40
|
+
? {
|
|
41
|
+
status: 'error',
|
|
42
|
+
error: {
|
|
43
|
+
message: `Worker timed out during a non-resumable phase (${eventType}), which cannot be continued.`,
|
|
44
|
+
},
|
|
45
|
+
}
|
|
46
|
+
: { status: 'progress' };
|
|
33
47
|
}
|
|
34
|
-
process.exit(0);
|
|
35
|
-
}
|
|
36
|
-
catch (error) {
|
|
37
|
-
(0, logger_context_1.runWithUserLogContext)(() => {
|
|
38
|
-
const errorMessage = `Error while processing task. ${(0, logger_1.serializeError)(error)}`;
|
|
39
|
-
console.error(errorMessage);
|
|
40
|
-
node_worker_threads_1.parentPort === null || node_worker_threads_1.parentPort === void 0 ? void 0 : node_worker_threads_1.parentPort.postMessage({
|
|
41
|
-
subject: workers_1.WorkerMessageSubject.WorkerMessageFailed,
|
|
42
|
-
payload: { message: errorMessage },
|
|
43
|
-
});
|
|
44
|
-
process.exit(1);
|
|
45
|
-
});
|
|
46
48
|
}
|
|
47
|
-
|
|
49
|
+
await adapter.emitFromResult(result);
|
|
50
|
+
process.exit(0);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
const errorMessage = `Error while processing task. ${(0, logger_1.serializeError)(error)}`;
|
|
54
|
+
console.error(errorMessage);
|
|
55
|
+
node_worker_threads_1.parentPort === null || node_worker_threads_1.parentPort === void 0 ? void 0 : node_worker_threads_1.parentPort.postMessage({
|
|
56
|
+
subject: workers_1.WorkerMessageSubject.WorkerMessageFailed,
|
|
57
|
+
payload: { message: errorMessage },
|
|
58
|
+
});
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
48
61
|
}
|
|
49
|
-
/**
|
|
50
|
-
* Entry point for an extraction worker. Builds an {@link ExtractionAdapter} and
|
|
51
|
-
* runs the provided task against it.
|
|
52
|
-
*
|
|
53
|
-
* @public
|
|
54
|
-
*/
|
|
62
|
+
/** Entry point for an extraction worker. @public */
|
|
55
63
|
function processExtractionTask({ task, onTimeout, }) {
|
|
56
64
|
if (node_worker_threads_1.isMainThread) {
|
|
57
65
|
return;
|
|
@@ -76,12 +84,7 @@ function processExtractionTask({ task, onTimeout, }) {
|
|
|
76
84
|
});
|
|
77
85
|
}, { task, onTimeout });
|
|
78
86
|
}
|
|
79
|
-
/**
|
|
80
|
-
* Entry point for a loading worker. Builds a {@link LoadingAdapter} and runs the
|
|
81
|
-
* provided task against it.
|
|
82
|
-
*
|
|
83
|
-
* @public
|
|
84
|
-
*/
|
|
87
|
+
/** Entry point for a loading worker. @public */
|
|
85
88
|
function processLoadingTask({ task, onTimeout, }) {
|
|
86
89
|
if (node_worker_threads_1.isMainThread) {
|
|
87
90
|
return;
|
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
import { SpawnFactoryInterface, SpawnInterface } from '../../types/workers';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* In case of lambda timeout, the class emits a lambda timeout event to the platform.
|
|
7
|
-
* @param {SpawnFactoryInterface} options - The options to create a new instance of Spawn class
|
|
8
|
-
* @param {AirSyncEvent} options.event - The event object received from the platform
|
|
9
|
-
* @param {object} options.initialState - The initial state of the adapter
|
|
10
|
-
* @param {string} [options.baseWorkerPath] - The base path for the worker files, usually `__dirname`
|
|
11
|
-
* @returns {Promise<Spawn>} - A new instance of Spawn class
|
|
3
|
+
* Spawns a worker thread for the event and manages its lifecycle (control
|
|
4
|
+
* events, graceful exit, lambda timeout handling). Resolves when the worker
|
|
5
|
+
* run is fully finished.
|
|
12
6
|
*/
|
|
13
7
|
export declare function spawn<ConnectorState>({ event, initialState, initialDomainMapping, options, baseWorkerPath, }: SpawnFactoryInterface<ConnectorState>): Promise<void>;
|
|
14
8
|
export declare class Spawn {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../src/multithreading/spawn/spawn.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../src/multithreading/spawn/spawn.ts"],"names":[],"mappings":"AAYA,OAAO,EAEL,qBAAqB,EACrB,cAAc,EAGf,MAAM,qBAAqB,CAAC;AA0C7B;;;;GAIG;AACH,wBAAsB,KAAK,CAAC,cAAc,EAAE,EAC1C,KAAK,EACL,YAAY,EACZ,oBAAoB,EACpB,OAAO,EACP,cAAc,GACf,EAAE,qBAAqB,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAuEvD;AAED,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,oBAAoB,CAAkC;IAC9D,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,gBAAgB,CAA4C;IACpE,OAAO,CAAC,gBAAgB,CAA4C;IACpE,OAAO,CAAC,wBAAwB,CAA6C;IAC7E,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,mBAAmB,CAAqB;gBACpC,EACV,KAAK,EACL,MAAM,EACN,OAAO,EACP,OAAO,EACP,eAAe,GAChB,EAAE,cAAc;IA0GjB,OAAO,CAAC,aAAa;YAYP,kBAAkB;CAoCjC"}
|
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
import { EventType, ExtractorEventType } from '../../types/extraction';
|
|
2
2
|
import { LoaderEventType } from '../../types/loading';
|
|
3
|
+
import { TaskStatus } from '../../types/workers';
|
|
3
4
|
/**
|
|
4
|
-
*
|
|
5
|
-
* @
|
|
6
|
-
*
|
|
5
|
+
* Resolves the outgoing event type to emit for an incoming event type and a
|
|
6
|
+
* {@link TaskResult} status. Resumable phases honor every status
|
|
7
|
+
* (success/progress/delay/error -> *_DONE/*_PROGRESS/*_DELAYED/*_ERROR);
|
|
8
|
+
* non-resumable phases only have done/error, so `progress`/`delay` there is
|
|
9
|
+
* illegal and maps to the phase's error event.
|
|
7
10
|
*/
|
|
11
|
+
export declare function getEventTypeForResult(eventType: EventType, status: TaskStatus): {
|
|
12
|
+
eventType: ExtractorEventType | LoaderEventType;
|
|
13
|
+
illegal: boolean;
|
|
14
|
+
};
|
|
8
15
|
export declare function getTimeoutErrorEventType(eventType: EventType): {
|
|
9
16
|
eventType: ExtractorEventType | LoaderEventType;
|
|
10
17
|
};
|
|
11
|
-
/**
|
|
12
|
-
* Gets the event type for the no script error.
|
|
13
|
-
* @param {EventType} eventType - The event type to get the no script error event type for
|
|
14
|
-
* @returns {ExtractorEventType | LoaderEventType} The event type for the no script error
|
|
15
|
-
*/
|
|
18
|
+
/** Event type to emit when no worker script exists for the incoming event. */
|
|
16
19
|
export declare function getNoScriptEventType(eventType: EventType): {
|
|
17
|
-
eventType: ExtractorEventType;
|
|
18
|
-
} | {
|
|
19
|
-
eventType: LoaderEventType;
|
|
20
|
+
eventType: ExtractorEventType | LoaderEventType;
|
|
20
21
|
};
|
|
21
22
|
//# 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;;;;;;GAMG;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;AAuGD,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,SAAS,GAAG;IAC9D,SAAS,EAAE,kBAAkB,GAAG,eAAe,CAAC;CACjD,CAiEA;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS;eAwBhB,kBAAkB,GAAG,eAAe;EAG5E"}
|
|
@@ -1,66 +1,178 @@
|
|
|
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");
|
|
7
9
|
/**
|
|
8
|
-
*
|
|
9
|
-
* @
|
|
10
|
-
*
|
|
10
|
+
* Resolves the outgoing event type to emit for an incoming event type and a
|
|
11
|
+
* {@link TaskResult} status. Resumable phases honor every status
|
|
12
|
+
* (success/progress/delay/error -> *_DONE/*_PROGRESS/*_DELAYED/*_ERROR);
|
|
13
|
+
* non-resumable phases only have done/error, so `progress`/`delay` there is
|
|
14
|
+
* illegal and maps to the phase's error event.
|
|
11
15
|
*/
|
|
16
|
+
function getEventTypeForResult(eventType, status) {
|
|
17
|
+
const phase = EVENT_PHASE_MAP[eventType];
|
|
18
|
+
if (!phase) {
|
|
19
|
+
console.error('Event type not recognized in getEventTypeForResult function: ' +
|
|
20
|
+
eventType);
|
|
21
|
+
return {
|
|
22
|
+
eventType: constants_1.UNKNOWN_EVENT_TYPE,
|
|
23
|
+
illegal: true,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
// Non-resumable phases only define done/error events.
|
|
27
|
+
if (!phase.resumable) {
|
|
28
|
+
if (status === 'success') {
|
|
29
|
+
return { eventType: phase.done, illegal: false };
|
|
30
|
+
}
|
|
31
|
+
// progress/delay are illegal here; collapse them (and error) to the error event.
|
|
32
|
+
return { eventType: phase.error, illegal: status !== 'error' };
|
|
33
|
+
}
|
|
34
|
+
switch (status) {
|
|
35
|
+
case 'success':
|
|
36
|
+
return { eventType: phase.done, illegal: false };
|
|
37
|
+
case 'progress':
|
|
38
|
+
return { eventType: phase.progress, illegal: false };
|
|
39
|
+
case 'delay':
|
|
40
|
+
return { eventType: phase.delayed, illegal: false };
|
|
41
|
+
case 'error':
|
|
42
|
+
return { eventType: phase.error, illegal: false };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** Per-phase outgoing event types, keyed by the incoming {@link EventType}. */
|
|
46
|
+
const EVENT_PHASE_MAP = {
|
|
47
|
+
[extraction_1.EventType.StartExtractingExternalSyncUnits]: {
|
|
48
|
+
resumable: false,
|
|
49
|
+
done: extraction_1.ExtractorEventType.ExternalSyncUnitExtractionDone,
|
|
50
|
+
error: extraction_1.ExtractorEventType.ExternalSyncUnitExtractionError,
|
|
51
|
+
},
|
|
52
|
+
[extraction_1.EventType.StartExtractingMetadata]: {
|
|
53
|
+
resumable: false,
|
|
54
|
+
done: extraction_1.ExtractorEventType.MetadataExtractionDone,
|
|
55
|
+
error: extraction_1.ExtractorEventType.MetadataExtractionError,
|
|
56
|
+
},
|
|
57
|
+
[extraction_1.EventType.StartExtractingData]: {
|
|
58
|
+
resumable: true,
|
|
59
|
+
done: extraction_1.ExtractorEventType.DataExtractionDone,
|
|
60
|
+
error: extraction_1.ExtractorEventType.DataExtractionError,
|
|
61
|
+
progress: extraction_1.ExtractorEventType.DataExtractionProgress,
|
|
62
|
+
delayed: extraction_1.ExtractorEventType.DataExtractionDelayed,
|
|
63
|
+
},
|
|
64
|
+
[extraction_1.EventType.ContinueExtractingData]: {
|
|
65
|
+
resumable: true,
|
|
66
|
+
done: extraction_1.ExtractorEventType.DataExtractionDone,
|
|
67
|
+
error: extraction_1.ExtractorEventType.DataExtractionError,
|
|
68
|
+
progress: extraction_1.ExtractorEventType.DataExtractionProgress,
|
|
69
|
+
delayed: extraction_1.ExtractorEventType.DataExtractionDelayed,
|
|
70
|
+
},
|
|
71
|
+
[extraction_1.EventType.StartDeletingExtractorState]: {
|
|
72
|
+
resumable: false,
|
|
73
|
+
done: extraction_1.ExtractorEventType.ExtractorStateDeletionDone,
|
|
74
|
+
error: extraction_1.ExtractorEventType.ExtractorStateDeletionError,
|
|
75
|
+
},
|
|
76
|
+
[extraction_1.EventType.StartExtractingAttachments]: {
|
|
77
|
+
resumable: true,
|
|
78
|
+
done: extraction_1.ExtractorEventType.AttachmentExtractionDone,
|
|
79
|
+
error: extraction_1.ExtractorEventType.AttachmentExtractionError,
|
|
80
|
+
progress: extraction_1.ExtractorEventType.AttachmentExtractionProgress,
|
|
81
|
+
delayed: extraction_1.ExtractorEventType.AttachmentExtractionDelayed,
|
|
82
|
+
},
|
|
83
|
+
[extraction_1.EventType.ContinueExtractingAttachments]: {
|
|
84
|
+
resumable: true,
|
|
85
|
+
done: extraction_1.ExtractorEventType.AttachmentExtractionDone,
|
|
86
|
+
error: extraction_1.ExtractorEventType.AttachmentExtractionError,
|
|
87
|
+
progress: extraction_1.ExtractorEventType.AttachmentExtractionProgress,
|
|
88
|
+
delayed: extraction_1.ExtractorEventType.AttachmentExtractionDelayed,
|
|
89
|
+
},
|
|
90
|
+
[extraction_1.EventType.StartDeletingExtractorAttachmentsState]: {
|
|
91
|
+
resumable: false,
|
|
92
|
+
done: extraction_1.ExtractorEventType.ExtractorAttachmentsStateDeletionDone,
|
|
93
|
+
error: extraction_1.ExtractorEventType.ExtractorAttachmentsStateDeletionError,
|
|
94
|
+
},
|
|
95
|
+
[extraction_1.EventType.StartLoadingData]: {
|
|
96
|
+
resumable: true,
|
|
97
|
+
done: loading_1.LoaderEventType.DataLoadingDone,
|
|
98
|
+
error: loading_1.LoaderEventType.DataLoadingError,
|
|
99
|
+
progress: loading_1.LoaderEventType.DataLoadingProgress,
|
|
100
|
+
delayed: loading_1.LoaderEventType.DataLoadingDelayed,
|
|
101
|
+
},
|
|
102
|
+
[extraction_1.EventType.ContinueLoadingData]: {
|
|
103
|
+
resumable: true,
|
|
104
|
+
done: loading_1.LoaderEventType.DataLoadingDone,
|
|
105
|
+
error: loading_1.LoaderEventType.DataLoadingError,
|
|
106
|
+
progress: loading_1.LoaderEventType.DataLoadingProgress,
|
|
107
|
+
delayed: loading_1.LoaderEventType.DataLoadingDelayed,
|
|
108
|
+
},
|
|
109
|
+
[extraction_1.EventType.StartLoadingAttachments]: {
|
|
110
|
+
resumable: true,
|
|
111
|
+
done: loading_1.LoaderEventType.AttachmentLoadingDone,
|
|
112
|
+
error: loading_1.LoaderEventType.AttachmentLoadingError,
|
|
113
|
+
progress: loading_1.LoaderEventType.AttachmentLoadingProgress,
|
|
114
|
+
delayed: loading_1.LoaderEventType.AttachmentLoadingDelayed,
|
|
115
|
+
},
|
|
116
|
+
[extraction_1.EventType.ContinueLoadingAttachments]: {
|
|
117
|
+
resumable: true,
|
|
118
|
+
done: loading_1.LoaderEventType.AttachmentLoadingDone,
|
|
119
|
+
error: loading_1.LoaderEventType.AttachmentLoadingError,
|
|
120
|
+
progress: loading_1.LoaderEventType.AttachmentLoadingProgress,
|
|
121
|
+
delayed: loading_1.LoaderEventType.AttachmentLoadingDelayed,
|
|
122
|
+
},
|
|
123
|
+
[extraction_1.EventType.StartDeletingLoaderState]: {
|
|
124
|
+
resumable: false,
|
|
125
|
+
done: loading_1.LoaderEventType.LoaderStateDeletionDone,
|
|
126
|
+
error: loading_1.LoaderEventType.LoaderStateDeletionError,
|
|
127
|
+
},
|
|
128
|
+
[extraction_1.EventType.StartDeletingLoaderAttachmentState]: {
|
|
129
|
+
resumable: false,
|
|
130
|
+
done: loading_1.LoaderEventType.LoaderAttachmentStateDeletionDone,
|
|
131
|
+
error: loading_1.LoaderEventType.LoaderAttachmentStateDeletionError,
|
|
132
|
+
},
|
|
133
|
+
};
|
|
12
134
|
function getTimeoutErrorEventType(eventType) {
|
|
13
135
|
switch (eventType) {
|
|
14
|
-
// Metadata extraction
|
|
15
136
|
case extraction_1.EventType.StartExtractingMetadata:
|
|
16
137
|
return {
|
|
17
138
|
eventType: extraction_1.ExtractorEventType.MetadataExtractionError,
|
|
18
139
|
};
|
|
19
|
-
// Data extraction
|
|
20
140
|
case extraction_1.EventType.StartExtractingData:
|
|
21
141
|
case extraction_1.EventType.ContinueExtractingData:
|
|
22
142
|
return {
|
|
23
143
|
eventType: extraction_1.ExtractorEventType.DataExtractionError,
|
|
24
144
|
};
|
|
25
|
-
// Data deletion
|
|
26
145
|
case extraction_1.EventType.StartDeletingExtractorState:
|
|
27
146
|
return {
|
|
28
147
|
eventType: extraction_1.ExtractorEventType.ExtractorStateDeletionError,
|
|
29
148
|
};
|
|
30
|
-
// Attachments extraction
|
|
31
149
|
case extraction_1.EventType.StartExtractingAttachments:
|
|
32
150
|
case extraction_1.EventType.ContinueExtractingAttachments:
|
|
33
151
|
return {
|
|
34
152
|
eventType: extraction_1.ExtractorEventType.AttachmentExtractionError,
|
|
35
153
|
};
|
|
36
|
-
// Attachments deletion
|
|
37
154
|
case extraction_1.EventType.StartDeletingExtractorAttachmentsState:
|
|
38
155
|
return {
|
|
39
156
|
eventType: extraction_1.ExtractorEventType.ExtractorAttachmentsStateDeletionError,
|
|
40
157
|
};
|
|
41
|
-
// External sync units
|
|
42
158
|
case extraction_1.EventType.StartExtractingExternalSyncUnits:
|
|
43
159
|
return {
|
|
44
160
|
eventType: extraction_1.ExtractorEventType.ExternalSyncUnitExtractionError,
|
|
45
161
|
};
|
|
46
|
-
// Loading data
|
|
47
162
|
case extraction_1.EventType.StartLoadingData:
|
|
48
163
|
case extraction_1.EventType.ContinueLoadingData:
|
|
49
164
|
return {
|
|
50
165
|
eventType: loading_1.LoaderEventType.DataLoadingError,
|
|
51
166
|
};
|
|
52
|
-
// Deleting loader state
|
|
53
167
|
case extraction_1.EventType.StartDeletingLoaderState:
|
|
54
168
|
return {
|
|
55
169
|
eventType: loading_1.LoaderEventType.LoaderStateDeletionError,
|
|
56
170
|
};
|
|
57
|
-
// Loading attachments
|
|
58
171
|
case extraction_1.EventType.StartLoadingAttachments:
|
|
59
172
|
case extraction_1.EventType.ContinueLoadingAttachments:
|
|
60
173
|
return {
|
|
61
174
|
eventType: loading_1.LoaderEventType.AttachmentLoadingError,
|
|
62
175
|
};
|
|
63
|
-
// Deleting loader attachment state
|
|
64
176
|
case extraction_1.EventType.StartDeletingLoaderAttachmentState:
|
|
65
177
|
return {
|
|
66
178
|
eventType: loading_1.LoaderEventType.LoaderAttachmentStateDeletionError,
|
|
@@ -69,15 +181,11 @@ function getTimeoutErrorEventType(eventType) {
|
|
|
69
181
|
console.error('Event type not recognized in getTimeoutErrorEventType function: ' +
|
|
70
182
|
eventType);
|
|
71
183
|
return {
|
|
72
|
-
eventType:
|
|
184
|
+
eventType: constants_1.UNKNOWN_EVENT_TYPE,
|
|
73
185
|
};
|
|
74
186
|
}
|
|
75
187
|
}
|
|
76
|
-
/**
|
|
77
|
-
* Gets the event type for the no script error.
|
|
78
|
-
* @param {EventType} eventType - The event type to get the no script error event type for
|
|
79
|
-
* @returns {ExtractorEventType | LoaderEventType} The event type for the no script error
|
|
80
|
-
*/
|
|
188
|
+
/** Event type to emit when no worker script exists for the incoming event. */
|
|
81
189
|
function getNoScriptEventType(eventType) {
|
|
82
190
|
switch (eventType) {
|
|
83
191
|
case extraction_1.EventType.StartDeletingExtractorState:
|
|
@@ -100,7 +208,7 @@ function getNoScriptEventType(eventType) {
|
|
|
100
208
|
console.error('Event type not recognized in getNoScriptEventType function: ' +
|
|
101
209
|
eventType);
|
|
102
210
|
return {
|
|
103
|
-
eventType:
|
|
211
|
+
eventType: constants_1.UNKNOWN_EVENT_TYPE,
|
|
104
212
|
};
|
|
105
213
|
}
|
|
106
214
|
}
|
|
@@ -7,13 +7,13 @@ 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 constants_1 = require("../../common/constants");
|
|
11
11
|
const helpers_2 = require("../../common/helpers");
|
|
12
12
|
const logger_1 = require("../../logger/logger");
|
|
13
13
|
const extraction_1 = require("../../types/extraction");
|
|
14
14
|
const workers_1 = require("../../types/workers");
|
|
15
|
-
const constants_1 = require("../../common/constants");
|
|
16
15
|
const create_worker_1 = require("../create-worker");
|
|
16
|
+
const emit_1 = require("../emit");
|
|
17
17
|
const spawn_helpers_1 = require("./spawn.helpers");
|
|
18
18
|
function getWorkerPath({ event, workerBasePath, }) {
|
|
19
19
|
let path = null;
|
|
@@ -44,18 +44,11 @@ function getWorkerPath({ event, workerBasePath, }) {
|
|
|
44
44
|
return path ? workerBasePath + path : null;
|
|
45
45
|
}
|
|
46
46
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
* In case of lambda timeout, the class emits a lambda timeout event to the platform.
|
|
51
|
-
* @param {SpawnFactoryInterface} options - The options to create a new instance of Spawn class
|
|
52
|
-
* @param {AirSyncEvent} options.event - The event object received from the platform
|
|
53
|
-
* @param {object} options.initialState - The initial state of the adapter
|
|
54
|
-
* @param {string} [options.baseWorkerPath] - The base path for the worker files, usually `__dirname`
|
|
55
|
-
* @returns {Promise<Spawn>} - A new instance of Spawn class
|
|
47
|
+
* Spawns a worker thread for the event and manages its lifecycle (control
|
|
48
|
+
* events, graceful exit, lambda timeout handling). Resolves when the worker
|
|
49
|
+
* run is fully finished.
|
|
56
50
|
*/
|
|
57
51
|
async function spawn({ event, initialState, initialDomainMapping, options, baseWorkerPath, }) {
|
|
58
|
-
// Read the command line arguments to check if the local flag is passed.
|
|
59
52
|
const argv = await (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv)).argv;
|
|
60
53
|
if (argv._.includes('local') || argv.local) {
|
|
61
54
|
options = Object.assign(Object.assign({}, (options || {})), { isLocalDevelopment: true });
|
|
@@ -66,13 +59,13 @@ async function spawn({ event, initialState, initialDomainMapping, options, baseW
|
|
|
66
59
|
if (options === null || options === void 0 ? void 0 : options.isLocalDevelopment) {
|
|
67
60
|
console.log('Snap-in is running in local development mode.');
|
|
68
61
|
}
|
|
69
|
-
const eventType = event.payload.event_type;
|
|
70
62
|
let script = null;
|
|
71
63
|
if (baseWorkerPath != null &&
|
|
72
64
|
(options === null || options === void 0 ? void 0 : options.workerPathOverrides) != null &&
|
|
73
|
-
options.workerPathOverrides[
|
|
65
|
+
options.workerPathOverrides[event.payload.event_type] != null) {
|
|
74
66
|
script =
|
|
75
|
-
baseWorkerPath +
|
|
67
|
+
baseWorkerPath +
|
|
68
|
+
options.workerPathOverrides[event.payload.event_type];
|
|
76
69
|
}
|
|
77
70
|
else {
|
|
78
71
|
script = getWorkerPath({
|
|
@@ -80,7 +73,6 @@ async function spawn({ event, initialState, initialDomainMapping, options, baseW
|
|
|
80
73
|
workerBasePath: baseWorkerPath !== null && baseWorkerPath !== void 0 ? baseWorkerPath : __dirname,
|
|
81
74
|
});
|
|
82
75
|
}
|
|
83
|
-
// If a script is found for the event type, spawn a new worker.
|
|
84
76
|
if (script) {
|
|
85
77
|
try {
|
|
86
78
|
const worker = await (0, create_worker_1.createWorker)({
|
|
@@ -109,7 +101,7 @@ async function spawn({ event, initialState, initialDomainMapping, options, baseW
|
|
|
109
101
|
}
|
|
110
102
|
else {
|
|
111
103
|
const { eventType } = (0, spawn_helpers_1.getNoScriptEventType)(event.payload.event_type);
|
|
112
|
-
await (0,
|
|
104
|
+
await (0, emit_1.emit)({
|
|
113
105
|
event,
|
|
114
106
|
eventType,
|
|
115
107
|
});
|
|
@@ -130,7 +122,7 @@ class Spawn {
|
|
|
130
122
|
? Math.min(options.timeout, this.defaultLambdaTimeout)
|
|
131
123
|
: this.defaultLambdaTimeout;
|
|
132
124
|
this.resolve = resolve;
|
|
133
|
-
//
|
|
125
|
+
// Soft timeout: ask the worker to gracefully exit.
|
|
134
126
|
this.softTimeoutTimer = setTimeout(() => void (async () => {
|
|
135
127
|
console.log('SOFT TIMEOUT: Sending a message to the worker to gracefully exit.');
|
|
136
128
|
this.softTimeoutSent = true;
|
|
@@ -144,7 +136,7 @@ class Spawn {
|
|
|
144
136
|
await this.exitFromMainThread();
|
|
145
137
|
}
|
|
146
138
|
})(), this.lambdaTimeout);
|
|
147
|
-
//
|
|
139
|
+
// Hard timeout: the worker did not exit in time, terminate it.
|
|
148
140
|
this.hardTimeoutTimer = setTimeout(() => void (async () => {
|
|
149
141
|
console.error('HARD TIMEOUT: Worker did not exit in time. Terminating the worker.');
|
|
150
142
|
if (worker) {
|
|
@@ -155,13 +147,10 @@ class Spawn {
|
|
|
155
147
|
await this.exitFromMainThread();
|
|
156
148
|
}
|
|
157
149
|
})(), this.lambdaTimeout * constants_1.HARD_TIMEOUT_MULTIPLIER);
|
|
158
|
-
//
|
|
159
|
-
//
|
|
160
|
-
//
|
|
161
|
-
//
|
|
162
|
-
// handled first, preventing a race condition where exitFromMainThread sees
|
|
163
|
-
// alreadyEmitted=false and emits an error even though the worker
|
|
164
|
-
// successfully emitted an event.
|
|
150
|
+
// After a soft timeout, defer exit handling via setImmediate so pending
|
|
151
|
+
// WorkerMessage events (e.g. WorkerMessageEmitted from onTimeout) are
|
|
152
|
+
// handled first; otherwise exitFromMainThread could see
|
|
153
|
+
// alreadyEmitted=false and emit a spurious error.
|
|
165
154
|
worker.on(workers_1.WorkerEvent.WorkerExit, (code) => {
|
|
166
155
|
const handler = async () => {
|
|
167
156
|
console.info('Worker exited with exit code: ' + code + '.');
|
|
@@ -176,27 +165,23 @@ class Spawn {
|
|
|
176
165
|
}
|
|
177
166
|
});
|
|
178
167
|
worker.on(workers_1.WorkerEvent.WorkerMessage, (message) => {
|
|
179
|
-
var _a, _b, _c
|
|
180
|
-
//
|
|
181
|
-
//
|
|
182
|
-
// them in main thread.
|
|
168
|
+
var _a, _b, _c;
|
|
169
|
+
// The snap-in platform handles worker-thread logs differently, so worker
|
|
170
|
+
// log messages are re-logged in the main thread.
|
|
183
171
|
if ((message === null || message === void 0 ? void 0 : message.subject) === workers_1.WorkerMessageSubject.WorkerMessageLog) {
|
|
184
172
|
const stringifiedArgs = (_a = message.payload) === null || _a === void 0 ? void 0 : _a.stringifiedArgs;
|
|
185
173
|
const level = (_b = message.payload) === null || _b === void 0 ? void 0 : _b.level;
|
|
186
|
-
|
|
187
|
-
this.logger.logFn(stringifiedArgs, level, isSdkLog);
|
|
174
|
+
this.logger.logFn(stringifiedArgs, level);
|
|
188
175
|
}
|
|
189
|
-
// If worker sends a message that it has emitted an event, then set alreadyEmitted to true.
|
|
190
176
|
if ((message === null || message === void 0 ? void 0 : message.subject) === workers_1.WorkerMessageSubject.WorkerMessageEmitted) {
|
|
191
|
-
console.info('Worker has emitted message to
|
|
177
|
+
console.info('Worker has emitted message to AirSync.');
|
|
192
178
|
this.alreadyEmitted = true;
|
|
193
179
|
}
|
|
194
|
-
//
|
|
180
|
+
// Capture the worker's failure reason for use in the error event.
|
|
195
181
|
if ((message === null || message === void 0 ? void 0 : message.subject) === workers_1.WorkerMessageSubject.WorkerMessageFailed) {
|
|
196
|
-
this.workerFailedMessage = (
|
|
182
|
+
this.workerFailedMessage = (_c = message.payload) === null || _c === void 0 ? void 0 : _c.message;
|
|
197
183
|
}
|
|
198
184
|
});
|
|
199
|
-
// Log memory usage every 30 seconds
|
|
200
185
|
this.memoryMonitoringInterval = setInterval(() => {
|
|
201
186
|
try {
|
|
202
187
|
const memoryInfo = (0, helpers_2.getMemoryUsage)();
|
|
@@ -205,7 +190,7 @@ class Spawn {
|
|
|
205
190
|
}
|
|
206
191
|
}
|
|
207
192
|
catch (error) {
|
|
208
|
-
//
|
|
193
|
+
// Stop monitoring on failure to prevent repeated crashes
|
|
209
194
|
console.warn('Memory monitoring failed, stopping logging of memory usage interval', error);
|
|
210
195
|
if (this.memoryMonitoringInterval) {
|
|
211
196
|
clearInterval(this.memoryMonitoringInterval);
|
|
@@ -236,7 +221,7 @@ class Spawn {
|
|
|
236
221
|
this.alreadyEmitted = true;
|
|
237
222
|
const { eventType } = (0, spawn_helpers_1.getTimeoutErrorEventType)(this.event.payload.event_type);
|
|
238
223
|
try {
|
|
239
|
-
await (0,
|
|
224
|
+
await (0, emit_1.emit)({
|
|
240
225
|
eventType,
|
|
241
226
|
event: this.event,
|
|
242
227
|
data: {
|
|
@@ -2,8 +2,5 @@
|
|
|
2
2
|
const { workerData } = require('node:worker_threads');
|
|
3
3
|
require('ts-node').register();
|
|
4
4
|
const { Logger } = require('../logger/logger');
|
|
5
|
-
const { runWithUserLogContext } = require('../logger/logger.context');
|
|
6
5
|
console = new Logger({ event: workerData.event, options: workerData.options });
|
|
7
|
-
|
|
8
|
-
require(workerData.workerPath);
|
|
9
|
-
});
|
|
6
|
+
require(workerData.workerPath);
|