@cj-tech-master/excelts 4.2.1 → 4.2.2-canary.20260115044841.88820eb

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 (331) hide show
  1. package/THIRD_PARTY_NOTICES.md +0 -31
  2. package/dist/browser/index.browser.d.ts +1 -0
  3. package/dist/browser/index.browser.js +12 -0
  4. package/dist/{esm/modules/archive → browser/modules/archive/compression}/compress.base.js +1 -1
  5. package/dist/{types/modules/archive → browser/modules/archive/compression}/compress.browser.d.ts +2 -8
  6. package/dist/browser/modules/archive/{compress.browser.js → compression/compress.browser.js} +3 -11
  7. package/dist/browser/modules/archive/{compress.d.ts → compression/compress.d.ts} +2 -2
  8. package/dist/{esm/modules/archive → browser/modules/archive/compression}/compress.js +1 -1
  9. package/dist/browser/modules/archive/{crc32.browser.d.ts → compression/crc32.browser.d.ts} +1 -1
  10. package/dist/browser/modules/archive/{crc32.d.ts → compression/crc32.d.ts} +1 -1
  11. package/dist/browser/modules/archive/{crc32.js → compression/crc32.js} +1 -1
  12. package/dist/browser/modules/archive/{deflate-fallback.js → compression/deflate-fallback.js} +1 -1
  13. package/dist/browser/modules/archive/{streaming-compress.browser.d.ts → compression/streaming-compress.browser.d.ts} +2 -2
  14. package/dist/browser/modules/archive/{streaming-compress.browser.js → compression/streaming-compress.browser.js} +3 -3
  15. package/dist/browser/modules/archive/{streaming-compress.d.ts → compression/streaming-compress.d.ts} +2 -2
  16. package/dist/browser/modules/archive/{streaming-compress.js → compression/streaming-compress.js} +2 -2
  17. package/dist/browser/modules/archive/defaults.d.ts +1 -0
  18. package/dist/browser/modules/archive/defaults.js +6 -3
  19. package/dist/browser/modules/archive/index.base.d.ts +4 -4
  20. package/dist/browser/modules/archive/index.base.js +3 -6
  21. package/dist/browser/modules/archive/index.browser.d.ts +3 -4
  22. package/dist/browser/modules/archive/index.browser.js +3 -7
  23. package/dist/browser/modules/archive/index.d.ts +3 -4
  24. package/dist/browser/modules/archive/index.js +3 -5
  25. package/dist/browser/modules/archive/internal/byte-queue.d.ts +33 -0
  26. package/dist/browser/modules/archive/internal/byte-queue.js +407 -0
  27. package/dist/browser/modules/archive/io/archive-sink.d.ts +8 -0
  28. package/dist/browser/modules/archive/io/archive-sink.js +45 -0
  29. package/dist/browser/modules/archive/io/archive-source.d.ts +6 -0
  30. package/dist/browser/modules/archive/io/archive-source.js +100 -0
  31. package/dist/browser/modules/archive/{extract.d.ts → unzip/extract.d.ts} +2 -2
  32. package/dist/browser/modules/archive/unzip/index.d.ts +40 -0
  33. package/dist/browser/modules/archive/unzip/index.js +164 -0
  34. package/dist/browser/modules/archive/{parse.base.d.ts → unzip/stream.base.d.ts} +36 -2
  35. package/dist/browser/modules/archive/unzip/stream.base.js +1022 -0
  36. package/dist/browser/modules/archive/{parse.browser.d.ts → unzip/stream.browser.d.ts} +1 -1
  37. package/dist/browser/modules/archive/{parse.browser.js → unzip/stream.browser.js} +371 -110
  38. package/dist/browser/modules/archive/{parse.d.ts → unzip/stream.d.ts} +2 -2
  39. package/dist/{esm/modules/archive/parse.js → browser/modules/archive/unzip/stream.js} +6 -5
  40. package/dist/browser/modules/archive/{zip-parser.d.ts → unzip/zip-parser.d.ts} +1 -1
  41. package/dist/{esm/modules/archive → browser/modules/archive/unzip}/zip-parser.js +38 -24
  42. package/dist/browser/modules/archive/utils/async-queue.d.ts +7 -0
  43. package/dist/browser/modules/archive/utils/async-queue.js +103 -0
  44. package/dist/browser/modules/archive/utils/bytes.js +16 -16
  45. package/dist/browser/modules/archive/utils/compressibility.d.ts +10 -0
  46. package/dist/browser/modules/archive/utils/compressibility.js +57 -0
  47. package/dist/browser/modules/archive/utils/parse-buffer.js +21 -23
  48. package/dist/browser/modules/archive/utils/pattern-scanner.d.ts +21 -0
  49. package/dist/browser/modules/archive/utils/pattern-scanner.js +27 -0
  50. package/dist/browser/modules/archive/utils/timestamps.js +62 -1
  51. package/dist/browser/modules/archive/utils/zip-extra-fields.d.ts +1 -1
  52. package/dist/browser/modules/archive/utils/zip-extra-fields.js +26 -14
  53. package/dist/browser/modules/archive/zip/index.d.ts +42 -0
  54. package/dist/browser/modules/archive/zip/index.js +157 -0
  55. package/dist/browser/modules/archive/{streaming-zip.d.ts → zip/stream.d.ts} +28 -5
  56. package/dist/browser/modules/archive/{streaming-zip.js → zip/stream.js} +192 -48
  57. package/dist/browser/modules/archive/zip/zip-bytes.d.ts +73 -0
  58. package/dist/browser/modules/archive/zip/zip-bytes.js +239 -0
  59. package/dist/{esm/modules/archive → browser/modules/archive/zip}/zip-entry-metadata.js +3 -3
  60. package/dist/browser/modules/archive/{zip-records.d.ts → zip-spec/zip-records.d.ts} +20 -0
  61. package/dist/browser/modules/archive/zip-spec/zip-records.js +126 -0
  62. package/dist/browser/modules/excel/stream/workbook-reader.browser.js +1 -1
  63. package/dist/browser/modules/excel/stream/workbook-writer.browser.d.ts +1 -1
  64. package/dist/browser/modules/excel/stream/workbook-writer.browser.js +1 -1
  65. package/dist/browser/modules/excel/utils/ooxml-validator.d.ts +48 -0
  66. package/dist/browser/modules/excel/utils/ooxml-validator.js +469 -0
  67. package/dist/browser/modules/excel/utils/parse-sax.d.ts +3 -0
  68. package/dist/browser/modules/excel/utils/parse-sax.js +32 -13
  69. package/dist/browser/modules/excel/worksheet.js +5 -2
  70. package/dist/browser/modules/excel/xlsx/xform/core/app-xform.js +3 -3
  71. package/dist/browser/modules/excel/xlsx/xform/core/core-xform.js +56 -68
  72. package/dist/browser/modules/excel/xlsx/xform/drawing/ctrl-prop-xform.d.ts +1 -0
  73. package/dist/browser/modules/excel/xlsx/xform/drawing/ctrl-prop-xform.js +13 -1
  74. package/dist/browser/modules/excel/xlsx/xform/drawing/sp-xform.d.ts +18 -0
  75. package/dist/browser/modules/excel/xlsx/xform/drawing/sp-xform.js +112 -0
  76. package/dist/browser/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +6 -1
  77. package/dist/browser/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.js +30 -2
  78. package/dist/browser/modules/excel/xlsx/xform/drawing/vml-drawing-xform.js +11 -0
  79. package/dist/browser/modules/excel/xlsx/xform/list-xform.js +8 -10
  80. package/dist/browser/modules/excel/xlsx/xform/sheet/page-setup-xform.d.ts +1 -0
  81. package/dist/browser/modules/excel/xlsx/xform/sheet/page-setup-xform.js +16 -2
  82. package/dist/browser/modules/excel/xlsx/xform/sheet/worksheet-xform.js +110 -12
  83. package/dist/browser/modules/excel/xlsx/xform/strings/shared-string-xform.js +2 -3
  84. package/dist/browser/modules/excel/xlsx/xform/strings/text-xform.js +5 -7
  85. package/dist/browser/modules/excel/xlsx/xlsx.browser.js +11 -10
  86. package/dist/browser/modules/excel/xlsx/xlsx.js +1 -1
  87. package/dist/browser/modules/stream/base-transform.d.ts +3 -0
  88. package/dist/browser/modules/stream/base-transform.js +34 -20
  89. package/dist/browser/modules/stream/buffered-stream.d.ts +2 -12
  90. package/dist/browser/modules/stream/chunked-builder.js +4 -4
  91. package/dist/browser/modules/stream/index.browser.d.ts +13 -19
  92. package/dist/browser/modules/stream/index.browser.js +10 -22
  93. package/dist/browser/modules/stream/index.d.ts +18 -41
  94. package/dist/browser/modules/stream/index.js +15 -44
  95. package/dist/browser/modules/stream/internal/event-utils.d.ts +17 -0
  96. package/dist/browser/modules/stream/internal/event-utils.js +40 -0
  97. package/dist/browser/modules/stream/internal/type-guards.d.ts +9 -0
  98. package/dist/browser/modules/stream/internal/type-guards.js +24 -0
  99. package/dist/browser/modules/stream/pull-stream.d.ts +5 -6
  100. package/dist/browser/modules/stream/pull-stream.js +107 -43
  101. package/dist/browser/modules/stream/shared.d.ts +1 -1
  102. package/dist/browser/modules/stream/shared.js +7 -4
  103. package/dist/browser/modules/stream/streams.browser.d.ts +32 -44
  104. package/dist/browser/modules/stream/streams.browser.js +921 -836
  105. package/dist/browser/modules/stream/streams.d.ts +4 -20
  106. package/dist/browser/modules/stream/streams.js +146 -95
  107. package/dist/browser/modules/stream/utils.js +5 -38
  108. package/dist/cjs/modules/archive/{compress.base.js → compression/compress.base.js} +1 -1
  109. package/dist/cjs/modules/archive/{compress.browser.js → compression/compress.browser.js} +3 -11
  110. package/dist/cjs/modules/archive/{compress.js → compression/compress.js} +1 -1
  111. package/dist/cjs/modules/archive/{crc32.js → compression/crc32.js} +1 -1
  112. package/dist/cjs/modules/archive/{deflate-fallback.js → compression/deflate-fallback.js} +1 -1
  113. package/dist/cjs/modules/archive/{streaming-compress.browser.js → compression/streaming-compress.browser.js} +3 -3
  114. package/dist/cjs/modules/archive/{streaming-compress.js → compression/streaming-compress.js} +2 -2
  115. package/dist/cjs/modules/archive/defaults.js +7 -4
  116. package/dist/cjs/modules/archive/index.base.js +9 -19
  117. package/dist/cjs/modules/archive/index.browser.js +4 -10
  118. package/dist/cjs/modules/archive/index.js +4 -8
  119. package/dist/cjs/modules/archive/internal/byte-queue.js +411 -0
  120. package/dist/cjs/modules/archive/io/archive-sink.js +49 -0
  121. package/dist/cjs/modules/archive/io/archive-source.js +105 -0
  122. package/dist/cjs/modules/archive/unzip/index.js +170 -0
  123. package/dist/cjs/modules/archive/unzip/stream.base.js +1044 -0
  124. package/dist/cjs/modules/archive/{parse.browser.js → unzip/stream.browser.js} +372 -111
  125. package/dist/cjs/modules/archive/{parse.js → unzip/stream.js} +9 -8
  126. package/dist/cjs/modules/archive/{zip-parser.js → unzip/zip-parser.js} +47 -33
  127. package/dist/cjs/modules/archive/utils/async-queue.js +106 -0
  128. package/dist/cjs/modules/archive/utils/bytes.js +16 -16
  129. package/dist/cjs/modules/archive/utils/compressibility.js +60 -0
  130. package/dist/cjs/modules/archive/utils/parse-buffer.js +21 -23
  131. package/dist/cjs/modules/archive/utils/pattern-scanner.js +31 -0
  132. package/dist/cjs/modules/archive/utils/timestamps.js +64 -3
  133. package/dist/cjs/modules/archive/utils/zip-extra-fields.js +26 -14
  134. package/dist/cjs/modules/archive/zip/index.js +162 -0
  135. package/dist/cjs/modules/archive/{streaming-zip.js → zip/stream.js} +194 -50
  136. package/dist/cjs/modules/archive/zip/zip-bytes.js +242 -0
  137. package/dist/cjs/modules/archive/{zip-entry-metadata.js → zip/zip-entry-metadata.js} +5 -5
  138. package/dist/cjs/modules/archive/zip-spec/zip-records.js +136 -0
  139. package/dist/cjs/modules/excel/stream/workbook-reader.browser.js +2 -2
  140. package/dist/cjs/modules/excel/stream/workbook-writer.browser.js +4 -4
  141. package/dist/cjs/modules/excel/utils/ooxml-validator.js +475 -0
  142. package/dist/cjs/modules/excel/utils/parse-sax.js +32 -13
  143. package/dist/cjs/modules/excel/worksheet.js +5 -2
  144. package/dist/cjs/modules/excel/xlsx/xform/core/app-xform.js +3 -3
  145. package/dist/cjs/modules/excel/xlsx/xform/core/core-xform.js +56 -68
  146. package/dist/cjs/modules/excel/xlsx/xform/drawing/ctrl-prop-xform.js +13 -1
  147. package/dist/cjs/modules/excel/xlsx/xform/drawing/sp-xform.js +115 -0
  148. package/dist/cjs/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.js +30 -2
  149. package/dist/cjs/modules/excel/xlsx/xform/drawing/vml-drawing-xform.js +11 -0
  150. package/dist/cjs/modules/excel/xlsx/xform/list-xform.js +8 -10
  151. package/dist/cjs/modules/excel/xlsx/xform/sheet/page-setup-xform.js +16 -2
  152. package/dist/cjs/modules/excel/xlsx/xform/sheet/worksheet-xform.js +110 -12
  153. package/dist/cjs/modules/excel/xlsx/xform/strings/shared-string-xform.js +2 -3
  154. package/dist/cjs/modules/excel/xlsx/xform/strings/text-xform.js +5 -7
  155. package/dist/cjs/modules/excel/xlsx/xlsx.browser.js +14 -13
  156. package/dist/cjs/modules/excel/xlsx/xlsx.js +2 -2
  157. package/dist/cjs/modules/stream/base-transform.js +34 -20
  158. package/dist/cjs/modules/stream/chunked-builder.js +4 -4
  159. package/dist/cjs/modules/stream/index.browser.js +10 -17
  160. package/dist/cjs/modules/stream/index.js +15 -39
  161. package/dist/cjs/modules/stream/internal/event-utils.js +43 -0
  162. package/dist/cjs/modules/stream/internal/type-guards.js +30 -0
  163. package/dist/cjs/modules/stream/pull-stream.js +107 -43
  164. package/dist/cjs/modules/stream/shared.js +7 -4
  165. package/dist/cjs/modules/stream/streams.browser.js +927 -847
  166. package/dist/cjs/modules/stream/streams.js +156 -107
  167. package/dist/cjs/modules/stream/utils.js +3 -36
  168. package/dist/esm/index.browser.js +12 -0
  169. package/dist/{browser/modules/archive → esm/modules/archive/compression}/compress.base.js +1 -1
  170. package/dist/esm/modules/archive/{compress.browser.js → compression/compress.browser.js} +3 -11
  171. package/dist/{browser/modules/archive → esm/modules/archive/compression}/compress.js +1 -1
  172. package/dist/esm/modules/archive/{crc32.js → compression/crc32.js} +1 -1
  173. package/dist/esm/modules/archive/{deflate-fallback.js → compression/deflate-fallback.js} +1 -1
  174. package/dist/esm/modules/archive/{streaming-compress.browser.js → compression/streaming-compress.browser.js} +3 -3
  175. package/dist/esm/modules/archive/{streaming-compress.js → compression/streaming-compress.js} +2 -2
  176. package/dist/esm/modules/archive/defaults.js +6 -3
  177. package/dist/esm/modules/archive/index.base.js +3 -6
  178. package/dist/esm/modules/archive/index.browser.js +3 -7
  179. package/dist/esm/modules/archive/index.js +3 -5
  180. package/dist/esm/modules/archive/internal/byte-queue.js +407 -0
  181. package/dist/esm/modules/archive/io/archive-sink.js +45 -0
  182. package/dist/esm/modules/archive/io/archive-source.js +100 -0
  183. package/dist/esm/modules/archive/unzip/index.js +164 -0
  184. package/dist/esm/modules/archive/unzip/stream.base.js +1022 -0
  185. package/dist/esm/modules/archive/{parse.browser.js → unzip/stream.browser.js} +371 -110
  186. package/dist/{browser/modules/archive/parse.js → esm/modules/archive/unzip/stream.js} +6 -5
  187. package/dist/{browser/modules/archive → esm/modules/archive/unzip}/zip-parser.js +38 -24
  188. package/dist/esm/modules/archive/utils/async-queue.js +103 -0
  189. package/dist/esm/modules/archive/utils/bytes.js +16 -16
  190. package/dist/esm/modules/archive/utils/compressibility.js +57 -0
  191. package/dist/esm/modules/archive/utils/parse-buffer.js +21 -23
  192. package/dist/esm/modules/archive/utils/pattern-scanner.js +27 -0
  193. package/dist/esm/modules/archive/utils/timestamps.js +62 -1
  194. package/dist/esm/modules/archive/utils/zip-extra-fields.js +26 -14
  195. package/dist/esm/modules/archive/zip/index.js +157 -0
  196. package/dist/esm/modules/archive/{streaming-zip.js → zip/stream.js} +192 -48
  197. package/dist/esm/modules/archive/zip/zip-bytes.js +239 -0
  198. package/dist/{browser/modules/archive → esm/modules/archive/zip}/zip-entry-metadata.js +3 -3
  199. package/dist/esm/modules/archive/zip-spec/zip-records.js +126 -0
  200. package/dist/esm/modules/excel/stream/workbook-reader.browser.js +1 -1
  201. package/dist/esm/modules/excel/stream/workbook-writer.browser.js +1 -1
  202. package/dist/esm/modules/excel/utils/ooxml-validator.js +469 -0
  203. package/dist/esm/modules/excel/utils/parse-sax.js +32 -13
  204. package/dist/esm/modules/excel/worksheet.js +5 -2
  205. package/dist/esm/modules/excel/xlsx/xform/core/app-xform.js +3 -3
  206. package/dist/esm/modules/excel/xlsx/xform/core/core-xform.js +56 -68
  207. package/dist/esm/modules/excel/xlsx/xform/drawing/ctrl-prop-xform.js +13 -1
  208. package/dist/esm/modules/excel/xlsx/xform/drawing/sp-xform.js +112 -0
  209. package/dist/esm/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.js +30 -2
  210. package/dist/esm/modules/excel/xlsx/xform/drawing/vml-drawing-xform.js +11 -0
  211. package/dist/esm/modules/excel/xlsx/xform/list-xform.js +8 -10
  212. package/dist/esm/modules/excel/xlsx/xform/sheet/page-setup-xform.js +16 -2
  213. package/dist/esm/modules/excel/xlsx/xform/sheet/worksheet-xform.js +110 -12
  214. package/dist/esm/modules/excel/xlsx/xform/strings/shared-string-xform.js +2 -3
  215. package/dist/esm/modules/excel/xlsx/xform/strings/text-xform.js +5 -7
  216. package/dist/esm/modules/excel/xlsx/xlsx.browser.js +11 -10
  217. package/dist/esm/modules/excel/xlsx/xlsx.js +1 -1
  218. package/dist/esm/modules/stream/base-transform.js +34 -20
  219. package/dist/esm/modules/stream/chunked-builder.js +4 -4
  220. package/dist/esm/modules/stream/index.browser.js +10 -22
  221. package/dist/esm/modules/stream/index.js +15 -44
  222. package/dist/esm/modules/stream/internal/event-utils.js +40 -0
  223. package/dist/esm/modules/stream/internal/type-guards.js +24 -0
  224. package/dist/esm/modules/stream/pull-stream.js +107 -43
  225. package/dist/esm/modules/stream/shared.js +7 -4
  226. package/dist/esm/modules/stream/streams.browser.js +921 -836
  227. package/dist/esm/modules/stream/streams.js +146 -95
  228. package/dist/esm/modules/stream/utils.js +5 -38
  229. package/dist/iife/THIRD_PARTY_NOTICES.md +0 -31
  230. package/dist/iife/excelts.iife.js +6592 -4537
  231. package/dist/iife/excelts.iife.js.map +1 -1
  232. package/dist/iife/excelts.iife.min.js +103 -31
  233. package/dist/types/index.browser.d.ts +1 -0
  234. package/dist/{browser/modules/archive → types/modules/archive/compression}/compress.browser.d.ts +2 -8
  235. package/dist/types/modules/archive/{streaming-compress.browser.d.ts → compression/streaming-compress.browser.d.ts} +1 -1
  236. package/dist/types/modules/archive/defaults.d.ts +1 -0
  237. package/dist/types/modules/archive/index.base.d.ts +4 -4
  238. package/dist/types/modules/archive/index.browser.d.ts +3 -4
  239. package/dist/types/modules/archive/index.d.ts +3 -4
  240. package/dist/types/modules/archive/internal/byte-queue.d.ts +33 -0
  241. package/dist/types/modules/archive/io/archive-sink.d.ts +8 -0
  242. package/dist/types/modules/archive/io/archive-source.d.ts +6 -0
  243. package/dist/types/modules/archive/unzip/index.d.ts +40 -0
  244. package/dist/types/modules/archive/{parse.base.d.ts → unzip/stream.base.d.ts} +38 -4
  245. package/dist/types/modules/archive/{parse.browser.d.ts → unzip/stream.browser.d.ts} +2 -2
  246. package/dist/types/modules/archive/{parse.d.ts → unzip/stream.d.ts} +3 -3
  247. package/dist/types/modules/archive/{zip-parser.d.ts → unzip/zip-parser.d.ts} +1 -1
  248. package/dist/types/modules/archive/utils/async-queue.d.ts +7 -0
  249. package/dist/types/modules/archive/utils/compressibility.d.ts +10 -0
  250. package/dist/types/modules/archive/utils/pattern-scanner.d.ts +21 -0
  251. package/dist/types/modules/archive/utils/zip-extra-fields.d.ts +1 -1
  252. package/dist/types/modules/archive/zip/index.d.ts +42 -0
  253. package/dist/types/modules/archive/{streaming-zip.d.ts → zip/stream.d.ts} +29 -6
  254. package/dist/types/modules/archive/zip/zip-bytes.d.ts +73 -0
  255. package/dist/types/modules/archive/{zip-entry-metadata.d.ts → zip/zip-entry-metadata.d.ts} +1 -1
  256. package/dist/types/modules/archive/{zip-records.d.ts → zip-spec/zip-records.d.ts} +20 -0
  257. package/dist/types/modules/excel/stream/workbook-writer.browser.d.ts +1 -1
  258. package/dist/types/modules/excel/utils/ooxml-validator.d.ts +48 -0
  259. package/dist/types/modules/excel/utils/parse-sax.d.ts +3 -0
  260. package/dist/types/modules/excel/xlsx/xform/drawing/ctrl-prop-xform.d.ts +1 -0
  261. package/dist/types/modules/excel/xlsx/xform/drawing/sp-xform.d.ts +18 -0
  262. package/dist/types/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +6 -1
  263. package/dist/types/modules/excel/xlsx/xform/sheet/page-setup-xform.d.ts +1 -0
  264. package/dist/types/modules/stream/base-transform.d.ts +3 -0
  265. package/dist/types/modules/stream/buffered-stream.d.ts +2 -12
  266. package/dist/types/modules/stream/index.browser.d.ts +13 -19
  267. package/dist/types/modules/stream/index.d.ts +18 -41
  268. package/dist/types/modules/stream/internal/event-utils.d.ts +17 -0
  269. package/dist/types/modules/stream/internal/type-guards.d.ts +9 -0
  270. package/dist/types/modules/stream/pull-stream.d.ts +5 -6
  271. package/dist/types/modules/stream/shared.d.ts +1 -1
  272. package/dist/types/modules/stream/streams.browser.d.ts +32 -44
  273. package/dist/types/modules/stream/streams.d.ts +4 -20
  274. package/package.json +14 -10
  275. package/dist/browser/modules/archive/byte-queue.d.ts +0 -18
  276. package/dist/browser/modules/archive/byte-queue.js +0 -125
  277. package/dist/browser/modules/archive/parse.base.js +0 -644
  278. package/dist/browser/modules/archive/utils/zip-extra.d.ts +0 -18
  279. package/dist/browser/modules/archive/utils/zip-extra.js +0 -68
  280. package/dist/browser/modules/archive/zip-builder.d.ts +0 -117
  281. package/dist/browser/modules/archive/zip-builder.js +0 -292
  282. package/dist/browser/modules/archive/zip-constants.d.ts +0 -18
  283. package/dist/browser/modules/archive/zip-constants.js +0 -23
  284. package/dist/browser/modules/archive/zip-records.js +0 -84
  285. package/dist/cjs/modules/archive/byte-queue.js +0 -129
  286. package/dist/cjs/modules/archive/parse.base.js +0 -666
  287. package/dist/cjs/modules/archive/utils/zip-extra.js +0 -74
  288. package/dist/cjs/modules/archive/zip-builder.js +0 -297
  289. package/dist/cjs/modules/archive/zip-constants.js +0 -26
  290. package/dist/cjs/modules/archive/zip-records.js +0 -90
  291. package/dist/esm/modules/archive/byte-queue.js +0 -125
  292. package/dist/esm/modules/archive/parse.base.js +0 -644
  293. package/dist/esm/modules/archive/utils/zip-extra.js +0 -68
  294. package/dist/esm/modules/archive/zip-builder.js +0 -292
  295. package/dist/esm/modules/archive/zip-constants.js +0 -23
  296. package/dist/esm/modules/archive/zip-records.js +0 -84
  297. package/dist/types/modules/archive/byte-queue.d.ts +0 -18
  298. package/dist/types/modules/archive/utils/zip-extra.d.ts +0 -18
  299. package/dist/types/modules/archive/zip-builder.d.ts +0 -117
  300. package/dist/types/modules/archive/zip-constants.d.ts +0 -18
  301. /package/dist/browser/modules/archive/{compress.base.d.ts → compression/compress.base.d.ts} +0 -0
  302. /package/dist/browser/modules/archive/{crc32.base.d.ts → compression/crc32.base.d.ts} +0 -0
  303. /package/dist/browser/modules/archive/{crc32.base.js → compression/crc32.base.js} +0 -0
  304. /package/dist/browser/modules/archive/{crc32.browser.js → compression/crc32.browser.js} +0 -0
  305. /package/dist/browser/modules/archive/{deflate-fallback.d.ts → compression/deflate-fallback.d.ts} +0 -0
  306. /package/dist/browser/modules/archive/{streaming-compress.base.d.ts → compression/streaming-compress.base.d.ts} +0 -0
  307. /package/dist/browser/modules/archive/{streaming-compress.base.js → compression/streaming-compress.base.js} +0 -0
  308. /package/dist/browser/modules/archive/{extract.js → unzip/extract.js} +0 -0
  309. /package/dist/browser/modules/archive/{zip-entry-metadata.d.ts → zip/zip-entry-metadata.d.ts} +0 -0
  310. /package/dist/browser/modules/archive/{zip-entry-info.d.ts → zip-spec/zip-entry-info.d.ts} +0 -0
  311. /package/dist/browser/modules/archive/{zip-entry-info.js → zip-spec/zip-entry-info.js} +0 -0
  312. /package/dist/cjs/modules/archive/{crc32.base.js → compression/crc32.base.js} +0 -0
  313. /package/dist/cjs/modules/archive/{crc32.browser.js → compression/crc32.browser.js} +0 -0
  314. /package/dist/cjs/modules/archive/{streaming-compress.base.js → compression/streaming-compress.base.js} +0 -0
  315. /package/dist/cjs/modules/archive/{extract.js → unzip/extract.js} +0 -0
  316. /package/dist/cjs/modules/archive/{zip-entry-info.js → zip-spec/zip-entry-info.js} +0 -0
  317. /package/dist/esm/modules/archive/{crc32.base.js → compression/crc32.base.js} +0 -0
  318. /package/dist/esm/modules/archive/{crc32.browser.js → compression/crc32.browser.js} +0 -0
  319. /package/dist/esm/modules/archive/{streaming-compress.base.js → compression/streaming-compress.base.js} +0 -0
  320. /package/dist/esm/modules/archive/{extract.js → unzip/extract.js} +0 -0
  321. /package/dist/esm/modules/archive/{zip-entry-info.js → zip-spec/zip-entry-info.js} +0 -0
  322. /package/dist/types/modules/archive/{compress.base.d.ts → compression/compress.base.d.ts} +0 -0
  323. /package/dist/types/modules/archive/{compress.d.ts → compression/compress.d.ts} +0 -0
  324. /package/dist/types/modules/archive/{crc32.base.d.ts → compression/crc32.base.d.ts} +0 -0
  325. /package/dist/types/modules/archive/{crc32.browser.d.ts → compression/crc32.browser.d.ts} +0 -0
  326. /package/dist/types/modules/archive/{crc32.d.ts → compression/crc32.d.ts} +0 -0
  327. /package/dist/types/modules/archive/{deflate-fallback.d.ts → compression/deflate-fallback.d.ts} +0 -0
  328. /package/dist/types/modules/archive/{streaming-compress.base.d.ts → compression/streaming-compress.base.d.ts} +0 -0
  329. /package/dist/types/modules/archive/{streaming-compress.d.ts → compression/streaming-compress.d.ts} +0 -0
  330. /package/dist/types/modules/archive/{extract.d.ts → unzip/extract.d.ts} +0 -0
  331. /package/dist/types/modules/archive/{zip-entry-info.d.ts → zip-spec/zip-entry-info.d.ts} +0 -0
