web-csv-toolbox 0.13.0-next-bd865d6ddb1cf9691d7b9a83d0790651f074dd47 → 0.13.0-next-b21b6d89a7a3f18dcbf79ec04ffefde0d7ff4c4c
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 +132 -6
- package/dist/CSVLexer.js.map +1 -1
- package/dist/CSVLexerTransformer.d.ts +52 -3
- package/dist/CSVLexerTransformer.js +58 -13
- package/dist/CSVLexerTransformer.js.map +1 -1
- package/dist/CSVRecordAssembler.js.map +1 -1
- package/dist/CSVRecordAssemblerTransformer.d.ts +49 -3
- package/dist/CSVRecordAssemblerTransformer.js +55 -18
- package/dist/CSVRecordAssemblerTransformer.js.map +1 -1
- package/dist/_virtual/web_csv_toolbox_wasm_bg.wasm.js +1 -1
- package/dist/assertCommonOptions.js.map +1 -1
- package/dist/common/constants.js.map +1 -1
- package/dist/common/errors.js.map +1 -1
- package/dist/common/types.d.ts +336 -14
- package/dist/commonParseErrorHandling.js.map +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/createWorker.node.d.ts +2 -0
- package/dist/createWorker.web.d.ts +2 -0
- package/dist/execution/EnginePresets.d.ts +143 -0
- package/dist/execution/EnginePresets.js +129 -0
- package/dist/execution/EnginePresets.js.map +1 -0
- package/dist/execution/InternalEngineConfig.d.ts +89 -0
- package/dist/execution/InternalEngineConfig.js +175 -0
- package/dist/execution/InternalEngineConfig.js.map +1 -0
- package/dist/execution/main/parseBinaryInMain.d.ts +12 -0
- package/dist/execution/main/parseStreamInMain.d.ts +12 -0
- package/dist/execution/main/parseStringInMain.d.ts +12 -0
- package/dist/execution/main/parseUint8ArrayStreamInMain.d.ts +12 -0
- package/dist/execution/wasm/parseBinaryInWASM.d.ts +18 -0
- package/dist/execution/wasm/parseBinaryInWASM.js +15 -0
- package/dist/execution/wasm/parseBinaryInWASM.js.map +1 -0
- package/dist/execution/wasm/parseStringInWASM.d.ts +16 -0
- package/dist/execution/worker/helpers/ReusableWorkerPool.d.ts +152 -0
- package/dist/execution/worker/helpers/ReusableWorkerPool.js +238 -0
- package/dist/execution/worker/helpers/ReusableWorkerPool.js.map +1 -0
- package/dist/execution/worker/helpers/TransientWorkerPool.d.ts +89 -0
- package/dist/execution/worker/helpers/WorkerManager.d.ts +27 -0
- package/dist/execution/worker/helpers/WorkerPool.d.ts +50 -0
- package/dist/execution/worker/helpers/WorkerSession.d.ts +78 -0
- package/dist/execution/worker/helpers/WorkerSession.js +58 -0
- package/dist/execution/worker/helpers/WorkerSession.js.map +1 -0
- package/dist/execution/worker/helpers/createWorker.node.d.ts +8 -0
- package/dist/execution/worker/helpers/createWorker.node.js +15 -0
- package/dist/execution/worker/helpers/createWorker.node.js.map +1 -0
- package/dist/execution/worker/helpers/createWorker.web.d.ts +8 -0
- package/dist/execution/worker/helpers/createWorker.web.js +11 -0
- package/dist/execution/worker/helpers/createWorker.web.js.map +1 -0
- package/dist/execution/worker/helpers/worker.node.d.ts +1 -0
- package/dist/execution/worker/helpers/worker.node.js +11 -0
- package/dist/execution/worker/helpers/worker.node.js.map +1 -0
- package/dist/execution/worker/helpers/worker.shared.d.ts +90 -0
- package/dist/execution/worker/helpers/worker.shared.js +241 -0
- package/dist/execution/worker/helpers/worker.shared.js.map +1 -0
- package/dist/execution/worker/helpers/worker.web.d.ts +1 -0
- package/dist/execution/worker/helpers/worker.web.js +16 -0
- package/dist/execution/worker/helpers/worker.web.js.map +1 -0
- package/dist/execution/worker/parseBinaryInWorker.node.d.ts +8 -0
- package/dist/execution/worker/parseBinaryInWorker.node.js +24 -0
- package/dist/execution/worker/parseBinaryInWorker.node.js.map +1 -0
- package/dist/execution/worker/parseBinaryInWorker.web.d.ts +8 -0
- package/dist/execution/worker/parseBinaryInWorker.web.js +24 -0
- package/dist/execution/worker/parseBinaryInWorker.web.js.map +1 -0
- package/dist/execution/worker/parseBinaryInWorkerWASM.node.d.ts +8 -0
- package/dist/execution/worker/parseBinaryInWorkerWASM.node.js +24 -0
- package/dist/execution/worker/parseBinaryInWorkerWASM.node.js.map +1 -0
- package/dist/execution/worker/parseBinaryInWorkerWASM.web.d.ts +8 -0
- package/dist/execution/worker/parseBinaryInWorkerWASM.web.js +24 -0
- package/dist/execution/worker/parseBinaryInWorkerWASM.web.js.map +1 -0
- package/dist/execution/worker/parseStreamInWorker.node.d.ts +15 -0
- package/dist/execution/worker/parseStreamInWorker.node.js +26 -0
- package/dist/execution/worker/parseStreamInWorker.node.js.map +1 -0
- package/dist/execution/worker/parseStreamInWorker.web.d.ts +12 -0
- package/dist/execution/worker/parseStreamInWorker.web.js +25 -0
- package/dist/execution/worker/parseStreamInWorker.web.js.map +1 -0
- package/dist/execution/worker/parseStringInWorker.node.d.ts +11 -0
- package/dist/execution/worker/parseStringInWorker.node.js +24 -0
- package/dist/execution/worker/parseStringInWorker.node.js.map +1 -0
- package/dist/execution/worker/parseStringInWorker.web.d.ts +11 -0
- package/dist/execution/worker/parseStringInWorker.web.js +24 -0
- package/dist/execution/worker/parseStringInWorker.web.js.map +1 -0
- package/dist/execution/worker/parseStringInWorkerWASM.node.d.ts +8 -0
- package/dist/execution/worker/parseStringInWorkerWASM.node.js +24 -0
- package/dist/execution/worker/parseStringInWorkerWASM.node.js.map +1 -0
- package/dist/execution/worker/parseStringInWorkerWASM.web.d.ts +8 -0
- package/dist/execution/worker/parseStringInWorkerWASM.web.js +24 -0
- package/dist/execution/worker/parseStringInWorkerWASM.web.js.map +1 -0
- package/dist/execution/worker/parseUint8ArrayStreamInWorker.node.d.ts +12 -0
- package/dist/execution/worker/parseUint8ArrayStreamInWorker.node.js +26 -0
- package/dist/execution/worker/parseUint8ArrayStreamInWorker.node.js.map +1 -0
- package/dist/execution/worker/parseUint8ArrayStreamInWorker.web.d.ts +9 -0
- package/dist/execution/worker/parseUint8ArrayStreamInWorker.web.js +25 -0
- package/dist/execution/worker/parseUint8ArrayStreamInWorker.web.js.map +1 -0
- package/dist/execution/worker/strategies/MessageStreamingStrategy.d.ts +17 -0
- package/dist/execution/worker/strategies/MessageStreamingStrategy.js +58 -0
- package/dist/execution/worker/strategies/MessageStreamingStrategy.js.map +1 -0
- package/dist/execution/worker/strategies/TransferableStreamStrategy.d.ts +25 -0
- package/dist/execution/worker/strategies/TransferableStreamStrategy.js +159 -0
- package/dist/execution/worker/strategies/TransferableStreamStrategy.js.map +1 -0
- package/dist/execution/worker/strategies/WorkerStrategy.d.ts +27 -0
- package/dist/execution/worker/strategies/WorkerStrategySelector.d.ts +43 -0
- package/dist/execution/worker/strategies/WorkerStrategySelector.js +89 -0
- package/dist/execution/worker/strategies/WorkerStrategySelector.js.map +1 -0
- package/dist/execution/worker/utils/messageHandler.d.ts +21 -0
- package/dist/execution/worker/utils/messageHandler.js +109 -0
- package/dist/execution/worker/utils/messageHandler.js.map +1 -0
- package/dist/execution/worker/utils/serializeOptions.d.ts +9 -0
- package/dist/execution/worker/utils/serializeOptions.js +14 -0
- package/dist/execution/worker/utils/serializeOptions.js.map +1 -0
- package/dist/execution/worker/utils/streamCollector.node.d.ts +14 -0
- package/dist/execution/worker/utils/streamCollector.node.js +78 -0
- package/dist/execution/worker/utils/streamCollector.node.js.map +1 -0
- package/dist/execution/worker/utils/workerUtils.d.ts +14 -0
- package/dist/execution/worker/utils/workerUtils.js +25 -0
- package/dist/execution/worker/utils/workerUtils.js.map +1 -0
- package/dist/getOptionsFromResponse.constants.node.d.ts +10 -0
- package/dist/getOptionsFromResponse.constants.node.js +8 -0
- package/dist/getOptionsFromResponse.constants.node.js.map +1 -0
- package/dist/getOptionsFromResponse.constants.web.d.ts +30 -0
- package/dist/getOptionsFromResponse.constants.web.js +7 -0
- package/dist/getOptionsFromResponse.constants.web.js.map +1 -0
- package/dist/getOptionsFromResponse.d.ts +2 -1
- package/dist/getOptionsFromResponse.js +5 -9
- package/dist/getOptionsFromResponse.js.map +1 -1
- package/dist/loadWASM.js.map +1 -1
- package/dist/loadWASM.web.js.map +1 -1
- package/dist/parse.d.ts +1 -1
- package/dist/parse.js +29 -5
- package/dist/parse.js.map +1 -1
- package/dist/parseBinary.d.ts +2 -1
- package/dist/parseBinary.js +32 -3
- package/dist/parseBinary.js.map +1 -1
- package/dist/parseBinaryInWorker.node.d.ts +2 -0
- package/dist/parseBinaryInWorker.web.d.ts +2 -0
- package/dist/parseBinaryInWorkerWASM.node.d.ts +2 -0
- package/dist/parseBinaryInWorkerWASM.web.d.ts +2 -0
- package/dist/parseBinaryToArraySync.d.ts +2 -1
- package/dist/parseBinaryToArraySync.js.map +1 -1
- package/dist/parseBinaryToIterableIterator.d.ts +2 -1
- package/dist/parseBinaryToIterableIterator.js.map +1 -1
- package/dist/parseBinaryToStream.d.ts +2 -1
- package/dist/parseBinaryToStream.js.map +1 -1
- package/dist/parseResponse.d.ts +1 -1
- package/dist/parseResponse.js +15 -8
- package/dist/parseResponse.js.map +1 -1
- package/dist/parseResponseToStream.d.ts +2 -1
- package/dist/parseResponseToStream.js.map +1 -1
- package/dist/parseStreamInWorker.node.d.ts +2 -0
- package/dist/parseStreamInWorker.web.d.ts +2 -0
- package/dist/parseString.d.ts +31 -0
- package/dist/parseString.js +27 -1
- package/dist/parseString.js.map +1 -1
- package/dist/parseStringInWorker.node.d.ts +2 -0
- package/dist/parseStringInWorker.web.d.ts +2 -0
- package/dist/parseStringInWorkerWASM.node.d.ts +2 -0
- package/dist/parseStringInWorkerWASM.web.d.ts +2 -0
- package/dist/parseStringStream.d.ts +43 -1
- package/dist/parseStringStream.js +24 -3
- package/dist/parseStringStream.js.map +1 -1
- package/dist/parseStringStreamToStream.js.map +1 -1
- package/dist/parseStringToArraySync.js.map +1 -1
- package/dist/parseStringToArraySyncWASM.js.map +1 -1
- package/dist/parseStringToIterableIterator.js.map +1 -1
- package/dist/parseStringToStream.js.map +1 -1
- package/dist/parseUint8ArrayStream.d.ts +4 -3
- package/dist/parseUint8ArrayStream.js +24 -3
- package/dist/parseUint8ArrayStream.js.map +1 -1
- package/dist/parseUint8ArrayStreamInWorker.node.d.ts +2 -0
- package/dist/parseUint8ArrayStreamInWorker.web.d.ts +2 -0
- package/dist/parseUint8ArrayStreamToStream.d.ts +2 -1
- package/dist/parseUint8ArrayStreamToStream.js +11 -5
- package/dist/parseUint8ArrayStreamToStream.js.map +1 -1
- package/dist/utils/convertBinaryToString.js.map +1 -1
- package/dist/utils/convertIterableIteratorToAsync.js.map +1 -1
- package/dist/utils/convertStreamToAsyncIterableIterator.js +2 -2
- package/dist/utils/convertStreamToAsyncIterableIterator.js.map +1 -1
- package/dist/utils/convertThisAsyncIterableIteratorToArray.d.ts +1 -1
- package/dist/utils/convertThisAsyncIterableIteratorToArray.js.map +1 -1
- package/dist/utils/escapeRegExp.js.map +1 -1
- package/dist/utils/parseMime.js.map +1 -1
- package/dist/utils/pipeline.js.map +1 -1
- package/dist/web-csv-toolbox.d.ts +4 -0
- package/dist/web-csv-toolbox.js +3 -0
- package/dist/web-csv-toolbox.js.map +1 -1
- package/dist/web_csv_toolbox_wasm_bg.wasm +0 -0
- package/dist/worker.node.d.ts +1 -0
- package/dist/worker.web.d.ts +1 -0
- package/package.json +53 -10
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { CSVBinary, ParseBinaryOptions, ParseOptions } from '../../../common/types.ts';
|
|
2
|
+
import { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from '../../../constants.ts';
|
|
3
|
+
import { InternalEngineConfig } from '../../InternalEngineConfig.ts';
|
|
4
|
+
import { WorkerSession } from '../helpers/WorkerSession.ts';
|
|
5
|
+
/**
|
|
6
|
+
* Worker strategy interface.
|
|
7
|
+
*
|
|
8
|
+
* Defines how data is communicated between main thread and worker thread.
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export interface WorkerStrategy<T = any> {
|
|
13
|
+
/**
|
|
14
|
+
* Strategy name.
|
|
15
|
+
*/
|
|
16
|
+
readonly name: string;
|
|
17
|
+
/**
|
|
18
|
+
* Execute parsing with this strategy.
|
|
19
|
+
*
|
|
20
|
+
* @param input - Input data (string, binary, or stream)
|
|
21
|
+
* @param options - Parse options
|
|
22
|
+
* @param session - Worker session (can be null for single-use worker)
|
|
23
|
+
* @param engineConfig - Engine configuration
|
|
24
|
+
* @returns Async iterable iterator of parsed records
|
|
25
|
+
*/
|
|
26
|
+
execute<Header extends ReadonlyArray<string> = readonly string[], Delimiter extends string = DEFAULT_DELIMITER, Quotation extends string = DEFAULT_QUOTATION>(input: string | CSVBinary | ReadableStream<string>, options: ParseOptions<Header, Delimiter, Quotation> | ParseBinaryOptions<Header, Delimiter, Quotation> | undefined, session: WorkerSession | null, engineConfig: InternalEngineConfig): AsyncIterableIterator<T>;
|
|
27
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { CSVBinary, ParseBinaryOptions, ParseOptions } from '../../../common/types.ts';
|
|
2
|
+
import { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from '../../../constants.ts';
|
|
3
|
+
import { InternalEngineConfig } from '../../InternalEngineConfig.ts';
|
|
4
|
+
import { WorkerSession } from '../helpers/WorkerSession.ts';
|
|
5
|
+
import { WorkerStrategy } from './WorkerStrategy.ts';
|
|
6
|
+
/**
|
|
7
|
+
* Worker strategy selector.
|
|
8
|
+
*
|
|
9
|
+
* Selects and executes the appropriate worker communication strategy based on engine configuration.
|
|
10
|
+
* Handles fallback from stream-transfer to message-streaming if needed.
|
|
11
|
+
*
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
export declare class WorkerStrategySelector {
|
|
15
|
+
private strategies;
|
|
16
|
+
constructor();
|
|
17
|
+
/**
|
|
18
|
+
* Register a worker strategy.
|
|
19
|
+
*/
|
|
20
|
+
register(strategy: WorkerStrategy): void;
|
|
21
|
+
/**
|
|
22
|
+
* Execute with the appropriate strategy based on engine configuration.
|
|
23
|
+
*
|
|
24
|
+
* @param input - Input data
|
|
25
|
+
* @param options - Parse options
|
|
26
|
+
* @param session - Worker session (can be null)
|
|
27
|
+
* @param engineConfig - Engine configuration
|
|
28
|
+
* @returns Async iterable iterator of parsed records
|
|
29
|
+
*/
|
|
30
|
+
execute<T, Header extends ReadonlyArray<string> = readonly string[], Delimiter extends string = DEFAULT_DELIMITER, Quotation extends string = DEFAULT_QUOTATION>(input: string | CSVBinary | ReadableStream<string>, options: ParseOptions<Header, Delimiter, Quotation> | ParseBinaryOptions<Header, Delimiter, Quotation> | undefined, session: WorkerSession | null, engineConfig: InternalEngineConfig): AsyncIterableIterator<T>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Execute parsing with worker strategy.
|
|
34
|
+
*
|
|
35
|
+
* @internal
|
|
36
|
+
*/
|
|
37
|
+
export declare function executeWithWorkerStrategy<T, Header extends ReadonlyArray<string> = readonly string[], Delimiter extends string = DEFAULT_DELIMITER, Quotation extends string = DEFAULT_QUOTATION>(input: string | CSVBinary | ReadableStream<string>, options: ParseOptions<Header, Delimiter, Quotation> | ParseBinaryOptions<Header, Delimiter, Quotation> | undefined, session: WorkerSession | null, engineConfig: InternalEngineConfig): AsyncIterableIterator<T>;
|
|
38
|
+
/**
|
|
39
|
+
* Register a custom worker strategy.
|
|
40
|
+
*
|
|
41
|
+
* @internal
|
|
42
|
+
*/
|
|
43
|
+
export declare function registerWorkerStrategy(strategy: WorkerStrategy): void;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { MessageStreamingStrategy } from './MessageStreamingStrategy.js';
|
|
2
|
+
import { TransferableStreamStrategy } from './TransferableStreamStrategy.js';
|
|
3
|
+
|
|
4
|
+
class WorkerStrategySelector {
|
|
5
|
+
strategies = /* @__PURE__ */ new Map();
|
|
6
|
+
constructor() {
|
|
7
|
+
this.register(new MessageStreamingStrategy());
|
|
8
|
+
this.register(new TransferableStreamStrategy());
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Register a worker strategy.
|
|
12
|
+
*/
|
|
13
|
+
register(strategy) {
|
|
14
|
+
this.strategies.set(strategy.name, strategy);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Execute with the appropriate strategy based on engine configuration.
|
|
18
|
+
*
|
|
19
|
+
* @param input - Input data
|
|
20
|
+
* @param options - Parse options
|
|
21
|
+
* @param session - Worker session (can be null)
|
|
22
|
+
* @param engineConfig - Engine configuration
|
|
23
|
+
* @returns Async iterable iterator of parsed records
|
|
24
|
+
*/
|
|
25
|
+
async *execute(input, options, session, engineConfig) {
|
|
26
|
+
const requestedStrategy = engineConfig.hasStreamTransfer() ? "stream-transfer" : "message-streaming";
|
|
27
|
+
const strategy = this.strategies.get(requestedStrategy);
|
|
28
|
+
if (!strategy) {
|
|
29
|
+
if (requestedStrategy === "stream-transfer") {
|
|
30
|
+
const fallbackStrategy = this.strategies.get("message-streaming");
|
|
31
|
+
if (fallbackStrategy) {
|
|
32
|
+
if (engineConfig.onFallback) {
|
|
33
|
+
const fallbackConfig = engineConfig.createFallbackConfig();
|
|
34
|
+
engineConfig.onFallback({
|
|
35
|
+
requestedConfig: engineConfig.toConfig(),
|
|
36
|
+
actualConfig: fallbackConfig.toConfig(),
|
|
37
|
+
reason: "TransferableStream strategy not available",
|
|
38
|
+
error: void 0
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
yield* fallbackStrategy.execute(
|
|
42
|
+
input,
|
|
43
|
+
options,
|
|
44
|
+
session,
|
|
45
|
+
engineConfig
|
|
46
|
+
);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
throw new Error(`Worker strategy "${requestedStrategy}" not available`);
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
yield* strategy.execute(input, options, session, engineConfig);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
if (engineConfig.hasStrict()) {
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
if (requestedStrategy === "stream-transfer") {
|
|
59
|
+
const fallbackStrategy = this.strategies.get("message-streaming");
|
|
60
|
+
if (fallbackStrategy) {
|
|
61
|
+
const fallbackConfig = engineConfig.createFallbackConfig();
|
|
62
|
+
if (engineConfig.onFallback) {
|
|
63
|
+
engineConfig.onFallback({
|
|
64
|
+
requestedConfig: engineConfig.toConfig(),
|
|
65
|
+
actualConfig: fallbackConfig.toConfig(),
|
|
66
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
67
|
+
error: error instanceof Error ? error : void 0
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
yield* fallbackStrategy.execute(
|
|
71
|
+
input,
|
|
72
|
+
options,
|
|
73
|
+
session,
|
|
74
|
+
fallbackConfig
|
|
75
|
+
);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const globalSelector = new WorkerStrategySelector();
|
|
84
|
+
function executeWithWorkerStrategy(input, options, session, engineConfig) {
|
|
85
|
+
return globalSelector.execute(input, options, session, engineConfig);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export { WorkerStrategySelector, executeWithWorkerStrategy };
|
|
89
|
+
//# sourceMappingURL=WorkerStrategySelector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerStrategySelector.js","sources":["../../../../src/execution/worker/strategies/WorkerStrategySelector.ts"],"sourcesContent":["import type {\n CSVBinary,\n ParseBinaryOptions,\n ParseOptions,\n} from \"../../../common/types.ts\";\nimport type {\n DEFAULT_DELIMITER,\n DEFAULT_QUOTATION,\n} from \"../../../constants.ts\";\nimport type { InternalEngineConfig } from \"../../InternalEngineConfig.ts\";\nimport type { WorkerSession } from \"../helpers/WorkerSession.ts\";\nimport { MessageStreamingStrategy } from \"./MessageStreamingStrategy.ts\";\nimport { TransferableStreamStrategy } from \"./TransferableStreamStrategy.ts\";\nimport type { WorkerStrategy } from \"./WorkerStrategy.ts\";\n\n/**\n * Worker strategy selector.\n *\n * Selects and executes the appropriate worker communication strategy based on engine configuration.\n * Handles fallback from stream-transfer to message-streaming if needed.\n *\n * @internal\n */\nexport class WorkerStrategySelector {\n private strategies = new Map<string, WorkerStrategy>();\n\n constructor() {\n // Register default strategies\n this.register(new MessageStreamingStrategy());\n this.register(new TransferableStreamStrategy());\n }\n\n /**\n * Register a worker strategy.\n */\n register(strategy: WorkerStrategy): void {\n this.strategies.set(strategy.name, strategy);\n }\n\n /**\n * Execute with the appropriate strategy based on engine configuration.\n *\n * @param input - Input data\n * @param options - Parse options\n * @param session - Worker session (can be null)\n * @param engineConfig - Engine configuration\n * @returns Async iterable iterator of parsed records\n */\n async *execute<\n T,\n Header extends ReadonlyArray<string> = readonly string[],\n Delimiter extends string = DEFAULT_DELIMITER,\n Quotation extends string = DEFAULT_QUOTATION,\n >(\n input: string | CSVBinary | ReadableStream<string>,\n options:\n | ParseOptions<Header, Delimiter, Quotation>\n | ParseBinaryOptions<Header, Delimiter, Quotation>\n | undefined,\n session: WorkerSession | null,\n engineConfig: InternalEngineConfig,\n ): AsyncIterableIterator<T> {\n // Determine which strategy to use\n const requestedStrategy = engineConfig.hasStreamTransfer()\n ? \"stream-transfer\"\n : \"message-streaming\";\n\n const strategy = this.strategies.get(requestedStrategy);\n\n if (!strategy) {\n // If stream-transfer is not available, fallback to message-streaming\n if (requestedStrategy === \"stream-transfer\") {\n const fallbackStrategy = this.strategies.get(\"message-streaming\");\n if (fallbackStrategy) {\n // Notify about fallback\n if (engineConfig.onFallback) {\n const fallbackConfig = engineConfig.createFallbackConfig();\n engineConfig.onFallback({\n requestedConfig: engineConfig.toConfig(),\n actualConfig: fallbackConfig.toConfig(),\n reason: \"TransferableStream strategy not available\",\n error: undefined,\n });\n }\n\n yield* fallbackStrategy.execute(\n input,\n options,\n session,\n engineConfig,\n );\n return;\n }\n }\n\n throw new Error(`Worker strategy \"${requestedStrategy}\" not available`);\n }\n\n try {\n // Execute with the requested strategy\n yield* strategy.execute(input, options, session, engineConfig);\n } catch (error) {\n // Handle fallback if not in strict mode\n if (engineConfig.hasStrict()) {\n // Strict mode: re-throw error\n throw error;\n }\n\n // Auto-fallback to message-streaming\n if (requestedStrategy === \"stream-transfer\") {\n const fallbackStrategy = this.strategies.get(\"message-streaming\");\n if (fallbackStrategy) {\n // Notify about fallback\n const fallbackConfig = engineConfig.createFallbackConfig();\n if (engineConfig.onFallback) {\n engineConfig.onFallback({\n requestedConfig: engineConfig.toConfig(),\n actualConfig: fallbackConfig.toConfig(),\n reason: error instanceof Error ? error.message : String(error),\n error: error instanceof Error ? error : undefined,\n });\n }\n\n // Execute with fallback strategy\n yield* fallbackStrategy.execute(\n input,\n options,\n session,\n fallbackConfig,\n );\n return;\n }\n }\n\n // No fallback available, re-throw\n throw error;\n }\n }\n}\n\n// Global instance\nconst globalSelector = new WorkerStrategySelector();\n\n/**\n * Execute parsing with worker strategy.\n *\n * @internal\n */\nexport function executeWithWorkerStrategy<\n T,\n Header extends ReadonlyArray<string> = readonly string[],\n Delimiter extends string = DEFAULT_DELIMITER,\n Quotation extends string = DEFAULT_QUOTATION,\n>(\n input: string | CSVBinary | ReadableStream<string>,\n options:\n | ParseOptions<Header, Delimiter, Quotation>\n | ParseBinaryOptions<Header, Delimiter, Quotation>\n | undefined,\n session: WorkerSession | null,\n engineConfig: InternalEngineConfig,\n): AsyncIterableIterator<T> {\n return globalSelector.execute(input, options, session, engineConfig);\n}\n\n/**\n * Register a custom worker strategy.\n *\n * @internal\n */\nexport function registerWorkerStrategy(strategy: WorkerStrategy): void {\n globalSelector.register(strategy);\n}\n"],"names":[],"mappings":";;;AAuBO,MAAM,sBAAA,CAAuB;AAAA,EAC1B,UAAA,uBAAiB,GAAA,EAA4B;AAAA,EAErD,WAAA,GAAc;AAEZ,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,wBAAA,EAA0B,CAAA;AAC5C,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,0BAAA,EAA4B,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,QAAA,EAAgC;AACvC,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,OAAA,CAML,KAAA,EACA,OAAA,EAIA,SACA,YAAA,EAC0B;AAE1B,IAAA,MAAM,iBAAA,GAAoB,YAAA,CAAa,iBAAA,EAAkB,GACrD,iBAAA,GACA,mBAAA;AAEJ,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,iBAAiB,CAAA;AAEtD,IAAA,IAAI,CAAC,QAAA,EAAU;AAEb,MAAA,IAAI,sBAAsB,iBAAA,EAAmB;AAC3C,QAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,mBAAmB,CAAA;AAChE,QAAA,IAAI,gBAAA,EAAkB;AAEpB,UAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,YAAA,MAAM,cAAA,GAAiB,aAAa,oBAAA,EAAqB;AACzD,YAAA,YAAA,CAAa,UAAA,CAAW;AAAA,cACtB,eAAA,EAAiB,aAAa,QAAA,EAAS;AAAA,cACvC,YAAA,EAAc,eAAe,QAAA,EAAS;AAAA,cACtC,MAAA,EAAQ,2CAAA;AAAA,cACR,KAAA,EAAO;AAAA,aACR,CAAA;AAAA,UACH;AAEA,UAAA,OAAO,gBAAA,CAAiB,OAAA;AAAA,YACtB,KAAA;AAAA,YACA,OAAA;AAAA,YACA,OAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,iBAAiB,CAAA,eAAA,CAAiB,CAAA;AAAA,IACxE;AAEA,IAAA,IAAI;AAEF,MAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,OAAA,EAAS,SAAS,YAAY,CAAA;AAAA,IAC/D,SAAS,KAAA,EAAO;AAEd,MAAA,IAAI,YAAA,CAAa,WAAU,EAAG;AAE5B,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,IAAI,sBAAsB,iBAAA,EAAmB;AAC3C,QAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,mBAAmB,CAAA;AAChE,QAAA,IAAI,gBAAA,EAAkB;AAEpB,UAAA,MAAM,cAAA,GAAiB,aAAa,oBAAA,EAAqB;AACzD,UAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,YAAA,YAAA,CAAa,UAAA,CAAW;AAAA,cACtB,eAAA,EAAiB,aAAa,QAAA,EAAS;AAAA,cACvC,YAAA,EAAc,eAAe,QAAA,EAAS;AAAA,cACtC,QAAQ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,cAC7D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,aACzC,CAAA;AAAA,UACH;AAGA,UAAA,OAAO,gBAAA,CAAiB,OAAA;AAAA,YACtB,KAAA;AAAA,YACA,OAAA;AAAA,YACA,OAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA;AAAA,QACF;AAAA,MACF;AAGA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF;AAGA,MAAM,cAAA,GAAiB,IAAI,sBAAA,EAAuB;AAO3C,SAAS,yBAAA,CAMd,KAAA,EACA,OAAA,EAIA,OAAA,EACA,YAAA,EAC0B;AAC1B,EAAA,OAAO,cAAA,CAAe,OAAA,CAAQ,KAAA,EAAO,OAAA,EAAS,SAAS,YAAY,CAAA;AACrE;;;;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ParseBinaryOptions, ParseOptions, CSVBinary } from '../../../common/types.ts';
|
|
2
|
+
import { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from '../../../constants.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Message to send to worker.
|
|
5
|
+
*
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export interface WorkerMessage {
|
|
9
|
+
id: number;
|
|
10
|
+
type: string;
|
|
11
|
+
data: string | CSVBinary | ReadableStream<string>;
|
|
12
|
+
options?: Record<string, unknown>;
|
|
13
|
+
useWASM?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Send a message to worker and receive streaming response.
|
|
17
|
+
* Handles abort signals, cleanup, and error handling.
|
|
18
|
+
*
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
export declare function sendWorkerMessage<T, Header extends ReadonlyArray<string> = readonly string[], Delimiter extends string = DEFAULT_DELIMITER, Quotation extends string = DEFAULT_QUOTATION>(worker: Worker, message: WorkerMessage, options?: ParseOptions<Header, Delimiter, Quotation> | ParseBinaryOptions<Header, Delimiter, Quotation>, transfer?: Transferable[]): AsyncIterableIterator<T>;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { addListener, removeListener } from './workerUtils.js';
|
|
2
|
+
|
|
3
|
+
async function* sendWorkerMessage(worker, message, options, transfer) {
|
|
4
|
+
let resolveNext = null;
|
|
5
|
+
let done = false;
|
|
6
|
+
let error = null;
|
|
7
|
+
const handler = (event) => {
|
|
8
|
+
const data = event.data;
|
|
9
|
+
if (data.id === message.id) {
|
|
10
|
+
if (data.type === "record" && data.record !== void 0) {
|
|
11
|
+
if (resolveNext) {
|
|
12
|
+
const resolve = resolveNext;
|
|
13
|
+
resolveNext = null;
|
|
14
|
+
resolve({ value: data.record, done: false });
|
|
15
|
+
}
|
|
16
|
+
} else if (data.type === "done") {
|
|
17
|
+
done = true;
|
|
18
|
+
if (resolveNext) {
|
|
19
|
+
const resolve = resolveNext;
|
|
20
|
+
resolveNext = null;
|
|
21
|
+
resolve({ value: void 0, done: true });
|
|
22
|
+
}
|
|
23
|
+
} else if (data.type === "error") {
|
|
24
|
+
error = new Error(data.error);
|
|
25
|
+
done = true;
|
|
26
|
+
if (resolveNext) {
|
|
27
|
+
const resolve = resolveNext;
|
|
28
|
+
resolveNext = null;
|
|
29
|
+
resolve({ value: void 0, done: true });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
let cleanedUp = false;
|
|
35
|
+
const cleanup = () => {
|
|
36
|
+
if (cleanedUp) return;
|
|
37
|
+
cleanedUp = true;
|
|
38
|
+
removeListener(worker, "message", handler);
|
|
39
|
+
removeListener(worker, "error", errorHandler);
|
|
40
|
+
if (options?.signal) {
|
|
41
|
+
options.signal.removeEventListener("abort", abortHandler);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
const errorHandler = (err) => {
|
|
45
|
+
error = new Error(err.message);
|
|
46
|
+
done = true;
|
|
47
|
+
if (resolveNext) {
|
|
48
|
+
const resolve = resolveNext;
|
|
49
|
+
resolveNext = null;
|
|
50
|
+
resolve({ value: void 0, done: true });
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const abortHandler = () => {
|
|
54
|
+
try {
|
|
55
|
+
worker.postMessage({ id: message.id, type: "abort" });
|
|
56
|
+
} catch {
|
|
57
|
+
}
|
|
58
|
+
error = new DOMException("Aborted", "AbortError");
|
|
59
|
+
done = true;
|
|
60
|
+
if (resolveNext) {
|
|
61
|
+
const resolve = resolveNext;
|
|
62
|
+
resolveNext = null;
|
|
63
|
+
resolve({ value: void 0, done: true });
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
addListener(worker, "message", handler);
|
|
67
|
+
addListener(worker, "error", errorHandler);
|
|
68
|
+
if (options?.signal) {
|
|
69
|
+
if (options.signal.aborted) {
|
|
70
|
+
cleanup();
|
|
71
|
+
throw new DOMException("Aborted", "AbortError");
|
|
72
|
+
}
|
|
73
|
+
options.signal.addEventListener("abort", abortHandler);
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
if (transfer) {
|
|
77
|
+
worker.postMessage(message, transfer);
|
|
78
|
+
} else {
|
|
79
|
+
worker.postMessage(message);
|
|
80
|
+
}
|
|
81
|
+
} catch (err) {
|
|
82
|
+
cleanup();
|
|
83
|
+
throw err;
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
while (!done) {
|
|
87
|
+
if (error) {
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
const result = await new Promise((resolve) => {
|
|
91
|
+
resolveNext = resolve;
|
|
92
|
+
});
|
|
93
|
+
if (error) {
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
if (!result.done && result.value !== void 0) {
|
|
97
|
+
yield result.value;
|
|
98
|
+
}
|
|
99
|
+
if (result.done) {
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
} finally {
|
|
104
|
+
cleanup();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export { sendWorkerMessage };
|
|
109
|
+
//# sourceMappingURL=messageHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messageHandler.js","sources":["../../../../src/execution/worker/utils/messageHandler.ts"],"sourcesContent":["import type {\n ParseBinaryOptions,\n ParseOptions,\n} from \"../../../common/types.ts\";\nimport type {\n DEFAULT_DELIMITER,\n DEFAULT_QUOTATION,\n} from \"../../../constants.ts\";\nimport { addListener, removeListener } from \"./workerUtils.ts\";\n\nimport type { CSVBinary } from \"../../../common/types.ts\";\n\n/**\n * Message to send to worker.\n *\n * @internal\n */\nexport interface WorkerMessage {\n id: number;\n type: string;\n data: string | CSVBinary | ReadableStream<string>;\n options?: Record<string, unknown>;\n useWASM?: boolean;\n}\n\n/**\n * Stream response from worker.\n * @internal\n */\ninterface StreamResponse<T = unknown> {\n id: number;\n type: \"record\" | \"done\" | \"error\";\n record?: T;\n error?: string;\n}\n\n/**\n * Send a message to worker and receive streaming response.\n * Handles abort signals, cleanup, and error handling.\n *\n * @internal\n */\nexport async function* sendWorkerMessage<\n T,\n Header extends ReadonlyArray<string> = readonly string[],\n Delimiter extends string = DEFAULT_DELIMITER,\n Quotation extends string = DEFAULT_QUOTATION,\n>(\n worker: Worker,\n message: WorkerMessage,\n options?:\n | ParseOptions<Header, Delimiter, Quotation>\n | ParseBinaryOptions<Header, Delimiter, Quotation>,\n transfer?: Transferable[],\n): AsyncIterableIterator<T> {\n let resolveNext: ((value: IteratorResult<T>) => void) | null = null;\n let done = false;\n let error: Error | null = null;\n\n const handler = (event: MessageEvent) => {\n const data = event.data as StreamResponse<T>;\n if (data.id === message.id) {\n if (data.type === \"record\" && data.record !== undefined) {\n if (resolveNext) {\n const resolve = resolveNext;\n resolveNext = null;\n resolve({ value: data.record, done: false });\n }\n } else if (data.type === \"done\") {\n done = true;\n if (resolveNext) {\n const resolve = resolveNext;\n resolveNext = null;\n resolve({ value: undefined!, done: true });\n }\n } else if (data.type === \"error\") {\n error = new Error(data.error);\n done = true;\n if (resolveNext) {\n const resolve = resolveNext;\n resolveNext = null;\n resolve({ value: undefined!, done: true });\n }\n }\n }\n };\n\n let cleanedUp = false;\n const cleanup = () => {\n if (cleanedUp) return;\n cleanedUp = true;\n removeListener(worker, \"message\", handler);\n removeListener(worker, \"error\", errorHandler);\n if (options?.signal) {\n options.signal.removeEventListener(\"abort\", abortHandler);\n }\n };\n\n const errorHandler = (err: ErrorEvent) => {\n error = new Error(err.message);\n done = true;\n if (resolveNext) {\n const resolve = resolveNext;\n resolveNext = null;\n resolve({ value: undefined as any, done: true });\n }\n };\n\n const abortHandler = () => {\n try {\n worker.postMessage({ id: message.id, type: \"abort\" });\n } catch {\n // Ignore errors if worker is already terminated\n }\n error = new DOMException(\"Aborted\", \"AbortError\");\n done = true;\n if (resolveNext) {\n const resolve = resolveNext;\n resolveNext = null;\n resolve({ value: undefined as any, done: true });\n }\n };\n\n addListener(worker, \"message\", handler);\n addListener(worker, \"error\", errorHandler);\n\n // Wire abort signal if present\n if (options?.signal) {\n if (options.signal.aborted) {\n cleanup();\n throw new DOMException(\"Aborted\", \"AbortError\");\n }\n options.signal.addEventListener(\"abort\", abortHandler);\n }\n\n // Send message\n try {\n if (transfer) {\n worker.postMessage(message, transfer);\n } else {\n worker.postMessage(message);\n }\n } catch (err) {\n cleanup();\n throw err;\n }\n\n // Yield records as they arrive\n try {\n while (!done) {\n if (error) {\n throw error;\n }\n // Wait for next record\n const result = await new Promise<IteratorResult<T>>((resolve) => {\n resolveNext = resolve;\n });\n if (error) {\n throw error;\n }\n // If we got a record, yield it\n if (!result.done && result.value !== undefined) {\n yield result.value;\n }\n // If done, exit\n if (result.done) {\n break;\n }\n }\n } finally {\n cleanup();\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ParseBinaryOptions, ParseOptions } from '../../../common/types.ts';
|
|
2
|
+
import { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from '../../../constants.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Extract serializable options by removing non-serializable fields.
|
|
5
|
+
* Removes: signal, engine, workerPool, workerURL (contains non-serializable objects)
|
|
6
|
+
*
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export declare function serializeOptions<Header extends ReadonlyArray<string> = readonly string[], Delimiter extends string = DEFAULT_DELIMITER, Quotation extends string = DEFAULT_QUOTATION>(options?: ParseOptions<Header, Delimiter, Quotation> | ParseBinaryOptions<Header, Delimiter, Quotation>): Omit<typeof options, "signal" | "engine" | "workerPool" | "workerURL"> | undefined;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
function serializeOptions(options) {
|
|
2
|
+
if (!options) return void 0;
|
|
3
|
+
const {
|
|
4
|
+
signal: _signal,
|
|
5
|
+
engine: _engine,
|
|
6
|
+
workerPool: _workerPool,
|
|
7
|
+
workerURL: _workerURL,
|
|
8
|
+
...serializableOptions
|
|
9
|
+
} = options;
|
|
10
|
+
return serializableOptions;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export { serializeOptions };
|
|
14
|
+
//# sourceMappingURL=serializeOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializeOptions.js","sources":["../../../../src/execution/worker/utils/serializeOptions.ts"],"sourcesContent":["import type {\n ParseBinaryOptions,\n ParseOptions,\n} from \"../../../common/types.ts\";\nimport type {\n DEFAULT_DELIMITER,\n DEFAULT_QUOTATION,\n} from \"../../../constants.ts\";\n\n/**\n * Extract serializable options by removing non-serializable fields.\n * Removes: signal, engine, workerPool, workerURL (contains non-serializable objects)\n *\n * @internal\n */\nexport function serializeOptions<\n Header extends ReadonlyArray<string> = readonly string[],\n Delimiter extends string = DEFAULT_DELIMITER,\n Quotation extends string = DEFAULT_QUOTATION,\n>(\n options?:\n | ParseOptions<Header, Delimiter, Quotation>\n | ParseBinaryOptions<Header, Delimiter, Quotation>,\n):\n | Omit<typeof options, \"signal\" | \"engine\" | \"workerPool\" | \"workerURL\">\n | undefined {\n if (!options) return undefined;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const {\n signal: _signal,\n engine: _engine,\n workerPool: _workerPool,\n workerURL: _workerURL,\n ...serializableOptions\n } = options as any;\n\n return serializableOptions;\n}\n"],"names":[],"mappings":"AAeO,SAAS,iBAKd,OAAA,EAKY;AACZ,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AAGrB,EAAA,MAAM;AAAA,IACJ,MAAA,EAAQ,OAAA;AAAA,IACR,MAAA,EAAQ,OAAA;AAAA,IACR,UAAA,EAAY,WAAA;AAAA,IACZ,SAAA,EAAW,UAAA;AAAA,IACX,GAAG;AAAA,GACL,GAAI,OAAA;AAEJ,EAAA,OAAO,mBAAA;AACT;;;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collect ReadableStream<string> into a single string.
|
|
3
|
+
* Node.js does not support Transferable Streams, so we need to collect the stream first.
|
|
4
|
+
*
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
7
|
+
export declare function collectStringStream(stream: ReadableStream<string>, signal?: AbortSignal): Promise<string>;
|
|
8
|
+
/**
|
|
9
|
+
* Collect ReadableStream<Uint8Array> into a single Uint8Array.
|
|
10
|
+
* Node.js does not support Transferable Streams, so we need to collect the stream first.
|
|
11
|
+
*
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
export declare function collectUint8ArrayStream(stream: ReadableStream<Uint8Array>, signal?: AbortSignal): Promise<Uint8Array>;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
async function collectStringStream(stream, signal) {
|
|
2
|
+
const chunks = [];
|
|
3
|
+
const reader = stream.getReader();
|
|
4
|
+
const abortHandler = () => {
|
|
5
|
+
void reader.cancel().catch(() => {
|
|
6
|
+
});
|
|
7
|
+
};
|
|
8
|
+
try {
|
|
9
|
+
if (signal?.aborted) {
|
|
10
|
+
reader.releaseLock();
|
|
11
|
+
throw new DOMException("Aborted", "AbortError");
|
|
12
|
+
}
|
|
13
|
+
if (signal) {
|
|
14
|
+
signal.addEventListener("abort", abortHandler);
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
while (true) {
|
|
18
|
+
if (signal?.aborted) {
|
|
19
|
+
throw new DOMException("Aborted", "AbortError");
|
|
20
|
+
}
|
|
21
|
+
const { done, value } = await reader.read();
|
|
22
|
+
if (done) break;
|
|
23
|
+
chunks.push(value);
|
|
24
|
+
}
|
|
25
|
+
} finally {
|
|
26
|
+
if (signal) {
|
|
27
|
+
signal.removeEventListener("abort", abortHandler);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
} finally {
|
|
31
|
+
reader.releaseLock();
|
|
32
|
+
}
|
|
33
|
+
return chunks.join("");
|
|
34
|
+
}
|
|
35
|
+
async function collectUint8ArrayStream(stream, signal) {
|
|
36
|
+
const chunks = [];
|
|
37
|
+
const reader = stream.getReader();
|
|
38
|
+
const abortHandler = () => {
|
|
39
|
+
void reader.cancel().catch(() => {
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
try {
|
|
43
|
+
if (signal?.aborted) {
|
|
44
|
+
reader.releaseLock();
|
|
45
|
+
throw new DOMException("Aborted", "AbortError");
|
|
46
|
+
}
|
|
47
|
+
if (signal) {
|
|
48
|
+
signal.addEventListener("abort", abortHandler);
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
while (true) {
|
|
52
|
+
if (signal?.aborted) {
|
|
53
|
+
throw new DOMException("Aborted", "AbortError");
|
|
54
|
+
}
|
|
55
|
+
const { done, value } = await reader.read();
|
|
56
|
+
if (done) break;
|
|
57
|
+
chunks.push(Uint8Array.from(value));
|
|
58
|
+
}
|
|
59
|
+
} finally {
|
|
60
|
+
if (signal) {
|
|
61
|
+
signal.removeEventListener("abort", abortHandler);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
} finally {
|
|
65
|
+
reader.releaseLock();
|
|
66
|
+
}
|
|
67
|
+
const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);
|
|
68
|
+
const combined = new Uint8Array(totalLength);
|
|
69
|
+
let offset = 0;
|
|
70
|
+
for (const chunk of chunks) {
|
|
71
|
+
combined.set(chunk, offset);
|
|
72
|
+
offset += chunk.length;
|
|
73
|
+
}
|
|
74
|
+
return combined;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export { collectStringStream, collectUint8ArrayStream };
|
|
78
|
+
//# sourceMappingURL=streamCollector.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamCollector.node.js","sources":["../../../../src/execution/worker/utils/streamCollector.node.ts"],"sourcesContent":["import type {\n ParseBinaryOptions,\n ParseOptions,\n} from \"../../../common/types.ts\";\n\n/**\n * Collect ReadableStream<string> into a single string.\n * Node.js does not support Transferable Streams, so we need to collect the stream first.\n *\n * @internal\n */\nexport async function collectStringStream(\n stream: ReadableStream<string>,\n signal?: AbortSignal,\n): Promise<string> {\n const chunks: string[] = [];\n const reader = stream.getReader();\n\n // AbortSignal handler for cancelling the stream\n const abortHandler = () => {\n void reader.cancel().catch(() => {\n // Ignore errors during cancellation\n });\n };\n\n try {\n // Check if already aborted before starting\n if (signal?.aborted) {\n reader.releaseLock();\n throw new DOMException(\"Aborted\", \"AbortError\");\n }\n\n // Register abort listener\n if (signal) {\n signal.addEventListener(\"abort\", abortHandler);\n }\n\n try {\n while (true) {\n // Check abort status before reading\n if (signal?.aborted) {\n throw new DOMException(\"Aborted\", \"AbortError\");\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n } finally {\n // Clean up abort listener\n if (signal) {\n signal.removeEventListener(\"abort\", abortHandler);\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n return chunks.join(\"\");\n}\n\n/**\n * Collect ReadableStream<Uint8Array> into a single Uint8Array.\n * Node.js does not support Transferable Streams, so we need to collect the stream first.\n *\n * @internal\n */\nexport async function collectUint8ArrayStream(\n stream: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): Promise<Uint8Array> {\n const chunks: Uint8Array[] = [];\n const reader = stream.getReader();\n\n // AbortSignal handler for cancelling the stream\n const abortHandler = () => {\n void reader.cancel().catch(() => {\n // Ignore errors during cancellation\n });\n };\n\n try {\n // Check if already aborted before starting\n if (signal?.aborted) {\n reader.releaseLock();\n throw new DOMException(\"Aborted\", \"AbortError\");\n }\n\n // Register abort listener\n if (signal) {\n signal.addEventListener(\"abort\", abortHandler);\n }\n\n try {\n while (true) {\n // Check abort status before reading\n if (signal?.aborted) {\n throw new DOMException(\"Aborted\", \"AbortError\");\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n // Copy the chunk to avoid detached buffer issues\n chunks.push(Uint8Array.from(value));\n }\n } finally {\n // Clean up abort listener\n if (signal) {\n signal.removeEventListener(\"abort\", abortHandler);\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n // Concatenate all chunks into a single Uint8Array\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return combined;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-platform event listener utilities for Web Workers and Node.js Worker Threads.
|
|
3
|
+
* @internal
|
|
4
|
+
*/
|
|
5
|
+
type EventHandler = (event: any) => void;
|
|
6
|
+
/**
|
|
7
|
+
* Add event listener to worker (compatible with both Web Workers and Node.js Worker Threads)
|
|
8
|
+
*/
|
|
9
|
+
export declare function addListener(worker: Worker, event: "message" | "error", handler: EventHandler): void;
|
|
10
|
+
/**
|
|
11
|
+
* Remove event listener from worker (compatible with both Web Workers and Node.js Worker Threads)
|
|
12
|
+
*/
|
|
13
|
+
export declare function removeListener(worker: Worker, event: "message" | "error", handler: EventHandler): void;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
const handlerMap = /* @__PURE__ */ new WeakMap();
|
|
2
|
+
function addListener(worker, event, handler) {
|
|
3
|
+
if ("addEventListener" in worker) {
|
|
4
|
+
worker.addEventListener(event, handler);
|
|
5
|
+
} else {
|
|
6
|
+
const normalizedHandler = event === "message" ? (data) => handler({ data }) : handler;
|
|
7
|
+
if (!handlerMap.has(worker)) {
|
|
8
|
+
handlerMap.set(worker, /* @__PURE__ */ new Map());
|
|
9
|
+
}
|
|
10
|
+
handlerMap.get(worker).set(handler, normalizedHandler);
|
|
11
|
+
worker.on(event, normalizedHandler);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function removeListener(worker, event, handler) {
|
|
15
|
+
if ("removeEventListener" in worker) {
|
|
16
|
+
worker.removeEventListener(event, handler);
|
|
17
|
+
} else {
|
|
18
|
+
const normalizedHandler = handlerMap.get(worker)?.get(handler) || handler;
|
|
19
|
+
worker.off(event, normalizedHandler);
|
|
20
|
+
handlerMap.get(worker)?.delete(handler);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { addListener, removeListener };
|
|
25
|
+
//# sourceMappingURL=workerUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workerUtils.js","sources":["../../../../src/execution/worker/utils/workerUtils.ts"],"sourcesContent":["/**\n * Cross-platform event listener utilities for Web Workers and Node.js Worker Threads.\n * @internal\n */\n\ntype EventHandler = (event: any) => void;\n\n// Store mapping of original handlers to normalized handlers for Node.js\nconst handlerMap = new WeakMap<object, Map<EventHandler, EventHandler>>();\n\n/**\n * Add event listener to worker (compatible with both Web Workers and Node.js Worker Threads)\n */\nexport function addListener(\n worker: Worker,\n event: \"message\" | \"error\",\n handler: EventHandler,\n): void {\n if (\"addEventListener\" in worker) {\n // Web Workers API (browser, Deno)\n worker.addEventListener(event, handler);\n } else {\n // Node.js Worker Threads API\n // In Node.js, message data is passed directly, not wrapped in event.data\n // We need to normalize it to match the Web Workers API\n const normalizedHandler =\n event === \"message\" ? (data: any) => handler({ data }) : handler;\n\n // Store the mapping so we can remove it later\n if (!handlerMap.has(worker)) {\n handlerMap.set(worker, new Map());\n }\n handlerMap.get(worker)!.set(handler, normalizedHandler);\n\n // @ts-ignore - Node.js Worker has different API\n worker.on(event, normalizedHandler);\n }\n}\n\n/**\n * Remove event listener from worker (compatible with both Web Workers and Node.js Worker Threads)\n */\nexport function removeListener(\n worker: Worker,\n event: \"message\" | \"error\",\n handler: EventHandler,\n): void {\n if (\"removeEventListener\" in worker) {\n // Web Workers API (browser, Deno)\n worker.removeEventListener(event, handler);\n } else {\n // Node.js Worker Threads API\n // Get the normalized handler from the map\n const normalizedHandler = handlerMap.get(worker)?.get(handler) || handler;\n // @ts-ignore - Node.js Worker has different API\n worker.off(event, normalizedHandler);\n\n // Clean up the mapping\n handlerMap.get(worker)?.delete(handler);\n }\n}\n"],"names":[],"mappings":"AAQA,MAAM,UAAA,uBAAiB,OAAA,EAAiD;AAKjE,SAAS,WAAA,CACd,MAAA,EACA,KAAA,EACA,OAAA,EACM;AACN,EAAA,IAAI,sBAAsB,MAAA,EAAQ;AAEhC,IAAA,MAAA,CAAO,gBAAA,CAAiB,OAAO,OAAO,CAAA;AAAA,EACxC,CAAA,MAAO;AAIL,IAAA,MAAM,iBAAA,GACJ,UAAU,SAAA,GAAY,CAAC,SAAc,OAAA,CAAQ,EAAE,IAAA,EAAM,CAAA,GAAI,OAAA;AAG3D,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA,EAAG;AAC3B,MAAA,UAAA,CAAW,GAAA,CAAI,MAAA,kBAAQ,IAAI,GAAA,EAAK,CAAA;AAAA,IAClC;AACA,IAAA,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA,CAAG,GAAA,CAAI,SAAS,iBAAiB,CAAA;AAGtD,IAAA,MAAA,CAAO,EAAA,CAAG,OAAO,iBAAiB,CAAA;AAAA,EACpC;AACF;AAKO,SAAS,cAAA,CACd,MAAA,EACA,KAAA,EACA,OAAA,EACM;AACN,EAAA,IAAI,yBAAyB,MAAA,EAAQ;AAEnC,IAAA,MAAA,CAAO,mBAAA,CAAoB,OAAO,OAAO,CAAA;AAAA,EAC3C,CAAA,MAAO;AAGL,IAAA,MAAM,oBAAoB,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA,EAAG,GAAA,CAAI,OAAO,CAAA,IAAK,OAAA;AAElE,IAAA,MAAA,CAAO,GAAA,CAAI,OAAO,iBAAiB,CAAA;AAGnC,IAAA,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA;AAAA,EACxC;AACF;;;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supported compression formats for CSV decompression in Node.js environments.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* Node.js 20+ supports gzip and deflate via the Compression Streams API.
|
|
6
|
+
* deflate-raw may not be reliably supported in all Node.js versions.
|
|
7
|
+
*
|
|
8
|
+
* @see {@link https://nodejs.org/api/webstreams.html#compressionstream | Node.js CompressionStream}
|
|
9
|
+
*/
|
|
10
|
+
export declare const SUPPORTED_COMPRESSIONS: ReadonlySet<CompressionFormat>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const SUPPORTED_COMPRESSIONS = /* @__PURE__ */ new Set([
|
|
2
|
+
"gzip",
|
|
3
|
+
"deflate"
|
|
4
|
+
// Note: deflate-raw is not included as it may not be supported in Node.js 20
|
|
5
|
+
]);
|
|
6
|
+
|
|
7
|
+
export { SUPPORTED_COMPRESSIONS };
|
|
8
|
+
//# sourceMappingURL=getOptionsFromResponse.constants.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getOptionsFromResponse.constants.node.js","sources":["../src/getOptionsFromResponse.constants.node.ts"],"sourcesContent":["/**\n * Supported compression formats for CSV decompression in Node.js environments.\n *\n * @remarks\n * Node.js 20+ supports gzip and deflate via the Compression Streams API.\n * deflate-raw may not be reliably supported in all Node.js versions.\n *\n * @see {@link https://nodejs.org/api/webstreams.html#compressionstream | Node.js CompressionStream}\n */\nexport const SUPPORTED_COMPRESSIONS: ReadonlySet<CompressionFormat> = new Set([\n \"gzip\",\n \"deflate\",\n // Note: deflate-raw is not included as it may not be supported in Node.js 20\n]);\n"],"names":[],"mappings":"AASO,MAAM,sBAAA,uBAA6D,GAAA,CAAI;AAAA,EAC5E,MAAA;AAAA,EACA;AAAA;AAEF,CAAC;;;;"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supported compression formats for CSV decompression in browser environments.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* By default, only universally supported compression formats (gzip and deflate) are included
|
|
6
|
+
* to ensure cross-browser compatibility. These formats are part of the standard Compression
|
|
7
|
+
* Streams API and work reliably across all modern browsers (Chrome, Firefox, Safari, Edge).
|
|
8
|
+
*
|
|
9
|
+
* ### Experimental Compression Support
|
|
10
|
+
*
|
|
11
|
+
* Additional compression formats like `deflate-raw` may be supported in some browsers
|
|
12
|
+
* (e.g., Chromium-based browsers such as Chrome and Edge), but are not guaranteed to work
|
|
13
|
+
* across all environments. To use experimental compression formats:
|
|
14
|
+
*
|
|
15
|
+
* 1. Set the `allowExperimentalCompressions` option to `true` in your parse function
|
|
16
|
+
* 2. Be aware that this may cause errors in browsers that don't support the format
|
|
17
|
+
* 3. Consider implementing fallback handling for unsupported formats
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* // Use experimental compressions (may fail in some browsers)
|
|
22
|
+
* const records = parseResponse(response, {
|
|
23
|
+
* allowExperimentalCompressions: true
|
|
24
|
+
* });
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @see {@link https://developer.mozilla.org/en-US/docs/Web/API/CompressionFormat | CompressionFormat}
|
|
28
|
+
* @see {@link https://developer.mozilla.org/en-US/docs/Web/API/DecompressionStream | DecompressionStream}
|
|
29
|
+
*/
|
|
30
|
+
export declare const SUPPORTED_COMPRESSIONS: ReadonlySet<CompressionFormat>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getOptionsFromResponse.constants.web.js","sources":["../src/getOptionsFromResponse.constants.web.ts"],"sourcesContent":["/**\n * Supported compression formats for CSV decompression in browser environments.\n *\n * @remarks\n * By default, only universally supported compression formats (gzip and deflate) are included\n * to ensure cross-browser compatibility. These formats are part of the standard Compression\n * Streams API and work reliably across all modern browsers (Chrome, Firefox, Safari, Edge).\n *\n * ### Experimental Compression Support\n *\n * Additional compression formats like `deflate-raw` may be supported in some browsers\n * (e.g., Chromium-based browsers such as Chrome and Edge), but are not guaranteed to work\n * across all environments. To use experimental compression formats:\n *\n * 1. Set the `allowExperimentalCompressions` option to `true` in your parse function\n * 2. Be aware that this may cause errors in browsers that don't support the format\n * 3. Consider implementing fallback handling for unsupported formats\n *\n * @example\n * ```typescript\n * // Use experimental compressions (may fail in some browsers)\n * const records = parseResponse(response, {\n * allowExperimentalCompressions: true\n * });\n * ```\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/CompressionFormat | CompressionFormat}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/DecompressionStream | DecompressionStream}\n */\nexport const SUPPORTED_COMPRESSIONS: ReadonlySet<CompressionFormat> = new Set([\n \"gzip\",\n \"deflate\",\n]);\n"],"names":[],"mappings":"AA6BO,MAAM,sBAAA,uBAA6D,GAAA,CAAI;AAAA,EAC5E,MAAA;AAAA,EACA;AACF,CAAC;;;;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ParseBinaryOptions } from './common/types.ts';
|
|
2
|
+
import { DEFAULT_DELIMITER } from './constants.ts';
|
|
2
3
|
/**
|
|
3
4
|
* Extracts the options from the response object.
|
|
4
5
|
*
|
|
@@ -7,4 +8,4 @@ import { ParseBinaryOptions } from './common/types.ts';
|
|
|
7
8
|
* @returns The options extracted from the response.
|
|
8
9
|
* @throws {TypeError} - The content type is not supported or the content-encoding is invalid.
|
|
9
10
|
*/
|
|
10
|
-
export declare function getOptionsFromResponse<Header extends ReadonlyArray<string
|
|
11
|
+
export declare function getOptionsFromResponse<Header extends ReadonlyArray<string>, Delimiter extends string = DEFAULT_DELIMITER, Quotation extends string = '"'>(response: Response, options?: ParseBinaryOptions<Header, Delimiter, Quotation>): ParseBinaryOptions<Header, Delimiter, Quotation>;
|