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.
Files changed (187) hide show
  1. package/README.md +132 -6
  2. package/dist/CSVLexer.js.map +1 -1
  3. package/dist/CSVLexerTransformer.d.ts +52 -3
  4. package/dist/CSVLexerTransformer.js +58 -13
  5. package/dist/CSVLexerTransformer.js.map +1 -1
  6. package/dist/CSVRecordAssembler.js.map +1 -1
  7. package/dist/CSVRecordAssemblerTransformer.d.ts +49 -3
  8. package/dist/CSVRecordAssemblerTransformer.js +55 -18
  9. package/dist/CSVRecordAssemblerTransformer.js.map +1 -1
  10. package/dist/_virtual/web_csv_toolbox_wasm_bg.wasm.js +1 -1
  11. package/dist/assertCommonOptions.js.map +1 -1
  12. package/dist/common/constants.js.map +1 -1
  13. package/dist/common/errors.js.map +1 -1
  14. package/dist/common/types.d.ts +336 -14
  15. package/dist/commonParseErrorHandling.js.map +1 -1
  16. package/dist/constants.js.map +1 -1
  17. package/dist/createWorker.node.d.ts +2 -0
  18. package/dist/createWorker.web.d.ts +2 -0
  19. package/dist/execution/EnginePresets.d.ts +143 -0
  20. package/dist/execution/EnginePresets.js +129 -0
  21. package/dist/execution/EnginePresets.js.map +1 -0
  22. package/dist/execution/InternalEngineConfig.d.ts +89 -0
  23. package/dist/execution/InternalEngineConfig.js +175 -0
  24. package/dist/execution/InternalEngineConfig.js.map +1 -0
  25. package/dist/execution/main/parseBinaryInMain.d.ts +12 -0
  26. package/dist/execution/main/parseStreamInMain.d.ts +12 -0
  27. package/dist/execution/main/parseStringInMain.d.ts +12 -0
  28. package/dist/execution/main/parseUint8ArrayStreamInMain.d.ts +12 -0
  29. package/dist/execution/wasm/parseBinaryInWASM.d.ts +18 -0
  30. package/dist/execution/wasm/parseBinaryInWASM.js +15 -0
  31. package/dist/execution/wasm/parseBinaryInWASM.js.map +1 -0
  32. package/dist/execution/wasm/parseStringInWASM.d.ts +16 -0
  33. package/dist/execution/worker/helpers/ReusableWorkerPool.d.ts +152 -0
  34. package/dist/execution/worker/helpers/ReusableWorkerPool.js +238 -0
  35. package/dist/execution/worker/helpers/ReusableWorkerPool.js.map +1 -0
  36. package/dist/execution/worker/helpers/TransientWorkerPool.d.ts +89 -0
  37. package/dist/execution/worker/helpers/WorkerManager.d.ts +27 -0
  38. package/dist/execution/worker/helpers/WorkerPool.d.ts +50 -0
  39. package/dist/execution/worker/helpers/WorkerSession.d.ts +78 -0
  40. package/dist/execution/worker/helpers/WorkerSession.js +58 -0
  41. package/dist/execution/worker/helpers/WorkerSession.js.map +1 -0
  42. package/dist/execution/worker/helpers/createWorker.node.d.ts +8 -0
  43. package/dist/execution/worker/helpers/createWorker.node.js +15 -0
  44. package/dist/execution/worker/helpers/createWorker.node.js.map +1 -0
  45. package/dist/execution/worker/helpers/createWorker.web.d.ts +8 -0
  46. package/dist/execution/worker/helpers/createWorker.web.js +11 -0
  47. package/dist/execution/worker/helpers/createWorker.web.js.map +1 -0
  48. package/dist/execution/worker/helpers/worker.node.d.ts +1 -0
  49. package/dist/execution/worker/helpers/worker.node.js +11 -0
  50. package/dist/execution/worker/helpers/worker.node.js.map +1 -0
  51. package/dist/execution/worker/helpers/worker.shared.d.ts +90 -0
  52. package/dist/execution/worker/helpers/worker.shared.js +241 -0
  53. package/dist/execution/worker/helpers/worker.shared.js.map +1 -0
  54. package/dist/execution/worker/helpers/worker.web.d.ts +1 -0
  55. package/dist/execution/worker/helpers/worker.web.js +16 -0
  56. package/dist/execution/worker/helpers/worker.web.js.map +1 -0
  57. package/dist/execution/worker/parseBinaryInWorker.node.d.ts +8 -0
  58. package/dist/execution/worker/parseBinaryInWorker.node.js +24 -0
  59. package/dist/execution/worker/parseBinaryInWorker.node.js.map +1 -0
  60. package/dist/execution/worker/parseBinaryInWorker.web.d.ts +8 -0
  61. package/dist/execution/worker/parseBinaryInWorker.web.js +24 -0
  62. package/dist/execution/worker/parseBinaryInWorker.web.js.map +1 -0
  63. package/dist/execution/worker/parseBinaryInWorkerWASM.node.d.ts +8 -0
  64. package/dist/execution/worker/parseBinaryInWorkerWASM.node.js +24 -0
  65. package/dist/execution/worker/parseBinaryInWorkerWASM.node.js.map +1 -0
  66. package/dist/execution/worker/parseBinaryInWorkerWASM.web.d.ts +8 -0
  67. package/dist/execution/worker/parseBinaryInWorkerWASM.web.js +24 -0
  68. package/dist/execution/worker/parseBinaryInWorkerWASM.web.js.map +1 -0
  69. package/dist/execution/worker/parseStreamInWorker.node.d.ts +15 -0
  70. package/dist/execution/worker/parseStreamInWorker.node.js +26 -0
  71. package/dist/execution/worker/parseStreamInWorker.node.js.map +1 -0
  72. package/dist/execution/worker/parseStreamInWorker.web.d.ts +12 -0
  73. package/dist/execution/worker/parseStreamInWorker.web.js +25 -0
  74. package/dist/execution/worker/parseStreamInWorker.web.js.map +1 -0
  75. package/dist/execution/worker/parseStringInWorker.node.d.ts +11 -0
  76. package/dist/execution/worker/parseStringInWorker.node.js +24 -0
  77. package/dist/execution/worker/parseStringInWorker.node.js.map +1 -0
  78. package/dist/execution/worker/parseStringInWorker.web.d.ts +11 -0
  79. package/dist/execution/worker/parseStringInWorker.web.js +24 -0
  80. package/dist/execution/worker/parseStringInWorker.web.js.map +1 -0
  81. package/dist/execution/worker/parseStringInWorkerWASM.node.d.ts +8 -0
  82. package/dist/execution/worker/parseStringInWorkerWASM.node.js +24 -0
  83. package/dist/execution/worker/parseStringInWorkerWASM.node.js.map +1 -0
  84. package/dist/execution/worker/parseStringInWorkerWASM.web.d.ts +8 -0
  85. package/dist/execution/worker/parseStringInWorkerWASM.web.js +24 -0
  86. package/dist/execution/worker/parseStringInWorkerWASM.web.js.map +1 -0
  87. package/dist/execution/worker/parseUint8ArrayStreamInWorker.node.d.ts +12 -0
  88. package/dist/execution/worker/parseUint8ArrayStreamInWorker.node.js +26 -0
  89. package/dist/execution/worker/parseUint8ArrayStreamInWorker.node.js.map +1 -0
  90. package/dist/execution/worker/parseUint8ArrayStreamInWorker.web.d.ts +9 -0
  91. package/dist/execution/worker/parseUint8ArrayStreamInWorker.web.js +25 -0
  92. package/dist/execution/worker/parseUint8ArrayStreamInWorker.web.js.map +1 -0
  93. package/dist/execution/worker/strategies/MessageStreamingStrategy.d.ts +17 -0
  94. package/dist/execution/worker/strategies/MessageStreamingStrategy.js +58 -0
  95. package/dist/execution/worker/strategies/MessageStreamingStrategy.js.map +1 -0
  96. package/dist/execution/worker/strategies/TransferableStreamStrategy.d.ts +25 -0
  97. package/dist/execution/worker/strategies/TransferableStreamStrategy.js +159 -0
  98. package/dist/execution/worker/strategies/TransferableStreamStrategy.js.map +1 -0
  99. package/dist/execution/worker/strategies/WorkerStrategy.d.ts +27 -0
  100. package/dist/execution/worker/strategies/WorkerStrategySelector.d.ts +43 -0
  101. package/dist/execution/worker/strategies/WorkerStrategySelector.js +89 -0
  102. package/dist/execution/worker/strategies/WorkerStrategySelector.js.map +1 -0
  103. package/dist/execution/worker/utils/messageHandler.d.ts +21 -0
  104. package/dist/execution/worker/utils/messageHandler.js +109 -0
  105. package/dist/execution/worker/utils/messageHandler.js.map +1 -0
  106. package/dist/execution/worker/utils/serializeOptions.d.ts +9 -0
  107. package/dist/execution/worker/utils/serializeOptions.js +14 -0
  108. package/dist/execution/worker/utils/serializeOptions.js.map +1 -0
  109. package/dist/execution/worker/utils/streamCollector.node.d.ts +14 -0
  110. package/dist/execution/worker/utils/streamCollector.node.js +78 -0
  111. package/dist/execution/worker/utils/streamCollector.node.js.map +1 -0
  112. package/dist/execution/worker/utils/workerUtils.d.ts +14 -0
  113. package/dist/execution/worker/utils/workerUtils.js +25 -0
  114. package/dist/execution/worker/utils/workerUtils.js.map +1 -0
  115. package/dist/getOptionsFromResponse.constants.node.d.ts +10 -0
  116. package/dist/getOptionsFromResponse.constants.node.js +8 -0
  117. package/dist/getOptionsFromResponse.constants.node.js.map +1 -0
  118. package/dist/getOptionsFromResponse.constants.web.d.ts +30 -0
  119. package/dist/getOptionsFromResponse.constants.web.js +7 -0
  120. package/dist/getOptionsFromResponse.constants.web.js.map +1 -0
  121. package/dist/getOptionsFromResponse.d.ts +2 -1
  122. package/dist/getOptionsFromResponse.js +5 -9
  123. package/dist/getOptionsFromResponse.js.map +1 -1
  124. package/dist/loadWASM.js.map +1 -1
  125. package/dist/loadWASM.web.js.map +1 -1
  126. package/dist/parse.d.ts +1 -1
  127. package/dist/parse.js +29 -5
  128. package/dist/parse.js.map +1 -1
  129. package/dist/parseBinary.d.ts +2 -1
  130. package/dist/parseBinary.js +32 -3
  131. package/dist/parseBinary.js.map +1 -1
  132. package/dist/parseBinaryInWorker.node.d.ts +2 -0
  133. package/dist/parseBinaryInWorker.web.d.ts +2 -0
  134. package/dist/parseBinaryInWorkerWASM.node.d.ts +2 -0
  135. package/dist/parseBinaryInWorkerWASM.web.d.ts +2 -0
  136. package/dist/parseBinaryToArraySync.d.ts +2 -1
  137. package/dist/parseBinaryToArraySync.js.map +1 -1
  138. package/dist/parseBinaryToIterableIterator.d.ts +2 -1
  139. package/dist/parseBinaryToIterableIterator.js.map +1 -1
  140. package/dist/parseBinaryToStream.d.ts +2 -1
  141. package/dist/parseBinaryToStream.js.map +1 -1
  142. package/dist/parseResponse.d.ts +1 -1
  143. package/dist/parseResponse.js +15 -8
  144. package/dist/parseResponse.js.map +1 -1
  145. package/dist/parseResponseToStream.d.ts +2 -1
  146. package/dist/parseResponseToStream.js.map +1 -1
  147. package/dist/parseStreamInWorker.node.d.ts +2 -0
  148. package/dist/parseStreamInWorker.web.d.ts +2 -0
  149. package/dist/parseString.d.ts +31 -0
  150. package/dist/parseString.js +27 -1
  151. package/dist/parseString.js.map +1 -1
  152. package/dist/parseStringInWorker.node.d.ts +2 -0
  153. package/dist/parseStringInWorker.web.d.ts +2 -0
  154. package/dist/parseStringInWorkerWASM.node.d.ts +2 -0
  155. package/dist/parseStringInWorkerWASM.web.d.ts +2 -0
  156. package/dist/parseStringStream.d.ts +43 -1
  157. package/dist/parseStringStream.js +24 -3
  158. package/dist/parseStringStream.js.map +1 -1
  159. package/dist/parseStringStreamToStream.js.map +1 -1
  160. package/dist/parseStringToArraySync.js.map +1 -1
  161. package/dist/parseStringToArraySyncWASM.js.map +1 -1
  162. package/dist/parseStringToIterableIterator.js.map +1 -1
  163. package/dist/parseStringToStream.js.map +1 -1
  164. package/dist/parseUint8ArrayStream.d.ts +4 -3
  165. package/dist/parseUint8ArrayStream.js +24 -3
  166. package/dist/parseUint8ArrayStream.js.map +1 -1
  167. package/dist/parseUint8ArrayStreamInWorker.node.d.ts +2 -0
  168. package/dist/parseUint8ArrayStreamInWorker.web.d.ts +2 -0
  169. package/dist/parseUint8ArrayStreamToStream.d.ts +2 -1
  170. package/dist/parseUint8ArrayStreamToStream.js +11 -5
  171. package/dist/parseUint8ArrayStreamToStream.js.map +1 -1
  172. package/dist/utils/convertBinaryToString.js.map +1 -1
  173. package/dist/utils/convertIterableIteratorToAsync.js.map +1 -1
  174. package/dist/utils/convertStreamToAsyncIterableIterator.js +2 -2
  175. package/dist/utils/convertStreamToAsyncIterableIterator.js.map +1 -1
  176. package/dist/utils/convertThisAsyncIterableIteratorToArray.d.ts +1 -1
  177. package/dist/utils/convertThisAsyncIterableIteratorToArray.js.map +1 -1
  178. package/dist/utils/escapeRegExp.js.map +1 -1
  179. package/dist/utils/parseMime.js.map +1 -1
  180. package/dist/utils/pipeline.js.map +1 -1
  181. package/dist/web-csv-toolbox.d.ts +4 -0
  182. package/dist/web-csv-toolbox.js +3 -0
  183. package/dist/web-csv-toolbox.js.map +1 -1
  184. package/dist/web_csv_toolbox_wasm_bg.wasm +0 -0
  185. package/dist/worker.node.d.ts +1 -0
  186. package/dist/worker.web.d.ts +1 -0
  187. package/package.json +53 -10