@@ -10,14 +10,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.Parse = void 0;
11
11
  exports.createParseClass = createParseClass;
12
12
  exports.createParse = createParse;
13
- const _stream_1 = require("../stream/index.js");
14
- const binary_1 = require("./utils/binary.js");
15
- const bytes_1 = require("./utils/bytes.js");
16
- const parse_base_1 = require("./parse.base.js");
17
- const deflate_fallback_1 = require("./deflate-fallback.js");
18
- const byte_queue_1 = require("./byte-queue.js");
19
- const zip_constants_1 = require("./zip-constants.js");
20
- const compress_base_1 = require("./compress.base.js");
13
+ const _stream_1 = require("../../stream/index.js");
14
+ const stream_base_1 = require("./stream.base.js");
15
+ const pattern_scanner_1 = require("../utils/pattern-scanner.js");
16
+ const deflate_fallback_1 = require("../compression/deflate-fallback.js");
17
+ const byte_queue_1 = require("../internal/byte-queue.js");
18
+ const compress_base_1 = require("../compression/compress.base.js");
19
+ const DEFAULT_UNZIP_STREAM_HIGH_WATER_MARK = 256 * 1024;
21
20
  // =============================================================================
22
21
  // Browser InflateRaw using DecompressionStream
23
22
  // =============================================================================
