@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
@@ -6,7 +6,7 @@
6
6
  * Uses the browser Duplex stream implementation for compatibility.
7
7
  */
8
8
  import { Duplex } from "@stream";
9
- import { type CrxHeader, type PullStreamPublicApi, type EntryProps, type EntryVars, type InflateFactory, type ParseOptions, type ZipEntry } from "@archive/parse.base";
9
+ import { type CrxHeader, type PullStreamPublicApi, type EntryProps, type EntryVars, type InflateFactory, type ParseOptions, type ZipEntry } from "@archive/unzip/stream.base";
10
10
  export type { CrxHeader, EntryProps, EntryVars, ParseOptions, ZipEntry };
11
11
  export type ParseStream = Duplex & {
12
12
  promise(): Promise<void>;
@@ -5,14 +5,13 @@
5
5
  * Falls back to pure JavaScript implementation for older browsers.
6
6
  * Uses the browser Duplex stream implementation for compatibility.
7
7
  */
8
- import { Duplex, PassThrough, concatUint8Arrays } from "../stream/index.browser.js";
9
- import { writeUint32LE } from "./utils/binary.js";
10
- import { indexOfUint8ArrayPattern } from "./utils/bytes.js";
11
- import { runParseLoop, streamUntilValidatedDataDescriptor } from "./parse.base.js";
12
- import { inflateRaw as fallbackInflateRaw } from "./deflate-fallback.js";
13
- import { ByteQueue } from "./byte-queue.js";
14
- import { DATA_DESCRIPTOR_SIG } from "./zip-constants.js";
15
- import { hasDeflateRawDecompressionStream } from "./compress.base.js";
8
+ import { Duplex, PassThrough, concatUint8Arrays } from "../../stream/index.browser.js";
9
+ import { DATA_DESCRIPTOR_SIGNATURE_BYTES, runParseLoop, streamUntilValidatedDataDescriptor } from "./stream.base.js";
10
+ import { PatternScanner } from "../utils/pattern-scanner.js";
11
+ import { inflateRaw as fallbackInflateRaw } from "../compression/deflate-fallback.js";
12
+ import { ByteQueue } from "../internal/byte-queue.js";
13
+ import { hasDeflateRawDecompressionStream } from "../compression/compress.base.js";
14
+ const DEFAULT_UNZIP_STREAM_HIGH_WATER_MARK = 256 * 1024;
16
15
  // =============================================================================
17
16
  // Browser InflateRaw using DecompressionStream
18
17
  // =============================================================================
@@ -29,6 +28,9 @@ class BrowserInflateRaw extends Duplex {
29
28
  // Pass write handler to Duplex so pipe() calls our write method
30
29
  // Also pass final handler to close the DecompressionStream when _writable ends
31
30
  super({
31
+ // Keep the internal buffer bounded; this stream is used in tight parse loops.
32
+ writableHighWaterMark: 512 * 1024,
33
+ readableHighWaterMark: 512 * 1024,
32
34
  write: (chunk, _encoding, callback) => {
33
35
  this._doWrite(chunk, callback);
34
36
  },
@@ -137,47 +139,6 @@ class BrowserInflateRaw extends Duplex {
137
139
  this.push(null);
138
140
  }
139
141
  }
140
- // Override write to feed data into DecompressionStream
141
- write(chunk, encodingOrCallback, callback) {
142
- // Handle overload
143
- let cb;
144
- if (typeof encodingOrCallback === "function") {
145
- cb = encodingOrCallback;
146
- }
147
- else {
148
- cb = callback;
149
- }
150
- this._doWrite(chunk, cb);
151
- return true;
152
- }
153
- // Override end to close the DecompressionStream writer
154
- end(chunkOrCallback, encodingOrCallback, callback) {
155
- // Handle overloads
156
- let chunk;
157
- let cb;
158
- if (typeof chunkOrCallback === "function") {
159
- cb = chunkOrCallback;
160
- }
161
- else if (chunkOrCallback !== undefined) {
162
- chunk = chunkOrCallback;
163
- if (typeof encodingOrCallback === "function") {
164
- cb = encodingOrCallback;
165
- }
166
- else {
167
- cb = callback;
168
- }
169
- }
170
- // Write final chunk if provided
171
- if (chunk) {
172
- this.write(chunk, () => {
173
- this._closeWriter(cb);
174
- });
175
- }
176
- else {
177
- this._closeWriter(cb);
178
- }
179
- return this;
180
- }
181
142
  _closeWriter(callback) {
182
143
  if (this.writeClosed) {
183
144
  this._readingDonePromise.then(() => {
@@ -205,7 +166,6 @@ class BrowserInflateRaw extends Duplex {
205
166
  if (callback) {
206
167
  callback();
207
168
  }
208
- this.emit("finish");
209
169
  });
210
170
  });
211
171
  }
@@ -218,6 +178,225 @@ class BrowserInflateRaw extends Duplex {
218
178
  }
219
179
  }
220
180
  // =============================================================================
181
+ // Worker-based InflateRaw (optional)
182
+ // =============================================================================
183
+ let _inflateWorkerUrl = null;
184
+ function getInflateWorkerUrl(customUrl) {
185
+ if (typeof customUrl === "string" && customUrl.length > 0) {
186
+ return customUrl;
187
+ }
188
+ if (_inflateWorkerUrl) {
189
+ return _inflateWorkerUrl;
190
+ }
191
+ // Inline worker to avoid bundler-specific worker loaders.
192
+ // It streams deflate-raw through DecompressionStream and posts decompressed chunks back.
193
+ const code = `
194
+ let ds;
195
+ let writer;
196
+ let reader;
197
+ let junkError = false;
198
+ let pendingWrites = 0;
199
+
200
+ function isJunkErrorMessage(msg) {
201
+ return typeof msg === 'string' && (msg.includes('Junk') || msg.includes('junk'));
202
+ }
203
+
204
+ async function ensureStarted() {
205
+ if (ds) return;
206
+ ds = new DecompressionStream('deflate-raw');
207
+ writer = ds.writable.getWriter();
208
+ reader = ds.readable.getReader();
209
+
210
+ (async () => {
211
+ try {
212
+ while (true) {
213
+ const r = await reader.read();
214
+ if (r.done) break;
215
+ const chunk = r.value;
216
+ postMessage({ t: 'data', chunk }, [chunk.buffer]);
217
+ }
218
+ postMessage({ t: 'end' });
219
+ } catch (e) {
220
+ const msg = e && e.message ? e.message : String(e);
221
+ if (isJunkErrorMessage(msg)) {
222
+ junkError = true;
223
+ postMessage({ t: 'end' });
224
+ } else {
225
+ postMessage({ t: 'error', message: msg });
226
+ }
227
+ }
228
+ })();
229
+ }
230
+
231
+ onmessage = async (ev) => {
232
+ const msg = ev.data;
233
+ try {
234
+ await ensureStarted();
235
+ if (msg.t === 'write') {
236
+ if (junkError) {
237
+ postMessage({ t: 'ack', id: msg.id });
238
+ return;
239
+ }
240
+ pendingWrites++;
241
+ await writer.write(msg.chunk);
242
+ pendingWrites--;
243
+ postMessage({ t: 'ack', id: msg.id });
244
+ return;
245
+ }
246
+ if (msg.t === 'close') {
247
+ // Wait for in-flight writes to finish (best-effort).
248
+ while (pendingWrites > 0) {
249
+ await new Promise(r => setTimeout(r, 0));
250
+ }
251
+ try { await writer.close(); } catch (_) {}
252
+ postMessage({ t: 'closed' });
253
+ return;
254
+ }
255
+ if (msg.t === 'abort') {
256
+ try { await writer.abort(); } catch (_) {}
257
+ postMessage({ t: 'aborted' });
258
+ return;
259
+ }
260
+ } catch (e) {
261
+ const m = e && e.message ? e.message : String(e);
262
+ postMessage({ t: 'error', message: m, id: msg && msg.id });
263
+ }
264
+ };
265
+ `;
266
+ const blob = new Blob([code], { type: "text/javascript" });
267
+ _inflateWorkerUrl = URL.createObjectURL(blob);
268
+ return _inflateWorkerUrl;
269
+ }
270
+ class WorkerInflateRaw extends Duplex {
271
+ constructor(workerUrl) {
272
+ super({
273
+ write: (chunk, _encoding, callback) => {
274
+ this._doWrite(chunk, callback);
275
+ },
276
+ final: (callback) => {
277
+ this._doClose(callback);
278
+ }
279
+ });
280
+ this._nextId = 1;
281
+ this._pendingAcks = new Map();
282
+ this._closed = false;
283
+ this._junkError = false;
284
+ this._terminated = false;
285
+ const url = getInflateWorkerUrl(workerUrl);
286
+ this.worker = new Worker(url);
287
+ this.worker.onmessage = (ev) => {
288
+ const msg = ev.data;
289
+ if (!msg || typeof msg.t !== "string") {
290
+ return;
291
+ }
292
+ if (msg.t === "data") {
293
+ const chunk = msg.chunk;
294
+ this.push(chunk);
295
+ return;
296
+ }
297
+ if (msg.t === "end") {
298
+ this.push(null);
299
+ this._terminateWorker();
300
+ return;
301
+ }
302
+ if (msg.t === "aborted") {
303
+ this._terminateWorker();
304
+ return;
305
+ }
306
+ if (msg.t === "ack") {
307
+ const id = msg.id;
308
+ const cb = this._pendingAcks.get(id);
309
+ if (cb) {
310
+ this._pendingAcks.delete(id);
311
+ cb();
312
+ }
313
+ return;
314
+ }
315
+ if (msg.t === "error") {
316
+ const message = typeof msg.message === "string" ? msg.message : "Worker inflate error";
317
+ if (message.includes("Junk") || message.includes("junk")) {
318
+ this._junkError = true;
319
+ // Treat as end-of-stream.
320
+ this.push(null);
321
+ this._terminateWorker();
322
+ // Resolve any pending writes.
323
+ for (const cb of this._pendingAcks.values()) {
324
+ cb();
325
+ }
326
+ this._pendingAcks.clear();
327
+ return;
328
+ }
329
+ const err = new Error(message);
330
+ // Fail any pending writes.
331
+ for (const cb of this._pendingAcks.values()) {
332
+ cb(err);
333
+ }
334
+ this._pendingAcks.clear();
335
+ this.emit("error", err);
336
+ this._terminateWorker();
337
+ return;
338
+ }
339
+ };
340
+ this.worker.onerror = (e) => {
341
+ const err = new Error(e.message || "Worker error");
342
+ for (const cb of this._pendingAcks.values()) {
343
+ cb(err);
344
+ }
345
+ this._pendingAcks.clear();
346
+ this.emit("error", err);
347
+ this._terminateWorker();
348
+ };
349
+ }
350
+ _terminateWorker() {
351
+ if (this._terminated) {
352
+ return;
353
+ }
354
+ this._terminated = true;
355
+ try {
356
+ this.worker.terminate();
357
+ }
358
+ catch {
359
+ // ignore
360
+ }
361
+ }
362
+ _doWrite(chunk, callback) {
363
+ if (this._closed || this._junkError) {
364
+ callback();
365
+ return;
366
+ }
367
+ const id = this._nextId++;
368
+ this._pendingAcks.set(id, callback);
369
+ // Transfer the underlying ArrayBuffer to reduce copies.
370
+ // If chunk is a view into a larger buffer, slice to avoid transferring unrelated bytes.
371
+ const transferable = chunk.byteOffset === 0 && chunk.byteLength === chunk.buffer.byteLength
372
+ ? chunk
373
+ : chunk.slice();
374
+ this.worker.postMessage({ t: "write", id, chunk: transferable }, [transferable.buffer]);
375
+ }
376
+ _doClose(callback) {
377
+ if (this._closed) {
378
+ callback();
379
+ return;
380
+ }
381
+ this._closed = true;
382
+ this.worker.postMessage({ t: "close" });
383
+ callback();
384
+ }
385
+ destroy(error) {
386
+ if (!this._closed) {
387
+ this._closed = true;
388
+ try {
389
+ this.worker.postMessage({ t: "abort" });
390
+ }
391
+ catch {
392
+ // ignore
393
+ }
394
+ }
395
+ this._terminateWorker();
396
+ return super.destroy(error);
397
+ }
398
+ }
399
+ // =============================================================================
221
400
  // Fallback InflateRaw for browsers without DecompressionStream
222
401
  // =============================================================================
223
402
  /**
@@ -277,7 +456,7 @@ function createInflateRaw() {
277
456
  // =============================================================================
278
457
  // Utilities
279
458
  // =============================================================================
280
- const dataDescriptorSignature = writeUint32LE(DATA_DESCRIPTOR_SIG);
459
+ const dataDescriptorSignature = DATA_DESCRIPTOR_SIGNATURE_BYTES;
281
460
  export function createParseClass(createInflateRawFn) {
282
461
  /**
283
462
  * ZIP Stream Parser for browsers.
@@ -291,11 +470,11 @@ export function createParseClass(createInflateRawFn) {
291
470
  super({
292
471
  objectMode: true,
293
472
  write: (chunk, _encoding, callback) => {
294
- this._handleWrite(chunk);
295
- callback();
473
+ this._handleWrite(chunk, callback);
296
474
  },
297
475
  final: (callback) => {
298
476
  this.finished = true;
477
+ this._maybeReleaseWriteCallback();
299
478
  this._wakeUp();
300
479
  this.emit("data-available");
301
480
  this.emit("chunk", false);
@@ -307,6 +486,12 @@ export function createParseClass(createInflateRawFn) {
307
486
  this._driverState = {};
308
487
  this._parsingDone = Promise.resolve();
309
488
  this._opts = opts;
489
+ // Default values are intentionally conservative to avoid memory spikes
490
+ // when parsing large archives under slow consumers.
491
+ const hi = Math.max(64 * 1024, opts.inputHighWaterMarkBytes ?? 2 * 1024 * 1024);
492
+ const lo = Math.max(32 * 1024, opts.inputLowWaterMarkBytes ?? Math.floor(hi / 4));
493
+ this._inputHighWaterMarkBytes = hi;
494
+ this._inputLowWaterMarkBytes = Math.min(lo, hi);
310
495
  const io = {
311
496
  pull: (length) => this.pull(length),
312
497
  pullUntil: (pattern, includeEof) => this.pullUntil(pattern, includeEof),
@@ -334,6 +519,12 @@ export function createParseClass(createInflateRawFn) {
334
519
  },
335
520
  emitError: (err) => {
336
521
  this.__emittedError = err;
522
+ // Ensure upstream writers don't hang waiting for a deferred write callback.
523
+ if (this._writeCb) {
524
+ const cb = this._writeCb;
525
+ this._writeCb = undefined;
526
+ cb(err);
527
+ }
337
528
  this.emit("error", err);
338
529
  },
339
530
  emitClose: () => {
@@ -344,7 +535,22 @@ export function createParseClass(createInflateRawFn) {
344
535
  // NOTE: We intentionally do NOT pass inflateRawSync to runParseLoop in browser.
345
536
  // Browser's native DecompressionStream is faster than our pure-JS fallback,
346
537
  // so we always use the streaming path for decompression in browsers.
347
- this._parsingDone = runParseLoop(this._opts, io, emitter, () => createInflateRawFn(), this._driverState
538
+ const inflateFactory = () => {
539
+ if (this._opts.useWorkerInflate && typeof Worker !== "undefined") {
540
+ // Worker path requires DecompressionStream support.
541
+ if (hasDeflateRawDecompressionStream()) {
542
+ try {
543
+ return new WorkerInflateRaw(this._opts.workerInflateUrl);
544
+ }
545
+ catch {
546
+ // If Worker construction fails (e.g. CSP/CORS), fall back.
547
+ return createInflateRawFn();
548
+ }
549
+ }
550
+ }
551
+ return createInflateRawFn();
552
+ };
553
+ this._parsingDone = runParseLoop(this._opts, io, emitter, inflateFactory, this._driverState
348
554
  // No inflateRawSync - always use streaming DecompressionStream in browser
349
555
  );
350
556
  this._parsingDone.catch((e) => {
@@ -356,8 +562,16 @@ export function createParseClass(createInflateRawFn) {
356
562
  });
357
563
  });
358
564
  }
359
- _handleWrite(chunk) {
565
+ _handleWrite(chunk, callback) {
360
566
  this._buffer.append(chunk);
567
+ // Apply writable backpressure by deferring the callback when the input buffer is large.
568
+ // The callback will be released once the parser drains the buffer.
569
+ if (this._buffer.length >= this._inputHighWaterMarkBytes) {
570
+ this._writeCb = callback;
571
+ }
572
+ else {
573
+ callback();
574
+ }
361
575
  this._wakeUp();
362
576
  this.emit("data-available");
363
577
  this.emit("chunk");
@@ -368,13 +582,6 @@ export function createParseClass(createInflateRawFn) {
368
582
  set buffer(value) {
369
583
  this._buffer.reset(value);
370
584
  }
371
- _maybeReleaseWriteCallback() {
372
- if (typeof this.cb === "function") {
373
- const callback = this.cb;
374
- this.cb = undefined;
375
- callback();
376
- }
377
- }
378
585
  _wakeUp() {
379
586
  if (this._pendingResolve) {
380
587
  const resolve = this._pendingResolve;
@@ -382,6 +589,17 @@ export function createParseClass(createInflateRawFn) {
382
589
  resolve();
383
590
  }
384
591
  }
592
+ _maybeReleaseWriteCallback() {
593
+ if (!this._writeCb) {
594
+ return;
595
+ }
596
+ if (this._buffer.length > this._inputLowWaterMarkBytes) {
597
+ return;
598
+ }
599
+ const cb = this._writeCb;
600
+ this._writeCb = undefined;
601
+ cb();
602
+ }
385
603
  _waitForData() {
386
604
  return new Promise(resolve => {
387
605
  this._pendingResolve = resolve;
@@ -395,60 +613,76 @@ export function createParseClass(createInflateRawFn) {
395
613
  if (this.finished) {
396
614
  if (this._buffer.length > 0) {
397
615
  const data = this._buffer.read(this._buffer.length);
616
+ this._maybeReleaseWriteCallback();
398
617
  return data;
399
618
  }
400
619
  throw new Error("FILE_ENDED");
401
620
  }
402
621
  await this._waitForData();
403
622
  }
404
- return this._buffer.read(length);
623
+ const out = this._buffer.read(length);
624
+ this._maybeReleaseWriteCallback();
625
+ return out;
405
626
  }
406
627
  async _pullUntilInternal(pattern, includeEof = false) {
407
628
  const chunks = [];
408
- let searchFrom = 0;
409
- const overlap = Math.max(0, pattern.length - 1);
629
+ const scanner = new PatternScanner(pattern);
410
630
  while (true) {
411
- const view = this._buffer.view();
412
- const match = indexOfUint8ArrayPattern(view, pattern, searchFrom);
631
+ const bufLen = this._buffer.length;
632
+ const match = scanner.find(this._buffer);
413
633
  if (match !== -1) {
414
634
  this.match = match;
415
635
  const toRead = match + (includeEof ? pattern.length : 0);
416
636
  if (toRead > 0) {
417
637
  chunks.push(this._buffer.read(toRead));
638
+ this._maybeReleaseWriteCallback();
418
639
  }
419
- return concatUint8Arrays(chunks);
640
+ return chunks.length === 1 ? chunks[0] : concatUint8Arrays(chunks);
420
641
  }
421
642
  // No match yet. Avoid rescanning bytes that can't start a match.
422
- searchFrom = Math.max(searchFrom, Math.max(0, view.length - overlap));
643
+ scanner.onNoMatch(bufLen);
423
644
  if (this.finished) {
424
645
  throw new Error("FILE_ENDED");
425
646
  }
426
647
  const safeLen = Math.max(0, this._buffer.length - pattern.length);
427
648
  if (safeLen > 0) {
428
649
  chunks.push(this._buffer.read(safeLen));
429
- searchFrom = Math.max(0, searchFrom - safeLen);
650
+ scanner.onConsume(safeLen);
651
+ this._maybeReleaseWriteCallback();
430
652
  }
431
653
  await this._waitForData();
432
654
  }
433
655
  }
434
656
  _streamFixedLength(length) {
435
- const output = new PassThrough();
657
+ const output = new PassThrough({ highWaterMark: DEFAULT_UNZIP_STREAM_HIGH_WATER_MARK });
436
658
  let remaining = length;
437
659
  let done = false;
660
+ let waitingDrain = false;
438
661
  const pull = () => {
439
662
  if (done) {
440
663
  return;
441
664
  }
665
+ if (waitingDrain) {
666
+ return;
667
+ }
442
668
  while (remaining > 0 && this._buffer.length > 0) {
443
669
  const toRead = Math.min(remaining, this._buffer.length);
444
670
  const chunk = this._buffer.read(toRead);
445
671
  remaining -= toRead;
446
- output.write(chunk);
672
+ const ok = output.write(chunk);
673
+ this._maybeReleaseWriteCallback();
674
+ if (!ok) {
675
+ waitingDrain = true;
676
+ output.once("drain", () => {
677
+ waitingDrain = false;
678
+ pull();
679
+ });
680
+ return;
681
+ }
447
682
  }
448
683
  if (remaining === 0) {
449
684
  done = true;
450
685
  this.removeListener("data-available", pull);
451
- this._maybeReleaseWriteCallback();
452
686
  output.end();
453
687
  }
454
688
  else if (this.finished) {
@@ -462,42 +696,69 @@ export function createParseClass(createInflateRawFn) {
462
696
  return output;
463
697
  }
464
698
  _streamUntilPattern(pattern, includeEof = false) {
465
- const output = new PassThrough();
699
+ const output = new PassThrough({ highWaterMark: DEFAULT_UNZIP_STREAM_HIGH_WATER_MARK });
466
700
  let done = false;
467
- let searchFrom = 0;
468
- const overlap = Math.max(0, pattern.length - 1);
701
+ const patternLen = pattern.length;
702
+ const scanner = new PatternScanner(pattern);
703
+ let waitingDrain = false;
469
704
  const pull = () => {
470
- if (done) {
705
+ if (done || waitingDrain) {
471
706
  return;
472
707
  }
473
- const view = this._buffer.view();
474
- const match = indexOfUint8ArrayPattern(view, pattern, searchFrom);
475
- if (match !== -1) {
476
- this.match = match;
477
- const endIndex = includeEof ? match + pattern.length : match;
478
- if (endIndex > 0) {
479
- output.write(this._buffer.read(endIndex));
708
+ while (true) {
709
+ if (this._buffer.length <= 0) {
710
+ break;
480
711
  }
481
- done = true;
482
- this.removeListener("data-available", pull);
483
- this._maybeReleaseWriteCallback();
484
- output.end();
485
- return;
486
- }
487
- // No match yet. Avoid rescanning bytes that can't start a match.
488
- searchFrom = Math.max(searchFrom, Math.max(0, view.length - overlap));
489
- if (this.finished) {
490
- done = true;
491
- this.removeListener("data-available", pull);
492
- this._maybeReleaseWriteCallback();
493
- output.destroy(new Error("FILE_ENDED"));
494
- return;
495
- }
496
- const safeLen = Math.max(0, this._buffer.length - pattern.length);
497
- if (safeLen > 0) {
498
- output.write(this._buffer.read(safeLen));
499
- searchFrom = Math.max(0, searchFrom - safeLen);
712
+ const bufLen = this._buffer.length;
713
+ const match = scanner.find(this._buffer);
714
+ if (match !== -1) {
715
+ this.match = match;
716
+ const endIndex = includeEof ? match + patternLen : match;
717
+ if (endIndex > 0) {
718
+ const ok = output.write(this._buffer.read(endIndex));
719
+ scanner.onConsume(endIndex);
720
+ this._maybeReleaseWriteCallback();
721
+ if (!ok) {
722
+ waitingDrain = true;
723
+ output.once("drain", () => {
724
+ waitingDrain = false;
725
+ pull();
726
+ });
727
+ return;
728
+ }
729
+ }
730
+ done = true;
731
+ this.removeListener("data-available", pull);
732
+ output.end();
733
+ return;
734
+ }
735
+ // No match yet. Avoid rescanning bytes that can't start a match.
736
+ scanner.onNoMatch(bufLen);
737
+ if (this.finished) {
738
+ done = true;
739
+ this.removeListener("data-available", pull);
740
+ output.destroy(new Error("FILE_ENDED"));
741
+ return;
742
+ }
743
+ const safeLen = bufLen - patternLen;
744
+ if (safeLen <= 0) {
745
+ // Keep enough bytes to detect a split signature.
746
+ if (this._buffer.length <= patternLen) {
747
+ this._maybeReleaseWriteCallback();
748
+ }
749
+ break;
750
+ }
751
+ const ok = output.write(this._buffer.read(safeLen));
752
+ scanner.onConsume(safeLen);
500
753
  this._maybeReleaseWriteCallback();
754
+ if (!ok) {
755
+ waitingDrain = true;
756
+ output.once("drain", () => {
757
+ waitingDrain = false;
758
+ pull();
759
+ });
760
+ return;
761
+ }
501
762
  }
502
763
  };
503
764
  this.on("data-available", pull);
@@ -520,11 +781,7 @@ export function createParseClass(createInflateRawFn) {
520
781
  return Promise.reject(new Error("FILE_ENDED"));
521
782
  }
522
783
  if (this._buffer.length >= eof) {
523
- const data = this._buffer.read(eof);
524
- if (this._buffer.length === 0) {
525
- this._maybeReleaseWriteCallback();
526
- }
527
- return Promise.resolve(data);
784
+ return Promise.resolve(this._buffer.read(eof));
528
785
  }
529
786
  return this._pullInternal(eof);
530
787
  }
@@ -540,14 +797,18 @@ export function createParseClass(createInflateRawFn) {
540
797
  _streamUntilDataDescriptor() {
541
798
  return streamUntilValidatedDataDescriptor({
542
799
  source: {
543
- getView: () => this._buffer.view(),
544
800
  getLength: () => this._buffer.length,
545
801
  read: (length) => this._buffer.read(length),
802
+ peekChunks: (length) => this._buffer.peekChunks(length),
803
+ discard: (length) => this._buffer.discard(length),
804
+ indexOfPattern: (pattern, startIndex) => this._buffer.indexOfPattern(pattern, startIndex),
805
+ peekUint32LE: (offset) => this._buffer.peekUint32LE(offset),
546
806
  isFinished: () => this.finished,
547
807
  onDataAvailable: (cb) => {
548
808
  this.on("data-available", cb);
549
809
  return () => this.removeListener("data-available", cb);
550
- }
810
+ },
811
+ maybeReleaseWriteCallback: () => this._maybeReleaseWriteCallback()
551
812
  },
552
813
  dataDescriptorSignature
553
814
  });
@@ -1,6 +1,6 @@
1
1
  import type { Duplex } from "@stream";
2
- import { type PullStreamPublicApi, type CrxHeader, type EntryProps, type EntryVars, type InflateFactory, type ParseOptions, type ZipEntry } from "@archive/parse.base";
3
- export type { CrxHeader } from "@archive/parse.base";
2
+ import { type PullStreamPublicApi, type CrxHeader, type EntryProps, type EntryVars, type InflateFactory, type ParseOptions, type ZipEntry } from "@archive/unzip/stream.base";
3
+ export type { CrxHeader } from "@archive/unzip/stream.base";
4
4
  export type { EntryProps, EntryVars, ParseOptions, ZipEntry };
5
5
  export type ParseStream = Duplex & {
6
6
  promise(): Promise<void>;