@@ -0,0 +1,12 @@
1
+ import { CSVRecord, ParseOptions } from '../../common/types.ts';
2
+ import { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from '../../constants.ts';
3
+ /**
4
+ * Parse CSV stream in Worker thread (Browser/Deno).
5
+ * Uses Transferable Streams for zero-copy transfer.
6
+ *
7
+ * @internal
8
+ * @param stream CSV string stream to parse
9
+ * @param options Parsing options
10
+ * @returns Async iterable iterator of records
11
+ */
12
+ export declare function parseStreamInWorker<Header extends ReadonlyArray<string>, Delimiter extends string = DEFAULT_DELIMITER, Quotation extends string = DEFAULT_QUOTATION>(stream: ReadableStream<string>, options?: ParseOptions<Header, Delimiter, Quotation>): AsyncIterableIterator<CSVRecord<Header>>;
@@ -0,0 +1,25 @@
1
+ import { WorkerSession } from './helpers/WorkerSession.js';
2
+ import { sendWorkerMessage } from './utils/messageHandler.js';
3
+ import { serializeOptions } from './utils/serializeOptions.js';
4
+
5
+ async function* parseStreamInWorker(stream, options) {
6
+ using session = await WorkerSession.create({
7
+ workerPool: options?.engine?.workerPool,
8
+ workerURL: options?.engine?.workerURL
9
+ });
10
+ yield* sendWorkerMessage(
11
+ session.getWorker(),
12
+ {
13
+ id: session.getNextRequestId(),
14
+ type: "parseStream",
15
+ data: stream,
16
+ options: serializeOptions(options)
17
+ },
18
+ options,
19
+ [stream]
20
+ // Transfer stream
21
+ );
22
+ }
23
+
24
+ export { parseStreamInWorker };
25
+ //# sourceMappingURL=parseStreamInWorker.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseStreamInWorker.web.js","sources":["../../../src/execution/worker/parseStreamInWorker.web.ts"],"sourcesContent":["import type {\n CSVRecord,\n ParseBinaryOptions,\n ParseOptions,\n} from \"../../common/types.ts\";\nimport type { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from \"../../constants.ts\";\nimport { convertStreamToAsyncIterableIterator } from \"../../utils/convertStreamToAsyncIterableIterator.ts\";\nimport { WorkerSession } from \"./helpers/WorkerSession.ts\";\nimport { sendWorkerMessage } from \"./utils/messageHandler.ts\";\nimport { serializeOptions } from \"./utils/serializeOptions.ts\";\n\n/**\n * Parse CSV stream in Worker thread (Browser/Deno).\n * Uses Transferable Streams for zero-copy transfer.\n *\n * @internal\n * @param stream CSV string stream to parse\n * @param options Parsing options\n * @returns Async iterable iterator of records\n */\nexport async function* parseStreamInWorker<\n Header extends ReadonlyArray<string>,\n Delimiter extends string = DEFAULT_DELIMITER,\n Quotation extends string = DEFAULT_QUOTATION,\n>(\n stream: ReadableStream<string>,\n options?: ParseOptions<Header, Delimiter, Quotation>,\n): AsyncIterableIterator<CSVRecord<Header>> {\n using session = await WorkerSession.create({\n workerPool: options?.engine?.workerPool,\n workerURL: options?.engine?.workerURL,\n });\n\n yield* sendWorkerMessage<CSVRecord<Header>>(\n session.getWorker(),\n {\n id: session.getNextRequestId(),\n type: \"parseStream\",\n data: stream,\n options: serializeOptions(options),\n },\n options as ParseOptions<Header> | ParseBinaryOptions<Header> | undefined,\n [stream], // Transfer stream\n );\n}\n"],"names":[],"mappings":";;;;AAoBA,gBAAuB,mBAAA,CAKrB,QACA,OAAA,EAC0C;AAC1C,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,MAAA,CAAO;AAAA,IACzC,UAAA,EAAY,SAAS,MAAA,EAAQ,UAAA;AAAA,IAC7B,SAAA,EAAW,SAAS,MAAA,EAAQ;AAAA,GAC7B,CAAA;AAED,EAAA,OAAO,iBAAA;AAAA,IACL,QAAQ,SAAA,EAAU;AAAA,IAClB;AAAA,MACE,EAAA,EAAI,QAAQ,gBAAA,EAAiB;AAAA,MAC7B,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,iBAAiB,OAAO;AAAA,KACnC;AAAA,IACA,OAAA;AAAA,IACA,CAAC,MAAM;AAAA;AAAA,GACT;AACF;;;;"}
@@ -0,0 +1,11 @@
1
+ import { CSVRecord, ParseOptions } from '../../common/types.ts';
2
+ import { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from '../../constants.ts';
3
+ /**
4
+ * Parse CSV string in Worker thread (Node.js).
5
+ *
6
+ * @internal
7
+ * @param csv CSV string to parse
8
+ * @param options Parsing options
9
+ * @returns Async iterable iterator of records
10
+ */
11
+ export declare function parseStringInWorker<Header extends ReadonlyArray<string>, Delimiter extends string = DEFAULT_DELIMITER, Quotation extends string = DEFAULT_QUOTATION>(csv: string, options?: ParseOptions<Header, Delimiter, Quotation>): AsyncIterableIterator<CSVRecord<Header>>;
@@ -0,0 +1,24 @@
1
+ import { WorkerSession } from './helpers/WorkerSession.js';
2
+ import { sendWorkerMessage } from './utils/messageHandler.js';
3
+ import { serializeOptions } from './utils/serializeOptions.js';
4
+
5
+ async function* parseStringInWorker(csv, options) {
6
+ using session = await WorkerSession.create({
7
+ workerPool: options?.engine?.workerPool,
8
+ workerURL: options?.engine?.workerURL
9
+ });
10
+ yield* sendWorkerMessage(
11
+ session.getWorker(),
12
+ {
13
+ id: session.getNextRequestId(),
14
+ type: "parseString",
15
+ data: csv,
16
+ options: serializeOptions(options),
17
+ useWASM: false
18
+ },
19
+ options
20
+ );
21
+ }
22
+
23
+ export { parseStringInWorker };
24
+ //# sourceMappingURL=parseStringInWorker.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseStringInWorker.node.js","sources":["../../../src/execution/worker/parseStringInWorker.node.ts"],"sourcesContent":["import type {\n CSVRecord,\n ParseBinaryOptions,\n ParseOptions,\n} from \"../../common/types.ts\";\nimport type { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from \"../../constants.ts\";\nimport { WorkerSession } from \"./helpers/WorkerSession.ts\";\nimport { sendWorkerMessage } from \"./utils/messageHandler.ts\";\nimport { serializeOptions } from \"./utils/serializeOptions.ts\";\n\n/**\n * Parse CSV string in Worker thread (Node.js).\n *\n * @internal\n * @param csv CSV string to parse\n * @param options Parsing options\n * @returns Async iterable iterator of records\n */\nexport async function* parseStringInWorker<\n Header extends ReadonlyArray<string>,\n Delimiter extends string = DEFAULT_DELIMITER,\n Quotation extends string = DEFAULT_QUOTATION,\n>(\n csv: string,\n options?: ParseOptions<Header, Delimiter, Quotation>,\n): AsyncIterableIterator<CSVRecord<Header>> {\n using session = await WorkerSession.create({\n workerPool: options?.engine?.workerPool,\n workerURL: options?.engine?.workerURL,\n });\n\n yield* sendWorkerMessage<CSVRecord<Header>>(\n session.getWorker(),\n {\n id: session.getNextRequestId(),\n type: \"parseString\",\n data: csv,\n options: serializeOptions(options),\n useWASM: false,\n },\n options as ParseOptions<Header> | ParseBinaryOptions<Header> | undefined,\n );\n}\n"],"names":[],"mappings":";;;;AAkBA,gBAAuB,mBAAA,CAKrB,KACA,OAAA,EAC0C;AAC1C,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,MAAA,CAAO;AAAA,IACzC,UAAA,EAAY,SAAS,MAAA,EAAQ,UAAA;AAAA,IAC7B,SAAA,EAAW,SAAS,MAAA,EAAQ;AAAA,GAC7B,CAAA;AAED,EAAA,OAAO,iBAAA;AAAA,IACL,QAAQ,SAAA,EAAU;AAAA,IAClB;AAAA,MACE,EAAA,EAAI,QAAQ,gBAAA,EAAiB;AAAA,MAC7B,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,GAAA;AAAA,MACN,OAAA,EAAS,iBAAiB,OAAO,CAAA;AAAA,MACjC,OAAA,EAAS;AAAA,KACX;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -0,0 +1,11 @@
1
+ import { CSVRecord, ParseOptions } from '../../common/types.ts';
2
+ import { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from '../../constants.ts';
3
+ /**
4
+ * Parse CSV string in Worker thread (Browser/Deno).
5
+ *
6
+ * @internal
7
+ * @param csv CSV string to parse
8
+ * @param options Parsing options
9
+ * @returns Async iterable iterator of records
10
+ */
11
+ export declare function parseStringInWorker<Header extends ReadonlyArray<string>, Delimiter extends string = DEFAULT_DELIMITER, Quotation extends string = DEFAULT_QUOTATION>(csv: string, options?: ParseOptions<Header, Delimiter, Quotation>): AsyncIterableIterator<CSVRecord<Header>>;
@@ -0,0 +1,24 @@
1
+ import { WorkerSession } from './helpers/WorkerSession.js';
2
+ import { sendWorkerMessage } from './utils/messageHandler.js';
3
+ import { serializeOptions } from './utils/serializeOptions.js';
4
+
5
+ async function* parseStringInWorker(csv, options) {
6
+ using session = await WorkerSession.create({
7
+ workerPool: options?.engine?.workerPool,
8
+ workerURL: options?.engine?.workerURL
9
+ });
10
+ yield* sendWorkerMessage(
11
+ session.getWorker(),
12
+ {
13
+ id: session.getNextRequestId(),
14
+ type: "parseString",
15
+ data: csv,
16
+ options: serializeOptions(options),
17
+ useWASM: false
18
+ },
19
+ options
20
+ );
21
+ }
22
+
23
+ export { parseStringInWorker };
24
+ //# sourceMappingURL=parseStringInWorker.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseStringInWorker.web.js","sources":["../../../src/execution/worker/parseStringInWorker.web.ts"],"sourcesContent":["import type {\n CSVRecord,\n ParseBinaryOptions,\n ParseOptions,\n} from \"../../common/types.ts\";\nimport type { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from \"../../constants.ts\";\nimport { WorkerSession } from \"./helpers/WorkerSession.ts\";\nimport { sendWorkerMessage } from \"./utils/messageHandler.ts\";\nimport { serializeOptions } from \"./utils/serializeOptions.ts\";\n\n/**\n * Parse CSV string in Worker thread (Browser/Deno).\n *\n * @internal\n * @param csv CSV string to parse\n * @param options Parsing options\n * @returns Async iterable iterator of records\n */\nexport async function* parseStringInWorker<\n Header extends ReadonlyArray<string>,\n Delimiter extends string = DEFAULT_DELIMITER,\n Quotation extends string = DEFAULT_QUOTATION,\n>(\n csv: string,\n options?: ParseOptions<Header, Delimiter, Quotation>,\n): AsyncIterableIterator<CSVRecord<Header>> {\n using session = await WorkerSession.create({\n workerPool: options?.engine?.workerPool,\n workerURL: options?.engine?.workerURL,\n });\n\n yield* sendWorkerMessage<CSVRecord<Header>>(\n session.getWorker(),\n {\n id: session.getNextRequestId(),\n type: \"parseString\",\n data: csv,\n options: serializeOptions(options),\n useWASM: false,\n },\n options as ParseOptions<Header> | ParseBinaryOptions<Header> | undefined,\n );\n}\n"],"names":[],"mappings":";;;;AAkBA,gBAAuB,mBAAA,CAKrB,KACA,OAAA,EAC0C;AAC1C,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,MAAA,CAAO;AAAA,IACzC,UAAA,EAAY,SAAS,MAAA,EAAQ,UAAA;AAAA,IAC7B,SAAA,EAAW,SAAS,MAAA,EAAQ;AAAA,GAC7B,CAAA;AAED,EAAA,OAAO,iBAAA;AAAA,IACL,QAAQ,SAAA,EAAU;AAAA,IAClB;AAAA,MACE,EAAA,EAAI,QAAQ,gBAAA,EAAiB;AAAA,MAC7B,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,GAAA;AAAA,MACN,OAAA,EAAS,iBAAiB,OAAO,CAAA;AAAA,MACjC,OAAA,EAAS;AAAA,KACX;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -0,0 +1,8 @@
1
+ import { CSVRecord, ParseOptions } from '../../common/types.ts';
2
+ import { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from '../../constants.ts';
3
+ /**
4
+ * Parse CSV string in Worker thread using WASM (Node.js).
5
+ *
6
+ * @internal
7
+ */
8
+ export declare function parseStringInWorkerWASM<Header extends ReadonlyArray<string>, Delimiter extends string = DEFAULT_DELIMITER, Quotation extends string = DEFAULT_QUOTATION>(csv: string, options?: ParseOptions<Header, Delimiter, Quotation>): AsyncIterableIterator<CSVRecord<Header>>;
@@ -0,0 +1,24 @@
1
+ import { WorkerSession } from './helpers/WorkerSession.js';
2
+ import { sendWorkerMessage } from './utils/messageHandler.js';
3
+ import { serializeOptions } from './utils/serializeOptions.js';
4
+
5
+ async function* parseStringInWorkerWASM(csv, options) {
6
+ using session = await WorkerSession.create({
7
+ workerPool: options?.engine?.workerPool,
8
+ workerURL: options?.engine?.workerURL
9
+ });
10
+ yield* sendWorkerMessage(
11
+ session.getWorker(),
12
+ {
13
+ id: session.getNextRequestId(),
14
+ type: "parseString",
15
+ data: csv,
16
+ options: serializeOptions(options),
17
+ useWASM: true
18
+ },
19
+ options
20
+ );
21
+ }
22
+
23
+ export { parseStringInWorkerWASM };
24
+ //# sourceMappingURL=parseStringInWorkerWASM.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseStringInWorkerWASM.node.js","sources":["../../../src/execution/worker/parseStringInWorkerWASM.node.ts"],"sourcesContent":["import type {\n CSVRecord,\n ParseBinaryOptions,\n ParseOptions,\n} from \"../../common/types.ts\";\nimport type { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from \"../../constants.ts\";\nimport { WorkerSession } from \"./helpers/WorkerSession.ts\";\nimport { sendWorkerMessage } from \"./utils/messageHandler.ts\";\nimport { serializeOptions } from \"./utils/serializeOptions.ts\";\n\n/**\n * Parse CSV string in Worker thread using WASM (Node.js).\n *\n * @internal\n */\nexport async function* parseStringInWorkerWASM<\n Header extends ReadonlyArray<string>,\n Delimiter extends string = DEFAULT_DELIMITER,\n Quotation extends string = DEFAULT_QUOTATION,\n>(\n csv: string,\n options?: ParseOptions<Header, Delimiter, Quotation>,\n): AsyncIterableIterator<CSVRecord<Header>> {\n using session = await WorkerSession.create({\n workerPool: options?.engine?.workerPool,\n workerURL: options?.engine?.workerURL,\n });\n\n yield* sendWorkerMessage<CSVRecord<Header>>(\n session.getWorker(),\n {\n id: session.getNextRequestId(),\n type: \"parseString\",\n data: csv,\n options: serializeOptions(options),\n useWASM: true,\n },\n options as ParseOptions<Header> | ParseBinaryOptions<Header> | undefined,\n );\n}\n"],"names":[],"mappings":";;;;AAeA,gBAAuB,uBAAA,CAKrB,KACA,OAAA,EAC0C;AAC1C,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,MAAA,CAAO;AAAA,IACzC,UAAA,EAAY,SAAS,MAAA,EAAQ,UAAA;AAAA,IAC7B,SAAA,EAAW,SAAS,MAAA,EAAQ;AAAA,GAC7B,CAAA;AAED,EAAA,OAAO,iBAAA;AAAA,IACL,QAAQ,SAAA,EAAU;AAAA,IAClB;AAAA,MACE,EAAA,EAAI,QAAQ,gBAAA,EAAiB;AAAA,MAC7B,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,GAAA;AAAA,MACN,OAAA,EAAS,iBAAiB,OAAO,CAAA;AAAA,MACjC,OAAA,EAAS;AAAA,KACX;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -0,0 +1,8 @@
1
+ import { CSVRecord, ParseOptions } from '../../common/types.ts';
2
+ import { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from '../../constants.ts';
3
+ /**
4
+ * Parse CSV string in Worker thread using WASM (Browser/Deno).
5
+ *
6
+ * @internal
7
+ */
8
+ export declare function parseStringInWorkerWASM<Header extends ReadonlyArray<string>, Delimiter extends string = DEFAULT_DELIMITER, Quotation extends string = DEFAULT_QUOTATION>(csv: string, options?: ParseOptions<Header, Delimiter, Quotation>): AsyncIterableIterator<CSVRecord<Header>>;
@@ -0,0 +1,24 @@
1
+ import { WorkerSession } from './helpers/WorkerSession.js';
2
+ import { sendWorkerMessage } from './utils/messageHandler.js';
3
+ import { serializeOptions } from './utils/serializeOptions.js';
4
+
5
+ async function* parseStringInWorkerWASM(csv, options) {
6
+ using session = await WorkerSession.create({
7
+ workerPool: options?.engine?.workerPool,
8
+ workerURL: options?.engine?.workerURL
9
+ });
10
+ yield* sendWorkerMessage(
11
+ session.getWorker(),
12
+ {
13
+ id: session.getNextRequestId(),
14
+ type: "parseString",
15
+ data: csv,
16
+ options: serializeOptions(options),
17
+ useWASM: true
18
+ },
19
+ options
20
+ );
21
+ }
22
+
23
+ export { parseStringInWorkerWASM };
24
+ //# sourceMappingURL=parseStringInWorkerWASM.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseStringInWorkerWASM.web.js","sources":["../../../src/execution/worker/parseStringInWorkerWASM.web.ts"],"sourcesContent":["import type {\n CSVRecord,\n ParseBinaryOptions,\n ParseOptions,\n} from \"../../common/types.ts\";\nimport type { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from \"../../constants.ts\";\nimport { WorkerSession } from \"./helpers/WorkerSession.ts\";\nimport { sendWorkerMessage } from \"./utils/messageHandler.ts\";\nimport { serializeOptions } from \"./utils/serializeOptions.ts\";\n\n/**\n * Parse CSV string in Worker thread using WASM (Browser/Deno).\n *\n * @internal\n */\nexport async function* parseStringInWorkerWASM<\n Header extends ReadonlyArray<string>,\n Delimiter extends string = DEFAULT_DELIMITER,\n Quotation extends string = DEFAULT_QUOTATION,\n>(\n csv: string,\n options?: ParseOptions<Header, Delimiter, Quotation>,\n): AsyncIterableIterator<CSVRecord<Header>> {\n using session = await WorkerSession.create({\n workerPool: options?.engine?.workerPool,\n workerURL: options?.engine?.workerURL,\n });\n\n yield* sendWorkerMessage<CSVRecord<Header>>(\n session.getWorker(),\n {\n id: session.getNextRequestId(),\n type: \"parseString\",\n data: csv,\n options: serializeOptions(options),\n useWASM: true,\n },\n options as ParseOptions<Header> | ParseBinaryOptions<Header> | undefined,\n );\n}\n"],"names":[],"mappings":";;;;AAeA,gBAAuB,uBAAA,CAKrB,KACA,OAAA,EAC0C;AAC1C,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,MAAA,CAAO;AAAA,IACzC,UAAA,EAAY,SAAS,MAAA,EAAQ,UAAA;AAAA,IAC7B,SAAA,EAAW,SAAS,MAAA,EAAQ;AAAA,GAC7B,CAAA;AAED,EAAA,OAAO,iBAAA;AAAA,IACL,QAAQ,SAAA,EAAU;AAAA,IAClB;AAAA,MACE,EAAA,EAAI,QAAQ,gBAAA,EAAiB;AAAA,MAC7B,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,GAAA;AAAA,MACN,OAAA,EAAS,iBAAiB,OAAO,CAAA;AAAA,MACjC,OAAA,EAAS;AAAA,KACX;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -0,0 +1,12 @@
1
+ import { CSVRecord, ParseBinaryOptions } from '../../common/types.ts';
2
+ import { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from '../../constants.ts';
3
+ /**
4
+ * Parse CSV Uint8Array stream in Worker thread (Node.js).
5
+ * Collects stream into Uint8Array first, then sends to worker.
6
+ *
7
+ * Note: Node.js Worker Threads do not support ReadableStream transfer,
8
+ * so we collect the stream into an array first.
9
+ *
10
+ * @internal
11
+ */
12
+ export declare function parseUint8ArrayStreamInWorker<Header extends ReadonlyArray<string>, Delimiter extends string = DEFAULT_DELIMITER, Quotation extends string = DEFAULT_QUOTATION>(stream: ReadableStream<Uint8Array>, options?: ParseBinaryOptions<Header, Delimiter, Quotation>): AsyncIterableIterator<CSVRecord<Header>>;
@@ -0,0 +1,26 @@
1
+ import { WorkerSession } from './helpers/WorkerSession.js';
2
+ import { sendWorkerMessage } from './utils/messageHandler.js';
3
+ import { serializeOptions } from './utils/serializeOptions.js';
4
+ import { collectUint8ArrayStream } from './utils/streamCollector.node.js';
5
+
6
+ async function* parseUint8ArrayStreamInWorker(stream, options) {
7
+ const combined = await collectUint8ArrayStream(stream, options?.signal);
8
+ using session = await WorkerSession.create({
9
+ workerPool: options?.engine?.workerPool,
10
+ workerURL: options?.engine?.workerURL
11
+ });
12
+ yield* sendWorkerMessage(
13
+ session.getWorker(),
14
+ {
15
+ id: session.getNextRequestId(),
16
+ type: "parseBinary",
17
+ data: combined,
18
+ options: serializeOptions(options),
19
+ useWASM: false
20
+ },
21
+ options
22
+ );
23
+ }
24
+
25
+ export { parseUint8ArrayStreamInWorker };
26
+ //# sourceMappingURL=parseUint8ArrayStreamInWorker.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseUint8ArrayStreamInWorker.node.js","sources":["../../../src/execution/worker/parseUint8ArrayStreamInWorker.node.ts"],"sourcesContent":["import type {\n CSVRecord,\n ParseBinaryOptions,\n ParseOptions,\n} from \"../../common/types.ts\";\nimport type { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from \"../../constants.ts\";\nimport { WorkerSession } from \"./helpers/WorkerSession.ts\";\nimport { sendWorkerMessage } from \"./utils/messageHandler.ts\";\nimport { serializeOptions } from \"./utils/serializeOptions.ts\";\nimport { collectUint8ArrayStream } from \"./utils/streamCollector.node.ts\";\n\n/**\n * Parse CSV Uint8Array stream in Worker thread (Node.js).\n * Collects stream into Uint8Array first, then sends to worker.\n *\n * Note: Node.js Worker Threads do not support ReadableStream transfer,\n * so we collect the stream into an array first.\n *\n * @internal\n */\nexport async function* parseUint8ArrayStreamInWorker<\n Header extends ReadonlyArray<string>,\n Delimiter extends string = DEFAULT_DELIMITER,\n Quotation extends string = DEFAULT_QUOTATION,\n>(\n stream: ReadableStream<Uint8Array>,\n options?: ParseBinaryOptions<Header, Delimiter, Quotation>,\n): AsyncIterableIterator<CSVRecord<Header>> {\n // Node.js: Collect stream into Uint8Array first\n const combined = await collectUint8ArrayStream(stream, options?.signal);\n\n using session = await WorkerSession.create({\n workerPool: options?.engine?.workerPool,\n workerURL: options?.engine?.workerURL,\n });\n\n yield* sendWorkerMessage<CSVRecord<Header>>(\n session.getWorker(),\n {\n id: session.getNextRequestId(),\n type: \"parseBinary\",\n data: combined,\n options: serializeOptions(options),\n useWASM: false,\n },\n options as ParseOptions<Header> | ParseBinaryOptions<Header> | undefined,\n );\n}\n"],"names":[],"mappings":";;;;;AAoBA,gBAAuB,6BAAA,CAKrB,QACA,OAAA,EAC0C;AAE1C,EAAA,MAAM,QAAA,GAAW,MAAM,uBAAA,CAAwB,MAAA,EAAQ,SAAS,MAAM,CAAA;AAEtE,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,MAAA,CAAO;AAAA,IACzC,UAAA,EAAY,SAAS,MAAA,EAAQ,UAAA;AAAA,IAC7B,SAAA,EAAW,SAAS,MAAA,EAAQ;AAAA,GAC7B,CAAA;AAED,EAAA,OAAO,iBAAA;AAAA,IACL,QAAQ,SAAA,EAAU;AAAA,IAClB;AAAA,MACE,EAAA,EAAI,QAAQ,gBAAA,EAAiB;AAAA,MAC7B,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,iBAAiB,OAAO,CAAA;AAAA,MACjC,OAAA,EAAS;AAAA,KACX;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -0,0 +1,9 @@
1
+ import { CSVRecord, ParseBinaryOptions } from '../../common/types.ts';
2
+ import { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from '../../constants.ts';
3
+ /**
4
+ * Parse CSV Uint8Array stream in Worker thread (Browser/Deno).
5
+ * Uses Transferable Streams for zero-copy transfer.
6
+ *
7
+ * @internal
8
+ */
9
+ export declare function parseUint8ArrayStreamInWorker<Header extends ReadonlyArray<string>, Delimiter extends string = DEFAULT_DELIMITER, Quotation extends string = DEFAULT_QUOTATION>(stream: ReadableStream<Uint8Array>, options?: ParseBinaryOptions<Header, Delimiter, Quotation>): AsyncIterableIterator<CSVRecord<Header>>;
@@ -0,0 +1,25 @@
1
+ import { WorkerSession } from './helpers/WorkerSession.js';
2
+ import { sendWorkerMessage } from './utils/messageHandler.js';
3
+ import { serializeOptions } from './utils/serializeOptions.js';
4
+
5
+ async function* parseUint8ArrayStreamInWorker(stream, options) {
6
+ using session = await WorkerSession.create({
7
+ workerPool: options?.engine?.workerPool,
8
+ workerURL: options?.engine?.workerURL
9
+ });
10
+ yield* sendWorkerMessage(
11
+ session.getWorker(),
12
+ {
13
+ id: session.getNextRequestId(),
14
+ type: "parseUint8ArrayStream",
15
+ data: stream,
16
+ options: serializeOptions(options)
17
+ },
18
+ options,
19
+ [stream]
20
+ // Transfer stream
21
+ );
22
+ }
23
+
24
+ export { parseUint8ArrayStreamInWorker };
25
+ //# sourceMappingURL=parseUint8ArrayStreamInWorker.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseUint8ArrayStreamInWorker.web.js","sources":["../../../src/execution/worker/parseUint8ArrayStreamInWorker.web.ts"],"sourcesContent":["import type {\n CSVRecord,\n ParseBinaryOptions,\n ParseOptions,\n} from \"../../common/types.ts\";\nimport type { DEFAULT_DELIMITER, DEFAULT_QUOTATION } from \"../../constants.ts\";\nimport { convertStreamToAsyncIterableIterator } from \"../../utils/convertStreamToAsyncIterableIterator.ts\";\nimport { WorkerSession } from \"./helpers/WorkerSession.ts\";\nimport { sendWorkerMessage } from \"./utils/messageHandler.ts\";\nimport { serializeOptions } from \"./utils/serializeOptions.ts\";\n\n/**\n * Parse CSV Uint8Array stream in Worker thread (Browser/Deno).\n * Uses Transferable Streams for zero-copy transfer.\n *\n * @internal\n */\nexport async function* parseUint8ArrayStreamInWorker<\n Header extends ReadonlyArray<string>,\n Delimiter extends string = DEFAULT_DELIMITER,\n Quotation extends string = DEFAULT_QUOTATION,\n>(\n stream: ReadableStream<Uint8Array>,\n options?: ParseBinaryOptions<Header, Delimiter, Quotation>,\n): AsyncIterableIterator<CSVRecord<Header>> {\n using session = await WorkerSession.create({\n workerPool: options?.engine?.workerPool,\n workerURL: options?.engine?.workerURL,\n });\n\n yield* sendWorkerMessage<CSVRecord<Header>>(\n session.getWorker(),\n {\n id: session.getNextRequestId(),\n type: \"parseUint8ArrayStream\",\n data: stream,\n options: serializeOptions(options),\n },\n options as ParseOptions<Header> | ParseBinaryOptions<Header> | undefined,\n [stream], // Transfer stream\n );\n}\n"],"names":[],"mappings":";;;;AAiBA,gBAAuB,6BAAA,CAKrB,QACA,OAAA,EAC0C;AAC1C,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,MAAA,CAAO;AAAA,IACzC,UAAA,EAAY,SAAS,MAAA,EAAQ,UAAA;AAAA,IAC7B,SAAA,EAAW,SAAS,MAAA,EAAQ;AAAA,GAC7B,CAAA;AAED,EAAA,OAAO,iBAAA;AAAA,IACL,QAAQ,SAAA,EAAU;AAAA,IAClB;AAAA,MACE,EAAA,EAAI,QAAQ,gBAAA,EAAiB;AAAA,MAC7B,IAAA,EAAM,uBAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,iBAAiB,OAAO;AAAA,KACnC;AAAA,IACA,OAAA;AAAA,IACA,CAAC,MAAM;AAAA;AAAA,GACT;AACF;;;;"}
@@ -0,0 +1,17 @@
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
+ * Message-based streaming strategy.
8
+ *
9
+ * Records are sent one-by-one via postMessage.
10
+ * This is the current implementation and works on all browsers including Safari.
11
+ *
12
+ * @internal
13
+ */
14
+ export declare class MessageStreamingStrategy implements WorkerStrategy {
15
+ readonly name = "message-streaming";
16
+ 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>;
17
+ }
@@ -0,0 +1,58 @@
1
+ import { WorkerSession } from '../helpers/WorkerSession.js';
2
+ import { sendWorkerMessage } from '../utils/messageHandler.js';
3
+ import { serializeOptions } from '../utils/serializeOptions.js';
4
+
5
+ class MessageStreamingStrategy {
6
+ name = "message-streaming";
7
+ async *execute(input, options, session, engineConfig) {
8
+ const useProvidedSession = session !== null;
9
+ const workerSession = session ?? await WorkerSession.create({
10
+ workerPool: engineConfig.workerPool,
11
+ workerURL: engineConfig.workerURL
12
+ });
13
+ try {
14
+ const worker = workerSession.getWorker();
15
+ const id = workerSession.getNextRequestId();
16
+ let type;
17
+ let data;
18
+ let transfer;
19
+ if (typeof input === "string") {
20
+ type = "parseString";
21
+ data = input;
22
+ } else if (input instanceof ReadableStream) {
23
+ throw new Error(
24
+ "Message-streaming strategy does not support ReadableStream. Use stream-transfer strategy or process in main thread."
25
+ );
26
+ } else if (input instanceof Uint8Array || input instanceof ArrayBuffer) {
27
+ type = "parseBinary";
28
+ data = input;
29
+ if (input instanceof Uint8Array) {
30
+ transfer = [input.buffer];
31
+ } else {
32
+ transfer = [input];
33
+ }
34
+ } else {
35
+ throw new Error(`Unsupported input type: ${typeof input}`);
36
+ }
37
+ yield* sendWorkerMessage(
38
+ worker,
39
+ {
40
+ id,
41
+ type,
42
+ data,
43
+ options: serializeOptions(options),
44
+ useWASM: engineConfig.hasWasm()
45
+ },
46
+ options,
47
+ transfer
48
+ );
49
+ } finally {
50
+ if (!useProvidedSession) {
51
+ workerSession[Symbol.dispose]();
52
+ }
53
+ }
54
+ }
55
+ }
56
+
57
+ export { MessageStreamingStrategy };
58
+ //# sourceMappingURL=MessageStreamingStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageStreamingStrategy.js","sources":["../../../../src/execution/worker/strategies/MessageStreamingStrategy.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 { WorkerSession } from \"../helpers/WorkerSession.ts\";\nimport { sendWorkerMessage } from \"../utils/messageHandler.ts\";\nimport { serializeOptions } from \"../utils/serializeOptions.ts\";\nimport type { WorkerStrategy } from \"./WorkerStrategy.ts\";\n\n/**\n * Message-based streaming strategy.\n *\n * Records are sent one-by-one via postMessage.\n * This is the current implementation and works on all browsers including Safari.\n *\n * @internal\n */\nexport class MessageStreamingStrategy implements WorkerStrategy {\n readonly name = \"message-streaming\";\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 // Use provided session or create a new one\n const useProvidedSession = session !== null;\n const workerSession =\n session ??\n (await WorkerSession.create({\n workerPool: engineConfig.workerPool,\n workerURL: engineConfig.workerURL,\n }));\n\n try {\n const worker = workerSession.getWorker();\n const id = workerSession.getNextRequestId();\n\n // Determine message type based on input\n let type: string;\n let data: string | CSVBinary;\n let transfer: Transferable[] | undefined;\n\n if (typeof input === \"string\") {\n type = \"parseString\";\n data = input;\n } else if (input instanceof ReadableStream) {\n // Message-streaming strategy does not support ReadableStream\n // ReadableStream cannot be cloned via postMessage without transferring\n // This should fallback to main thread or use stream-transfer strategy\n throw new Error(\n \"Message-streaming strategy does not support ReadableStream. \" +\n \"Use stream-transfer strategy or process in main thread.\",\n );\n } else if (input instanceof Uint8Array || input instanceof ArrayBuffer) {\n type = \"parseBinary\";\n data = input;\n // Transfer binary data for efficiency\n if (input instanceof Uint8Array) {\n transfer = [input.buffer];\n } else {\n transfer = [input];\n }\n } else {\n throw new Error(`Unsupported input type: ${typeof input}`);\n }\n\n // Send message and yield results\n yield* sendWorkerMessage<T>(\n worker,\n {\n id,\n type,\n data,\n options: serializeOptions(options),\n useWASM: engineConfig.hasWasm(),\n },\n options as\n | ParseOptions<Header>\n | ParseBinaryOptions<Header>\n | undefined,\n transfer,\n );\n } finally {\n // Dispose session only if we created it\n if (!useProvidedSession) {\n workerSession[Symbol.dispose]();\n }\n }\n }\n}\n"],"names":[],"mappings":";;;;AAuBO,MAAM,wBAAA,CAAmD;AAAA,EACrD,IAAA,GAAO,mBAAA;AAAA,EAEhB,OAAO,OAAA,CAML,KAAA,EACA,OAAA,EAIA,SACA,YAAA,EAC0B;AAE1B,IAAA,MAAM,qBAAqB,OAAA,KAAY,IAAA;AACvC,IAAA,MAAM,aAAA,GACJ,OAAA,IACC,MAAM,aAAA,CAAc,MAAA,CAAO;AAAA,MAC1B,YAAY,YAAA,CAAa,UAAA;AAAA,MACzB,WAAW,YAAA,CAAa;AAAA,KACzB,CAAA;AAEH,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,cAAc,SAAA,EAAU;AACvC,MAAA,MAAM,EAAA,GAAK,cAAc,gBAAA,EAAiB;AAG1C,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI,QAAA;AAEJ,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,IAAA,GAAO,aAAA;AACP,QAAA,IAAA,GAAO,KAAA;AAAA,MACT,CAAA,MAAA,IAAW,iBAAiB,cAAA,EAAgB;AAI1C,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SAEF;AAAA,MACF,CAAA,MAAA,IAAW,KAAA,YAAiB,UAAA,IAAc,KAAA,YAAiB,WAAA,EAAa;AACtE,QAAA,IAAA,GAAO,aAAA;AACP,QAAA,IAAA,GAAO,KAAA;AAEP,QAAA,IAAI,iBAAiB,UAAA,EAAY;AAC/B,UAAA,QAAA,GAAW,CAAC,MAAM,MAAM,CAAA;AAAA,QAC1B,CAAA,MAAO;AACL,UAAA,QAAA,GAAW,CAAC,KAAK,CAAA;AAAA,QACnB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,MAC3D;AAGA,MAAA,OAAO,iBAAA;AAAA,QACL,MAAA;AAAA,QACA;AAAA,UACE,EAAA;AAAA,UACA,IAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA,EAAS,iBAAiB,OAAO,CAAA;AAAA,UACjC,OAAA,EAAS,aAAa,OAAA;AAAQ,SAChC;AAAA,QACA,OAAA;AAAA,QAIA;AAAA,OACF;AAAA,IACF,CAAA,SAAE;AAEA,MAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,QAAA,aAAA,CAAc,MAAA,CAAO,OAAO,CAAA,EAAE;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AACF;;;;"}
@@ -0,0 +1,25 @@
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
+ * TransferableStream-based strategy.
8
+ *
9
+ * Streams are transferred directly to the worker using zero-copy transfer.
10
+ * This is more efficient than message-streaming but only supported in
11
+ * Chrome, Firefox, and Edge (not Safari).
12
+ *
13
+ * @internal
14
+ */
15
+ export declare class TransferableStreamStrategy implements WorkerStrategy {
16
+ readonly name = "stream-transfer";
17
+ 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>;
18
+ /**
19
+ * Receive parsed records from the worker via MessageChannel.
20
+ *
21
+ * @param port - MessagePort to receive results from
22
+ * @param signal - Optional AbortSignal for cancellation
23
+ */
24
+ private receiveResults;
25
+ }
@@ -0,0 +1,159 @@
1
+ import { WorkerSession } from '../helpers/WorkerSession.js';
2
+ import { serializeOptions } from '../utils/serializeOptions.js';
3
+
4
+ class TransferableStreamStrategy {
5
+ name = "stream-transfer";
6
+ async *execute(input, options, session, engineConfig) {
7
+ const useProvidedSession = session !== null;
8
+ const workerSession = session ?? await WorkerSession.create({
9
+ workerPool: engineConfig.workerPool,
10
+ workerURL: engineConfig.workerURL
11
+ });
12
+ try {
13
+ const worker = workerSession.getWorker();
14
+ const id = workerSession.getNextRequestId();
15
+ if (!(input instanceof ReadableStream)) {
16
+ throw new Error(
17
+ `TransferableStreamStrategy requires ReadableStream input, got ${typeof input}`
18
+ );
19
+ }
20
+ let type;
21
+ let streamToTransfer;
22
+ const reader = input.getReader();
23
+ const firstChunk = await reader.read();
24
+ if (firstChunk.done) {
25
+ reader.releaseLock();
26
+ return;
27
+ }
28
+ const reconstructedStream = new ReadableStream({
29
+ start(controller) {
30
+ controller.enqueue(firstChunk.value);
31
+ },
32
+ pull(controller) {
33
+ reader.read().then(({ done, value }) => {
34
+ if (done) {
35
+ controller.close();
36
+ } else {
37
+ controller.enqueue(value);
38
+ }
39
+ }).catch((error) => controller.error(error));
40
+ },
41
+ cancel(reason) {
42
+ reader.cancel(reason);
43
+ }
44
+ });
45
+ if (typeof firstChunk.value === "string") {
46
+ type = "parseStringStream";
47
+ streamToTransfer = reconstructedStream;
48
+ } else if (firstChunk.value instanceof Uint8Array) {
49
+ type = "parseUint8ArrayStream";
50
+ streamToTransfer = reconstructedStream;
51
+ } else {
52
+ throw new Error(
53
+ `Unsupported stream chunk type: ${typeof firstChunk.value}`
54
+ );
55
+ }
56
+ const channel = new MessageChannel();
57
+ const resultPort = channel.port1;
58
+ const workerPort = channel.port2;
59
+ worker.postMessage(
60
+ {
61
+ id,
62
+ type,
63
+ stream: streamToTransfer,
64
+ options: serializeOptions(options),
65
+ useWASM: engineConfig.hasWasm(),
66
+ resultPort: workerPort
67
+ },
68
+ [streamToTransfer, workerPort]
69
+ );
70
+ yield* this.receiveResults(resultPort, options?.signal);
71
+ } finally {
72
+ if (!useProvidedSession) {
73
+ workerSession[Symbol.dispose]();
74
+ }
75
+ }
76
+ }
77
+ /**
78
+ * Receive parsed records from the worker via MessageChannel.
79
+ *
80
+ * @param port - MessagePort to receive results from
81
+ * @param signal - Optional AbortSignal for cancellation
82
+ */
83
+ async *receiveResults(port, signal) {
84
+ const queue = [];
85
+ let done = false;
86
+ let error = null;
87
+ let resolveNext = null;
88
+ const abortHandler = () => {
89
+ error = new Error("Aborted");
90
+ if (resolveNext) resolveNext();
91
+ port.close();
92
+ };
93
+ if (signal) {
94
+ if (signal.aborted) {
95
+ port.close();
96
+ throw new Error("Aborted");
97
+ }
98
+ signal.addEventListener("abort", abortHandler);
99
+ }
100
+ port.onmessage = (event) => {
101
+ const message = event.data;
102
+ if (message.type === "record") {
103
+ queue.push(message.record);
104
+ if (resolveNext) {
105
+ resolveNext();
106
+ resolveNext = null;
107
+ }
108
+ } else if (message.type === "done") {
109
+ done = true;
110
+ if (resolveNext) {
111
+ resolveNext();
112
+ resolveNext = null;
113
+ }
114
+ port.close();
115
+ } else if (message.type === "error") {
116
+ error = new Error(message.error);
117
+ if (resolveNext) {
118
+ resolveNext();
119
+ resolveNext = null;
120
+ }
121
+ port.close();
122
+ }
123
+ };
124
+ port.onmessageerror = (event) => {
125
+ error = new Error(`Message deserialization error: ${event.data}`);
126
+ if (resolveNext) {
127
+ resolveNext();
128
+ resolveNext = null;
129
+ }
130
+ port.close();
131
+ };
132
+ port.start();
133
+ try {
134
+ while (!done && !error) {
135
+ if (queue.length > 0) {
136
+ yield queue.shift();
137
+ } else {
138
+ await new Promise((resolve) => {
139
+ resolveNext = resolve;
140
+ });
141
+ }
142
+ }
143
+ while (queue.length > 0) {
144
+ yield queue.shift();
145
+ }
146
+ if (error) {
147
+ throw error;
148
+ }
149
+ } finally {
150
+ if (signal) {
151
+ signal.removeEventListener("abort", abortHandler);
152
+ }
153
+ port.close();
154
+ }
155
+ }
156
+ }
157
+
158
+ export { TransferableStreamStrategy };
159
+ //# sourceMappingURL=TransferableStreamStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransferableStreamStrategy.js","sources":["../../../../src/execution/worker/strategies/TransferableStreamStrategy.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 { WorkerSession } from \"../helpers/WorkerSession.ts\";\nimport { serializeOptions } from \"../utils/serializeOptions.ts\";\nimport type { WorkerStrategy } from \"./WorkerStrategy.ts\";\n\n/**\n * TransferableStream-based strategy.\n *\n * Streams are transferred directly to the worker using zero-copy transfer.\n * This is more efficient than message-streaming but only supported in\n * Chrome, Firefox, and Edge (not Safari).\n *\n * @internal\n */\nexport class TransferableStreamStrategy implements WorkerStrategy {\n readonly name = \"stream-transfer\";\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 // Use provided session or create a new one\n const useProvidedSession = session !== null;\n const workerSession =\n session ??\n (await WorkerSession.create({\n workerPool: engineConfig.workerPool,\n workerURL: engineConfig.workerURL,\n }));\n\n try {\n const worker = workerSession.getWorker();\n const id = workerSession.getNextRequestId();\n\n // Ensure input is a ReadableStream\n if (!(input instanceof ReadableStream)) {\n throw new Error(\n `TransferableStreamStrategy requires ReadableStream input, got ${typeof input}`,\n );\n }\n\n // Determine stream type based on the input stream\n let type: string;\n let streamToTransfer: ReadableStream;\n\n // Check if this is a string stream or binary stream\n // We need to inspect the stream to determine type\n // For now, we'll use heuristics based on common stream types\n const reader = input.getReader();\n const firstChunk = await reader.read();\n\n if (firstChunk.done) {\n // Empty stream - release the reader and return\n reader.releaseLock();\n return;\n }\n\n // Put the first chunk back by creating a new stream\n const reconstructedStream = new ReadableStream({\n start(controller) {\n controller.enqueue(firstChunk.value);\n },\n pull(controller) {\n reader\n .read()\n .then(({ done, value }) => {\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n })\n .catch((error) => controller.error(error));\n },\n cancel(reason) {\n reader.cancel(reason);\n },\n });\n\n // Determine type based on first chunk\n if (typeof firstChunk.value === \"string\") {\n type = \"parseStringStream\";\n streamToTransfer = reconstructedStream;\n } else if (firstChunk.value instanceof Uint8Array) {\n type = \"parseUint8ArrayStream\";\n streamToTransfer = reconstructedStream;\n } else {\n throw new Error(\n `Unsupported stream chunk type: ${typeof firstChunk.value}`,\n );\n }\n\n // Create a MessageChannel for receiving results\n const channel = new MessageChannel();\n const resultPort = channel.port1;\n const workerPort = channel.port2;\n\n // Send the stream and worker port to the worker\n worker.postMessage(\n {\n id,\n type,\n stream: streamToTransfer,\n options: serializeOptions(options),\n useWASM: engineConfig.hasWasm(),\n resultPort: workerPort,\n },\n [streamToTransfer as any, workerPort],\n );\n\n // Listen for results from the worker\n yield* this.receiveResults<T>(resultPort, options?.signal);\n } finally {\n // Dispose session only if we created it\n if (!useProvidedSession) {\n workerSession[Symbol.dispose]();\n }\n }\n }\n\n /**\n * Receive parsed records from the worker via MessageChannel.\n *\n * @param port - MessagePort to receive results from\n * @param signal - Optional AbortSignal for cancellation\n */\n private async *receiveResults<T>(\n port: MessagePort,\n signal?: AbortSignal,\n ): AsyncIterableIterator<T> {\n const queue: T[] = [];\n let done = false;\n let error: Error | null = null;\n let resolveNext: (() => void) | null = null;\n\n // Set up abort handling\n const abortHandler = () => {\n error = new Error(\"Aborted\");\n if (resolveNext) resolveNext();\n port.close();\n };\n\n if (signal) {\n if (signal.aborted) {\n port.close();\n throw new Error(\"Aborted\");\n }\n signal.addEventListener(\"abort\", abortHandler);\n }\n\n // Set up message handler\n port.onmessage = (event: MessageEvent) => {\n const message = event.data;\n\n if (message.type === \"record\") {\n queue.push(message.record);\n if (resolveNext) {\n resolveNext();\n resolveNext = null;\n }\n } else if (message.type === \"done\") {\n done = true;\n if (resolveNext) {\n resolveNext();\n resolveNext = null;\n }\n port.close();\n } else if (message.type === \"error\") {\n error = new Error(message.error);\n if (resolveNext) {\n resolveNext();\n resolveNext = null;\n }\n port.close();\n }\n };\n\n port.onmessageerror = (event: MessageEvent) => {\n error = new Error(`Message deserialization error: ${event.data}`);\n if (resolveNext) {\n resolveNext();\n resolveNext = null;\n }\n port.close();\n };\n\n // Start the port\n port.start();\n\n try {\n // Yield records as they arrive\n while (!done && !error) {\n if (queue.length > 0) {\n yield queue.shift()!;\n } else {\n // Wait for next message\n await new Promise<void>((resolve) => {\n resolveNext = resolve;\n });\n }\n }\n\n // Yield any remaining records\n while (queue.length > 0) {\n yield queue.shift()!;\n }\n\n // Throw error if one occurred\n if (error) {\n throw error;\n }\n } finally {\n if (signal) {\n signal.removeEventListener(\"abort\", abortHandler);\n }\n port.close();\n }\n }\n}\n"],"names":[],"mappings":"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"}