@@ -34,6 +33,9 @@ class BrowserInflateRaw extends _stream_1.Duplex {
34
33
  // Pass write handler to Duplex so pipe() calls our write method
35
34
  // Also pass final handler to close the DecompressionStream when _writable ends
36
35
  super({
36
+ // Keep the internal buffer bounded; this stream is used in tight parse loops.
37
+ writableHighWaterMark: 512 * 1024,
38
+ readableHighWaterMark: 512 * 1024,
37
39
  write: (chunk, _encoding, callback) => {
38
40
  this._doWrite(chunk, callback);
39
41
  },
@@ -142,47 +144,6 @@ class BrowserInflateRaw extends _stream_1.Duplex {
142
144
  this.push(null);
143
145
  }
144
146
  }
145
- // Override write to feed data into DecompressionStream
146
- write(chunk, encodingOrCallback, callback) {
147
- // Handle overload
148
- let cb;
149
- if (typeof encodingOrCallback === "function") {
150
- cb = encodingOrCallback;
151
- }
152
- else {
153
- cb = callback;
154
- }
155
- this._doWrite(chunk, cb);
156
- return true;
157
- }
158
- // Override end to close the DecompressionStream writer
159
- end(chunkOrCallback, encodingOrCallback, callback) {
160
- // Handle overloads
161
- let chunk;
162
- let cb;
163
- if (typeof chunkOrCallback === "function") {
164
- cb = chunkOrCallback;
165
- }
166
- else if (chunkOrCallback !== undefined) {
167
- chunk = chunkOrCallback;
168
- if (typeof encodingOrCallback === "function") {
169
- cb = encodingOrCallback;
170
- }
171
- else {
172
- cb = callback;
173
- }
174
- }
175
- // Write final chunk if provided
176
- if (chunk) {
177
- this.write(chunk, () => {
178
- this._closeWriter(cb);
179
- });
180
- }
181
- else {
182
- this._closeWriter(cb);
183
- }
184
- return this;
185
- }
186
147
  _closeWriter(callback) {
187
148
  if (this.writeClosed) {
188
149
  this._readingDonePromise.then(() => {
@@ -210,7 +171,6 @@ class BrowserInflateRaw extends _stream_1.Duplex {
210
171
  if (callback) {
211
172
  callback();
212
173
  }
213
- this.emit("finish");
214
174
  });
215
175
  });
216
176
  }
@@ -223,6 +183,225 @@ class BrowserInflateRaw extends _stream_1.Duplex {
223
183
  }
224
184
  }
225
185
  // =============================================================================
186
+ // Worker-based InflateRaw (optional)
187
+ // =============================================================================
188
+ let _inflateWorkerUrl = null;
189
+ function getInflateWorkerUrl(customUrl) {
190
+ if (typeof customUrl === "string" && customUrl.length > 0) {
191
+ return customUrl;
192
+ }
193
+ if (_inflateWorkerUrl) {
194
+ return _inflateWorkerUrl;
195
+ }
196
+ // Inline worker to avoid bundler-specific worker loaders.
197
+ // It streams deflate-raw through DecompressionStream and posts decompressed chunks back.
198
+ const code = `
199
+ let ds;
200
+ let writer;
201
+ let reader;
202
+ let junkError = false;
203
+ let pendingWrites = 0;
204
+
205
+ function isJunkErrorMessage(msg) {
206
+ return typeof msg === 'string' && (msg.includes('Junk') || msg.includes('junk'));
207
+ }
208
+
209
+ async function ensureStarted() {
210
+ if (ds) return;
211
+ ds = new DecompressionStream('deflate-raw');
212
+ writer = ds.writable.getWriter();
213
+ reader = ds.readable.getReader();
214
+
215
+ (async () => {
216
+ try {
217
+ while (true) {
218
+ const r = await reader.read();
219
+ if (r.done) break;
220
+ const chunk = r.value;
221
+ postMessage({ t: 'data', chunk }, [chunk.buffer]);
222
+ }
223
+ postMessage({ t: 'end' });
224
+ } catch (e) {
225
+ const msg = e && e.message ? e.message : String(e);
226
+ if (isJunkErrorMessage(msg)) {
227
+ junkError = true;
228
+ postMessage({ t: 'end' });
229
+ } else {
230
+ postMessage({ t: 'error', message: msg });
231
+ }
232
+ }
233
+ })();
234
+ }
235
+
236
+ onmessage = async (ev) => {
237
+ const msg = ev.data;
238
+ try {
239
+ await ensureStarted();
240
+ if (msg.t === 'write') {
241
+ if (junkError) {
242
+ postMessage({ t: 'ack', id: msg.id });
243
+ return;
244
+ }
245
+ pendingWrites++;
246
+ await writer.write(msg.chunk);
247
+ pendingWrites--;
248
+ postMessage({ t: 'ack', id: msg.id });
249
+ return;
250
+ }
251
+ if (msg.t === 'close') {
252
+ // Wait for in-flight writes to finish (best-effort).
253
+ while (pendingWrites > 0) {
254
+ await new Promise(r => setTimeout(r, 0));
255
+ }
256
+ try { await writer.close(); } catch (_) {}
257
+ postMessage({ t: 'closed' });
258
+ return;
259
+ }
260
+ if (msg.t === 'abort') {
261
+ try { await writer.abort(); } catch (_) {}
262
+ postMessage({ t: 'aborted' });
263
+ return;
264
+ }
265
+ } catch (e) {
266
+ const m = e && e.message ? e.message : String(e);
267
+ postMessage({ t: 'error', message: m, id: msg && msg.id });
268
+ }
269
+ };
270
+ `;
271
+ const blob = new Blob([code], { type: "text/javascript" });
272
+ _inflateWorkerUrl = URL.createObjectURL(blob);
273
+ return _inflateWorkerUrl;
274
+ }
275
+ class WorkerInflateRaw extends _stream_1.Duplex {
276
+ constructor(workerUrl) {
277
+ super({
278
+ write: (chunk, _encoding, callback) => {
279
+ this._doWrite(chunk, callback);
280
+ },
281
+ final: (callback) => {
282
+ this._doClose(callback);
283
+ }
284
+ });
285
+ this._nextId = 1;
286
+ this._pendingAcks = new Map();
287
+ this._closed = false;
288
+ this._junkError = false;
289
+ this._terminated = false;
290
+ const url = getInflateWorkerUrl(workerUrl);
291
+ this.worker = new Worker(url);
292
+ this.worker.onmessage = (ev) => {
293
+ const msg = ev.data;
294
+ if (!msg || typeof msg.t !== "string") {
295
+ return;
296
+ }
297
+ if (msg.t === "data") {
298
+ const chunk = msg.chunk;
299
+ this.push(chunk);
300
+ return;
301
+ }
302
+ if (msg.t === "end") {
303
+ this.push(null);
304
+ this._terminateWorker();
305
+ return;
306
+ }
307
+ if (msg.t === "aborted") {
308
+ this._terminateWorker();
309
+ return;
310
+ }
311
+ if (msg.t === "ack") {
312
+ const id = msg.id;
313
+ const cb = this._pendingAcks.get(id);
314
+ if (cb) {
315
+ this._pendingAcks.delete(id);
316
+ cb();
317
+ }
318
+ return;
319
+ }
320
+ if (msg.t === "error") {
321
+ const message = typeof msg.message === "string" ? msg.message : "Worker inflate error";
322
+ if (message.includes("Junk") || message.includes("junk")) {
323
+ this._junkError = true;
324
+ // Treat as end-of-stream.
325
+ this.push(null);
326
+ this._terminateWorker();
327
+ // Resolve any pending writes.
328
+ for (const cb of this._pendingAcks.values()) {
329
+ cb();
330
+ }
331
+ this._pendingAcks.clear();
332
+ return;
333
+ }
334
+ const err = new Error(message);
335
+ // Fail any pending writes.
336
+ for (const cb of this._pendingAcks.values()) {
337
+ cb(err);
338
+ }
339
+ this._pendingAcks.clear();
340
+ this.emit("error", err);
341
+ this._terminateWorker();
342
+ return;
343
+ }
344
+ };
345
+ this.worker.onerror = (e) => {
346
+ const err = new Error(e.message || "Worker error");
347
+ for (const cb of this._pendingAcks.values()) {
348
+ cb(err);
349
+ }
350
+ this._pendingAcks.clear();
351
+ this.emit("error", err);
352
+ this._terminateWorker();
353
+ };
354
+ }
355
+ _terminateWorker() {
356
+ if (this._terminated) {
357
+ return;
358
+ }
359
+ this._terminated = true;
360
+ try {
361
+ this.worker.terminate();
362
+ }
363
+ catch {
364
+ // ignore
365
+ }
366
+ }
367
+ _doWrite(chunk, callback) {
368
+ if (this._closed || this._junkError) {
369
+ callback();
370
+ return;
371
+ }
372
+ const id = this._nextId++;
373
+ this._pendingAcks.set(id, callback);
374
+ // Transfer the underlying ArrayBuffer to reduce copies.
375
+ // If chunk is a view into a larger buffer, slice to avoid transferring unrelated bytes.
376
+ const transferable = chunk.byteOffset === 0 && chunk.byteLength === chunk.buffer.byteLength
377
+ ? chunk
378
+ : chunk.slice();
379
+ this.worker.postMessage({ t: "write", id, chunk: transferable }, [transferable.buffer]);
380
+ }
381
+ _doClose(callback) {
382
+ if (this._closed) {
383
+ callback();
384
+ return;
385
+ }
386
+ this._closed = true;
387
+ this.worker.postMessage({ t: "close" });
388
+ callback();
389
+ }
390
+ destroy(error) {
391
+ if (!this._closed) {
392
+ this._closed = true;
393
+ try {
394
+ this.worker.postMessage({ t: "abort" });
395
+ }
396
+ catch {
397
+ // ignore
398
+ }
399
+ }
400
+ this._terminateWorker();
401
+ return super.destroy(error);
402
+ }
403
+ }
404
+ // =============================================================================
226
405
  // Fallback InflateRaw for browsers without DecompressionStream
227
406
  // =============================================================================
228
407
  /**
@@ -282,7 +461,7 @@ function createInflateRaw() {
282
461
  // =============================================================================
283
462
  // Utilities
284
463
  // =============================================================================
285
- const dataDescriptorSignature = (0, binary_1.writeUint32LE)(zip_constants_1.DATA_DESCRIPTOR_SIG);
464
+ const dataDescriptorSignature = stream_base_1.DATA_DESCRIPTOR_SIGNATURE_BYTES;
286
465
  function createParseClass(createInflateRawFn) {
287
466
  /**
288
467
  * ZIP Stream Parser for browsers.
@@ -296,11 +475,11 @@ function createParseClass(createInflateRawFn) {
296
475
  super({
297
476
  objectMode: true,
298
477
  write: (chunk, _encoding, callback) => {
299
- this._handleWrite(chunk);
300
- callback();
478
+ this._handleWrite(chunk, callback);
301
479
  },
302
480
  final: (callback) => {
303
481
  this.finished = true;
482
+ this._maybeReleaseWriteCallback();
304
483
  this._wakeUp();
305
484
  this.emit("data-available");
306
485
  this.emit("chunk", false);
@@ -312,6 +491,12 @@ function createParseClass(createInflateRawFn) {
312
491
  this._driverState = {};
313
492
  this._parsingDone = Promise.resolve();
314
493
  this._opts = opts;
494
+ // Default values are intentionally conservative to avoid memory spikes
495
+ // when parsing large archives under slow consumers.
496
+ const hi = Math.max(64 * 1024, opts.inputHighWaterMarkBytes ?? 2 * 1024 * 1024);
497
+ const lo = Math.max(32 * 1024, opts.inputLowWaterMarkBytes ?? Math.floor(hi / 4));
498
+ this._inputHighWaterMarkBytes = hi;
499
+ this._inputLowWaterMarkBytes = Math.min(lo, hi);
315
500
  const io = {
316
501
  pull: (length) => this.pull(length),
317
502
  pullUntil: (pattern, includeEof) => this.pullUntil(pattern, includeEof),
@@ -339,6 +524,12 @@ function createParseClass(createInflateRawFn) {
339
524
  },
340
525
  emitError: (err) => {
341
526
  this.__emittedError = err;
527
+ // Ensure upstream writers don't hang waiting for a deferred write callback.
528
+ if (this._writeCb) {
529
+ const cb = this._writeCb;
530
+ this._writeCb = undefined;
531
+ cb(err);
532
+ }
342
533
  this.emit("error", err);
343
534
  },
344
535
  emitClose: () => {
@@ -349,7 +540,22 @@ function createParseClass(createInflateRawFn) {
349
540
  // NOTE: We intentionally do NOT pass inflateRawSync to runParseLoop in browser.
350
541
  // Browser's native DecompressionStream is faster than our pure-JS fallback,
351
542
  // so we always use the streaming path for decompression in browsers.
352
- this._parsingDone = (0, parse_base_1.runParseLoop)(this._opts, io, emitter, () => createInflateRawFn(), this._driverState
543
+ const inflateFactory = () => {
544
+ if (this._opts.useWorkerInflate && typeof Worker !== "undefined") {
545
+ // Worker path requires DecompressionStream support.
546
+ if ((0, compress_base_1.hasDeflateRawDecompressionStream)()) {
547
+ try {
548
+ return new WorkerInflateRaw(this._opts.workerInflateUrl);
549
+ }
550
+ catch {
551
+ // If Worker construction fails (e.g. CSP/CORS), fall back.
552
+ return createInflateRawFn();
553
+ }
554
+ }
555
+ }
556
+ return createInflateRawFn();
557
+ };
558
+ this._parsingDone = (0, stream_base_1.runParseLoop)(this._opts, io, emitter, inflateFactory, this._driverState
353
559
  // No inflateRawSync - always use streaming DecompressionStream in browser
354
560
  );
355
561
  this._parsingDone.catch((e) => {
@@ -361,8 +567,16 @@ function createParseClass(createInflateRawFn) {
361
567
  });
362
568
  });
363
569
  }
364
- _handleWrite(chunk) {
570
+ _handleWrite(chunk, callback) {
365
571
  this._buffer.append(chunk);
572
+ // Apply writable backpressure by deferring the callback when the input buffer is large.
573
+ // The callback will be released once the parser drains the buffer.
574
+ if (this._buffer.length >= this._inputHighWaterMarkBytes) {
575
+ this._writeCb = callback;
576
+ }
577
+ else {
578
+ callback();
579
+ }
366
580
  this._wakeUp();
367
581
  this.emit("data-available");
368
582
  this.emit("chunk");
@@ -373,13 +587,6 @@ function createParseClass(createInflateRawFn) {
373
587
  set buffer(value) {
374
588
  this._buffer.reset(value);
375
589
  }
376
- _maybeReleaseWriteCallback() {
377
- if (typeof this.cb === "function") {
378
- const callback = this.cb;
379
- this.cb = undefined;
380
- callback();
381
- }
382
- }
383
590
  _wakeUp() {
384
591
  if (this._pendingResolve) {
385
592
  const resolve = this._pendingResolve;
@@ -387,6 +594,17 @@ function createParseClass(createInflateRawFn) {
387
594
  resolve();
388
595
  }
389
596
  }
597
+ _maybeReleaseWriteCallback() {
598
+ if (!this._writeCb) {
599
+ return;
600
+ }
601
+ if (this._buffer.length > this._inputLowWaterMarkBytes) {
602
+ return;
603
+ }
604
+ const cb = this._writeCb;
605
+ this._writeCb = undefined;
606
+ cb();
607
+ }
390
608
  _waitForData() {
391
609
  return new Promise(resolve => {
392
610
  this._pendingResolve = resolve;
@@ -400,60 +618,76 @@ function createParseClass(createInflateRawFn) {
400
618
  if (this.finished) {
401
619
  if (this._buffer.length > 0) {
402
620
  const data = this._buffer.read(this._buffer.length);
621
+ this._maybeReleaseWriteCallback();
403
622
  return data;
404
623
  }
405
624
  throw new Error("FILE_ENDED");
406
625
  }
407
626
  await this._waitForData();
408
627
  }
409
- return this._buffer.read(length);
628
+ const out = this._buffer.read(length);
629
+ this._maybeReleaseWriteCallback();
630
+ return out;
410
631
  }
411
632
  async _pullUntilInternal(pattern, includeEof = false) {
412
633
  const chunks = [];
413
- let searchFrom = 0;
414
- const overlap = Math.max(0, pattern.length - 1);
634
+ const scanner = new pattern_scanner_1.PatternScanner(pattern);
415
635
  while (true) {
416
- const view = this._buffer.view();
417
- const match = (0, bytes_1.indexOfUint8ArrayPattern)(view, pattern, searchFrom);
636
+ const bufLen = this._buffer.length;
637
+ const match = scanner.find(this._buffer);
418
638
  if (match !== -1) {
419
639
  this.match = match;
420
640
  const toRead = match + (includeEof ? pattern.length : 0);
421
641
  if (toRead > 0) {
422
642
  chunks.push(this._buffer.read(toRead));
643
+ this._maybeReleaseWriteCallback();
423
644
  }
424
- return (0, _stream_1.concatUint8Arrays)(chunks);
645
+ return chunks.length === 1 ? chunks[0] : (0, _stream_1.concatUint8Arrays)(chunks);
425
646
  }
426
647
  // No match yet. Avoid rescanning bytes that can't start a match.
427
- searchFrom = Math.max(searchFrom, Math.max(0, view.length - overlap));
648
+ scanner.onNoMatch(bufLen);
428
649
  if (this.finished) {
429
650
  throw new Error("FILE_ENDED");
430
651
  }
431
652
  const safeLen = Math.max(0, this._buffer.length - pattern.length);
432
653
  if (safeLen > 0) {
433
654
  chunks.push(this._buffer.read(safeLen));
434
- searchFrom = Math.max(0, searchFrom - safeLen);
655
+ scanner.onConsume(safeLen);
656
+ this._maybeReleaseWriteCallback();
435
657
  }
436
658
  await this._waitForData();
437
659
  }
438
660
  }
439
661
  _streamFixedLength(length) {
440
- const output = new _stream_1.PassThrough();
662
+ const output = new _stream_1.PassThrough({ highWaterMark: DEFAULT_UNZIP_STREAM_HIGH_WATER_MARK });
441
663
  let remaining = length;
442
664
  let done = false;
665
+ let waitingDrain = false;
443
666
  const pull = () => {
444
667
  if (done) {
445
668
  return;
446
669
  }
670
+ if (waitingDrain) {
671
+ return;
672
+ }
447
673
  while (remaining > 0 && this._buffer.length > 0) {
448
674
  const toRead = Math.min(remaining, this._buffer.length);
449
675
  const chunk = this._buffer.read(toRead);
450
676
  remaining -= toRead;
451
- output.write(chunk);
677
+ const ok = output.write(chunk);
678
+ this._maybeReleaseWriteCallback();
679
+ if (!ok) {
680
+ waitingDrain = true;
681
+ output.once("drain", () => {
682
+ waitingDrain = false;
683
+ pull();
684
+ });
685
+ return;
686
+ }
452
687
  }
453
688
  if (remaining === 0) {
454
689
  done = true;
455
690
  this.removeListener("data-available", pull);
456
- this._maybeReleaseWriteCallback();
457
691
  output.end();
458
692
  }
459
693
  else if (this.finished) {
@@ -467,42 +701,69 @@ function createParseClass(createInflateRawFn) {
467
701
  return output;
468
702
  }
469
703
  _streamUntilPattern(pattern, includeEof = false) {
470
- const output = new _stream_1.PassThrough();
704
+ const output = new _stream_1.PassThrough({ highWaterMark: DEFAULT_UNZIP_STREAM_HIGH_WATER_MARK });
471
705
  let done = false;
472
- let searchFrom = 0;
473
- const overlap = Math.max(0, pattern.length - 1);
706
+ const patternLen = pattern.length;
707
+ const scanner = new pattern_scanner_1.PatternScanner(pattern);
708
+ let waitingDrain = false;
474
709
  const pull = () => {
475
- if (done) {
710
+ if (done || waitingDrain) {
476
711
  return;
477
712
  }
478
- const view = this._buffer.view();
479
- const match = (0, bytes_1.indexOfUint8ArrayPattern)(view, pattern, searchFrom);
480
- if (match !== -1) {
481
- this.match = match;
482
- const endIndex = includeEof ? match + pattern.length : match;
483
- if (endIndex > 0) {
484
- output.write(this._buffer.read(endIndex));
713
+ while (true) {
714
+ if (this._buffer.length <= 0) {
715
+ break;
485
716
  }
486
- done = true;
487
- this.removeListener("data-available", pull);
488
- this._maybeReleaseWriteCallback();
489
- output.end();
490
- return;
491
- }
492
- // No match yet. Avoid rescanning bytes that can't start a match.
493
- searchFrom = Math.max(searchFrom, Math.max(0, view.length - overlap));
494
- if (this.finished) {
495
- done = true;
496
- this.removeListener("data-available", pull);
497
- this._maybeReleaseWriteCallback();
498
- output.destroy(new Error("FILE_ENDED"));
499
- return;
500
- }
501
- const safeLen = Math.max(0, this._buffer.length - pattern.length);
502
- if (safeLen > 0) {
503
- output.write(this._buffer.read(safeLen));
504
- searchFrom = Math.max(0, searchFrom - safeLen);
717
+ const bufLen = this._buffer.length;
718
+ const match = scanner.find(this._buffer);
719
+ if (match !== -1) {
720
+ this.match = match;
721
+ const endIndex = includeEof ? match + patternLen : match;
722
+ if (endIndex > 0) {
723
+ const ok = output.write(this._buffer.read(endIndex));
724
+ scanner.onConsume(endIndex);
725
+ this._maybeReleaseWriteCallback();
726
+ if (!ok) {
727
+ waitingDrain = true;
728
+ output.once("drain", () => {
729
+ waitingDrain = false;
730
+ pull();
731
+ });
732
+ return;
733
+ }
734
+ }
735
+ done = true;
736
+ this.removeListener("data-available", pull);
737
+ output.end();
738
+ return;
739
+ }
740
+ // No match yet. Avoid rescanning bytes that can't start a match.
741
+ scanner.onNoMatch(bufLen);
742
+ if (this.finished) {
743
+ done = true;
744
+ this.removeListener("data-available", pull);
745
+ output.destroy(new Error("FILE_ENDED"));
746
+ return;
747
+ }
748
+ const safeLen = bufLen - patternLen;
749
+ if (safeLen <= 0) {
750
+ // Keep enough bytes to detect a split signature.
751
+ if (this._buffer.length <= patternLen) {
752
+ this._maybeReleaseWriteCallback();
753
+ }
754
+ break;
755
+ }
756
+ const ok = output.write(this._buffer.read(safeLen));
757
+ scanner.onConsume(safeLen);
505
758
  this._maybeReleaseWriteCallback();
759
+ if (!ok) {
760
+ waitingDrain = true;
761
+ output.once("drain", () => {
762
+ waitingDrain = false;
763
+ pull();
764
+ });
765
+ return;
766
+ }
506
767
  }
507
768
  };
508
769
  this.on("data-available", pull);
@@ -525,11 +786,7 @@ function createParseClass(createInflateRawFn) {
525
786
  return Promise.reject(new Error("FILE_ENDED"));
526
787
  }
527
788
  if (this._buffer.length >= eof) {
528
- const data = this._buffer.read(eof);
529
- if (this._buffer.length === 0) {
530
- this._maybeReleaseWriteCallback();
531
- }
532
- return Promise.resolve(data);
789
+ return Promise.resolve(this._buffer.read(eof));
533
790
  }
534
791
  return this._pullInternal(eof);
535
792
  }
@@ -543,16 +800,20 @@ function createParseClass(createInflateRawFn) {
543
800
  return this.pull(pattern, includeEof);
544
801
  }
545
802
  _streamUntilDataDescriptor() {
546
- return (0, parse_base_1.streamUntilValidatedDataDescriptor)({
803
+ return (0, stream_base_1.streamUntilValidatedDataDescriptor)({
547
804
  source: {
548
- getView: () => this._buffer.view(),
549
805
  getLength: () => this._buffer.length,
550
806
  read: (length) => this._buffer.read(length),
807
+ peekChunks: (length) => this._buffer.peekChunks(length),
808
+ discard: (length) => this._buffer.discard(length),
809
+ indexOfPattern: (pattern, startIndex) => this._buffer.indexOfPattern(pattern, startIndex),
810
+ peekUint32LE: (offset) => this._buffer.peekUint32LE(offset),
551
811
  isFinished: () => this.finished,
552
812
  onDataAvailable: (cb) => {
553
813
  this.on("data-available", cb);
554
814
  return () => this.removeListener("data-available", cb);
555
- }
815
+ },
816
+ maybeReleaseWriteCallback: () => this._maybeReleaseWriteCallback()
556
817
  },
557
818
  dataDescriptorSignature
558
819
  });