@cj-tech-master/excelts 4.2.0 → 4.2.1-canary.20260112134913.a3cecdd

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 (317) 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/{types/modules/archive → browser/modules/archive/compression}/compress.base.d.ts +1 -0
  5. package/dist/browser/modules/archive/{compress.base.js → compression/compress.base.js} +2 -1
  6. package/dist/{types/modules/archive → browser/modules/archive/compression}/compress.browser.d.ts +10 -8
  7. package/dist/{esm/modules/archive → browser/modules/archive/compression}/compress.browser.js +18 -19
  8. package/dist/browser/modules/archive/{compress.d.ts → compression/compress.d.ts} +2 -2
  9. package/dist/browser/modules/archive/{compress.js → compression/compress.js} +1 -1
  10. package/dist/browser/modules/archive/{crc32.browser.d.ts → compression/crc32.browser.d.ts} +1 -1
  11. package/dist/browser/modules/archive/{crc32.d.ts → compression/crc32.d.ts} +1 -1
  12. package/dist/browser/modules/archive/{crc32.js → compression/crc32.js} +1 -1
  13. package/dist/browser/modules/archive/{deflate-fallback.js → compression/deflate-fallback.js} +1 -1
  14. package/dist/browser/modules/archive/{streaming-compress.browser.d.ts → compression/streaming-compress.browser.d.ts} +2 -2
  15. package/dist/browser/modules/archive/{streaming-compress.browser.js → compression/streaming-compress.browser.js} +3 -3
  16. package/dist/browser/modules/archive/{streaming-compress.d.ts → compression/streaming-compress.d.ts} +2 -2
  17. package/dist/browser/modules/archive/{streaming-compress.js → compression/streaming-compress.js} +2 -2
  18. package/dist/browser/modules/archive/defaults.d.ts +1 -0
  19. package/dist/browser/modules/archive/defaults.js +6 -3
  20. package/dist/browser/modules/archive/index.base.d.ts +4 -4
  21. package/dist/browser/modules/archive/index.base.js +3 -6
  22. package/dist/browser/modules/archive/index.browser.d.ts +3 -4
  23. package/dist/browser/modules/archive/index.browser.js +3 -7
  24. package/dist/browser/modules/archive/index.d.ts +3 -4
  25. package/dist/browser/modules/archive/index.js +3 -5
  26. package/dist/browser/modules/archive/internal/byte-queue.d.ts +33 -0
  27. package/dist/browser/modules/archive/internal/byte-queue.js +407 -0
  28. package/dist/browser/modules/archive/io/archive-sink.d.ts +8 -0
  29. package/dist/browser/modules/archive/io/archive-sink.js +45 -0
  30. package/dist/browser/modules/archive/io/archive-source.d.ts +6 -0
  31. package/dist/browser/modules/archive/io/archive-source.js +100 -0
  32. package/dist/browser/modules/archive/{extract.d.ts → unzip/extract.d.ts} +2 -2
  33. package/dist/browser/modules/archive/unzip/index.d.ts +40 -0
  34. package/dist/browser/modules/archive/unzip/index.js +164 -0
  35. package/dist/browser/modules/archive/{parse.base.d.ts → unzip/stream.base.d.ts} +58 -3
  36. package/dist/browser/modules/archive/unzip/stream.base.js +1022 -0
  37. package/dist/browser/modules/archive/{parse.browser.d.ts → unzip/stream.browser.d.ts} +1 -1
  38. package/dist/browser/modules/archive/{parse.browser.js → unzip/stream.browser.js} +376 -110
  39. package/dist/browser/modules/archive/{parse.d.ts → unzip/stream.d.ts} +2 -2
  40. package/dist/{esm/modules/archive/parse.js → browser/modules/archive/unzip/stream.js} +7 -6
  41. package/dist/{types/modules/archive → browser/modules/archive/unzip}/zip-parser.d.ts +1 -1
  42. package/dist/{esm/modules/archive → browser/modules/archive/unzip}/zip-parser.js +38 -24
  43. package/dist/browser/modules/archive/utils/async-queue.d.ts +7 -0
  44. package/dist/browser/modules/archive/utils/async-queue.js +103 -0
  45. package/dist/browser/modules/archive/utils/bytes.js +16 -16
  46. package/dist/browser/modules/archive/utils/compressibility.d.ts +10 -0
  47. package/dist/browser/modules/archive/utils/compressibility.js +57 -0
  48. package/dist/browser/modules/archive/utils/parse-buffer.js +21 -23
  49. package/dist/browser/modules/archive/utils/pattern-scanner.d.ts +21 -0
  50. package/dist/browser/modules/archive/utils/pattern-scanner.js +27 -0
  51. package/dist/browser/modules/archive/utils/timestamps.js +62 -1
  52. package/dist/browser/modules/archive/utils/zip-extra-fields.d.ts +1 -1
  53. package/dist/browser/modules/archive/utils/zip-extra-fields.js +26 -14
  54. package/dist/browser/modules/archive/zip/index.d.ts +42 -0
  55. package/dist/browser/modules/archive/zip/index.js +157 -0
  56. package/dist/browser/modules/archive/{streaming-zip.d.ts → zip/stream.d.ts} +28 -5
  57. package/dist/browser/modules/archive/{streaming-zip.js → zip/stream.js} +192 -48
  58. package/dist/browser/modules/archive/zip/zip-bytes.d.ts +73 -0
  59. package/dist/browser/modules/archive/zip/zip-bytes.js +239 -0
  60. package/dist/{esm/modules/archive → browser/modules/archive/zip}/zip-entry-metadata.js +3 -3
  61. package/dist/browser/modules/archive/{zip-records.d.ts → zip-spec/zip-records.d.ts} +20 -0
  62. package/dist/browser/modules/archive/zip-spec/zip-records.js +126 -0
  63. package/dist/browser/modules/excel/form-control.d.ts +2 -0
  64. package/dist/browser/modules/excel/form-control.js +54 -16
  65. package/dist/browser/modules/excel/stream/workbook-reader.browser.js +1 -1
  66. package/dist/browser/modules/excel/stream/workbook-writer.browser.d.ts +1 -1
  67. package/dist/browser/modules/excel/stream/workbook-writer.browser.js +1 -1
  68. package/dist/browser/modules/excel/utils/ooxml-validator.d.ts +48 -0
  69. package/dist/browser/modules/excel/utils/ooxml-validator.js +469 -0
  70. package/dist/browser/modules/excel/worksheet.js +5 -2
  71. package/dist/browser/modules/excel/xlsx/xform/drawing/ctrl-prop-xform.d.ts +1 -0
  72. package/dist/browser/modules/excel/xlsx/xform/drawing/ctrl-prop-xform.js +13 -1
  73. package/dist/browser/modules/excel/xlsx/xform/drawing/sp-xform.d.ts +18 -0
  74. package/dist/browser/modules/excel/xlsx/xform/drawing/sp-xform.js +112 -0
  75. package/dist/browser/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +6 -1
  76. package/dist/browser/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.js +30 -2
  77. package/dist/browser/modules/excel/xlsx/xform/drawing/vml-drawing-xform.js +11 -0
  78. package/dist/browser/modules/excel/xlsx/xform/sheet/page-setup-xform.d.ts +1 -0
  79. package/dist/browser/modules/excel/xlsx/xform/sheet/page-setup-xform.js +16 -2
  80. package/dist/browser/modules/excel/xlsx/xform/sheet/worksheet-xform.js +117 -5
  81. package/dist/browser/modules/excel/xlsx/xlsx.browser.js +3 -6
  82. package/dist/browser/modules/excel/xlsx/xlsx.js +1 -1
  83. package/dist/browser/modules/stream/base-transform.d.ts +3 -0
  84. package/dist/browser/modules/stream/base-transform.js +34 -20
  85. package/dist/browser/modules/stream/buffered-stream.d.ts +2 -12
  86. package/dist/browser/modules/stream/chunked-builder.js +4 -4
  87. package/dist/browser/modules/stream/index.browser.d.ts +13 -19
  88. package/dist/browser/modules/stream/index.browser.js +10 -22
  89. package/dist/browser/modules/stream/index.d.ts +18 -41
  90. package/dist/browser/modules/stream/index.js +15 -44
  91. package/dist/browser/modules/stream/internal/event-utils.d.ts +17 -0
  92. package/dist/browser/modules/stream/internal/event-utils.js +40 -0
  93. package/dist/browser/modules/stream/internal/type-guards.d.ts +9 -0
  94. package/dist/browser/modules/stream/internal/type-guards.js +24 -0
  95. package/dist/browser/modules/stream/pull-stream.d.ts +5 -6
  96. package/dist/browser/modules/stream/pull-stream.js +107 -43
  97. package/dist/browser/modules/stream/shared.d.ts +1 -1
  98. package/dist/browser/modules/stream/shared.js +7 -4
  99. package/dist/browser/modules/stream/streams.browser.d.ts +32 -42
  100. package/dist/browser/modules/stream/streams.browser.js +941 -823
  101. package/dist/browser/modules/stream/streams.d.ts +4 -20
  102. package/dist/browser/modules/stream/streams.js +146 -95
  103. package/dist/browser/modules/stream/utils.js +5 -38
  104. package/dist/cjs/modules/archive/{compress.base.js → compression/compress.base.js} +2 -1
  105. package/dist/cjs/modules/archive/{compress.browser.js → compression/compress.browser.js} +18 -19
  106. package/dist/cjs/modules/archive/{compress.js → compression/compress.js} +1 -1
  107. package/dist/cjs/modules/archive/{crc32.js → compression/crc32.js} +1 -1
  108. package/dist/cjs/modules/archive/{deflate-fallback.js → compression/deflate-fallback.js} +1 -1
  109. package/dist/cjs/modules/archive/{streaming-compress.browser.js → compression/streaming-compress.browser.js} +3 -3
  110. package/dist/cjs/modules/archive/{streaming-compress.js → compression/streaming-compress.js} +2 -2
  111. package/dist/cjs/modules/archive/defaults.js +7 -4
  112. package/dist/cjs/modules/archive/index.base.js +9 -19
  113. package/dist/cjs/modules/archive/index.browser.js +4 -10
  114. package/dist/cjs/modules/archive/index.js +4 -8
  115. package/dist/cjs/modules/archive/internal/byte-queue.js +411 -0
  116. package/dist/cjs/modules/archive/io/archive-sink.js +49 -0
  117. package/dist/cjs/modules/archive/io/archive-source.js +105 -0
  118. package/dist/cjs/modules/archive/unzip/index.js +170 -0
  119. package/dist/cjs/modules/archive/unzip/stream.base.js +1044 -0
  120. package/dist/cjs/modules/archive/{parse.browser.js → unzip/stream.browser.js} +377 -111
  121. package/dist/cjs/modules/archive/{parse.js → unzip/stream.js} +9 -8
  122. package/dist/cjs/modules/archive/{zip-parser.js → unzip/zip-parser.js} +47 -33
  123. package/dist/cjs/modules/archive/utils/async-queue.js +106 -0
  124. package/dist/cjs/modules/archive/utils/bytes.js +16 -16
  125. package/dist/cjs/modules/archive/utils/compressibility.js +60 -0
  126. package/dist/cjs/modules/archive/utils/parse-buffer.js +21 -23
  127. package/dist/cjs/modules/archive/utils/pattern-scanner.js +31 -0
  128. package/dist/cjs/modules/archive/utils/timestamps.js +64 -3
  129. package/dist/cjs/modules/archive/utils/zip-extra-fields.js +26 -14
  130. package/dist/cjs/modules/archive/zip/index.js +162 -0
  131. package/dist/cjs/modules/archive/{streaming-zip.js → zip/stream.js} +194 -50
  132. package/dist/cjs/modules/archive/zip/zip-bytes.js +242 -0
  133. package/dist/cjs/modules/archive/{zip-entry-metadata.js → zip/zip-entry-metadata.js} +5 -5
  134. package/dist/cjs/modules/archive/zip-spec/zip-records.js +136 -0
  135. package/dist/cjs/modules/excel/form-control.js +54 -16
  136. package/dist/cjs/modules/excel/stream/workbook-reader.browser.js +2 -2
  137. package/dist/cjs/modules/excel/stream/workbook-writer.browser.js +4 -4
  138. package/dist/cjs/modules/excel/utils/ooxml-validator.js +475 -0
  139. package/dist/cjs/modules/excel/worksheet.js +5 -2
  140. package/dist/cjs/modules/excel/xlsx/xform/drawing/ctrl-prop-xform.js +13 -1
  141. package/dist/cjs/modules/excel/xlsx/xform/drawing/sp-xform.js +115 -0
  142. package/dist/cjs/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.js +30 -2
  143. package/dist/cjs/modules/excel/xlsx/xform/drawing/vml-drawing-xform.js +11 -0
  144. package/dist/cjs/modules/excel/xlsx/xform/sheet/page-setup-xform.js +16 -2
  145. package/dist/cjs/modules/excel/xlsx/xform/sheet/worksheet-xform.js +117 -5
  146. package/dist/cjs/modules/excel/xlsx/xlsx.browser.js +6 -9
  147. package/dist/cjs/modules/excel/xlsx/xlsx.js +2 -2
  148. package/dist/cjs/modules/stream/base-transform.js +34 -20
  149. package/dist/cjs/modules/stream/chunked-builder.js +4 -4
  150. package/dist/cjs/modules/stream/index.browser.js +10 -17
  151. package/dist/cjs/modules/stream/index.js +15 -39
  152. package/dist/cjs/modules/stream/internal/event-utils.js +43 -0
  153. package/dist/cjs/modules/stream/internal/type-guards.js +30 -0
  154. package/dist/cjs/modules/stream/pull-stream.js +107 -43
  155. package/dist/cjs/modules/stream/shared.js +7 -4
  156. package/dist/cjs/modules/stream/streams.browser.js +947 -834
  157. package/dist/cjs/modules/stream/streams.js +156 -107
  158. package/dist/cjs/modules/stream/utils.js +3 -36
  159. package/dist/esm/index.browser.js +12 -0
  160. package/dist/esm/modules/archive/{compress.base.js → compression/compress.base.js} +2 -1
  161. package/dist/{browser/modules/archive → esm/modules/archive/compression}/compress.browser.js +18 -19
  162. package/dist/esm/modules/archive/{compress.js → compression/compress.js} +1 -1
  163. package/dist/esm/modules/archive/{crc32.js → compression/crc32.js} +1 -1
  164. package/dist/esm/modules/archive/{deflate-fallback.js → compression/deflate-fallback.js} +1 -1
  165. package/dist/esm/modules/archive/{streaming-compress.browser.js → compression/streaming-compress.browser.js} +3 -3
  166. package/dist/esm/modules/archive/{streaming-compress.js → compression/streaming-compress.js} +2 -2
  167. package/dist/esm/modules/archive/defaults.js +6 -3
  168. package/dist/esm/modules/archive/index.base.js +3 -6
  169. package/dist/esm/modules/archive/index.browser.js +3 -7
  170. package/dist/esm/modules/archive/index.js +3 -5
  171. package/dist/esm/modules/archive/internal/byte-queue.js +407 -0
  172. package/dist/esm/modules/archive/io/archive-sink.js +45 -0
  173. package/dist/esm/modules/archive/io/archive-source.js +100 -0
  174. package/dist/esm/modules/archive/unzip/index.js +164 -0
  175. package/dist/esm/modules/archive/unzip/stream.base.js +1022 -0
  176. package/dist/esm/modules/archive/{parse.browser.js → unzip/stream.browser.js} +376 -110
  177. package/dist/{browser/modules/archive/parse.js → esm/modules/archive/unzip/stream.js} +7 -6
  178. package/dist/{browser/modules/archive → esm/modules/archive/unzip}/zip-parser.js +38 -24
  179. package/dist/esm/modules/archive/utils/async-queue.js +103 -0
  180. package/dist/esm/modules/archive/utils/bytes.js +16 -16
  181. package/dist/esm/modules/archive/utils/compressibility.js +57 -0
  182. package/dist/esm/modules/archive/utils/parse-buffer.js +21 -23
  183. package/dist/esm/modules/archive/utils/pattern-scanner.js +27 -0
  184. package/dist/esm/modules/archive/utils/timestamps.js +62 -1
  185. package/dist/esm/modules/archive/utils/zip-extra-fields.js +26 -14
  186. package/dist/esm/modules/archive/zip/index.js +157 -0
  187. package/dist/esm/modules/archive/{streaming-zip.js → zip/stream.js} +192 -48
  188. package/dist/esm/modules/archive/zip/zip-bytes.js +239 -0
  189. package/dist/{browser/modules/archive → esm/modules/archive/zip}/zip-entry-metadata.js +3 -3
  190. package/dist/esm/modules/archive/zip-spec/zip-records.js +126 -0
  191. package/dist/esm/modules/excel/form-control.js +54 -16
  192. package/dist/esm/modules/excel/stream/workbook-reader.browser.js +1 -1
  193. package/dist/esm/modules/excel/stream/workbook-writer.browser.js +1 -1
  194. package/dist/esm/modules/excel/utils/ooxml-validator.js +469 -0
  195. package/dist/esm/modules/excel/worksheet.js +5 -2
  196. package/dist/esm/modules/excel/xlsx/xform/drawing/ctrl-prop-xform.js +13 -1
  197. package/dist/esm/modules/excel/xlsx/xform/drawing/sp-xform.js +112 -0
  198. package/dist/esm/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.js +30 -2
  199. package/dist/esm/modules/excel/xlsx/xform/drawing/vml-drawing-xform.js +11 -0
  200. package/dist/esm/modules/excel/xlsx/xform/sheet/page-setup-xform.js +16 -2
  201. package/dist/esm/modules/excel/xlsx/xform/sheet/worksheet-xform.js +117 -5
  202. package/dist/esm/modules/excel/xlsx/xlsx.browser.js +3 -6
  203. package/dist/esm/modules/excel/xlsx/xlsx.js +1 -1
  204. package/dist/esm/modules/stream/base-transform.js +34 -20
  205. package/dist/esm/modules/stream/chunked-builder.js +4 -4
  206. package/dist/esm/modules/stream/index.browser.js +10 -22
  207. package/dist/esm/modules/stream/index.js +15 -44
  208. package/dist/esm/modules/stream/internal/event-utils.js +40 -0
  209. package/dist/esm/modules/stream/internal/type-guards.js +24 -0
  210. package/dist/esm/modules/stream/pull-stream.js +107 -43
  211. package/dist/esm/modules/stream/shared.js +7 -4
  212. package/dist/esm/modules/stream/streams.browser.js +941 -823
  213. package/dist/esm/modules/stream/streams.js +146 -95
  214. package/dist/esm/modules/stream/utils.js +5 -38
  215. package/dist/iife/THIRD_PARTY_NOTICES.md +81 -0
  216. package/dist/iife/excelts.iife.js +4979 -2800
  217. package/dist/iife/excelts.iife.js.map +1 -1
  218. package/dist/iife/excelts.iife.min.js +103 -31
  219. package/dist/types/index.browser.d.ts +1 -0
  220. package/dist/{browser/modules/archive → types/modules/archive/compression}/compress.base.d.ts +1 -0
  221. package/dist/{browser/modules/archive → types/modules/archive/compression}/compress.browser.d.ts +10 -8
  222. package/dist/types/modules/archive/{streaming-compress.browser.d.ts → compression/streaming-compress.browser.d.ts} +1 -1
  223. package/dist/types/modules/archive/defaults.d.ts +1 -0
  224. package/dist/types/modules/archive/index.base.d.ts +4 -4
  225. package/dist/types/modules/archive/index.browser.d.ts +3 -4
  226. package/dist/types/modules/archive/index.d.ts +3 -4
  227. package/dist/types/modules/archive/internal/byte-queue.d.ts +33 -0
  228. package/dist/types/modules/archive/io/archive-sink.d.ts +8 -0
  229. package/dist/types/modules/archive/io/archive-source.d.ts +6 -0
  230. package/dist/types/modules/archive/unzip/index.d.ts +40 -0
  231. package/dist/types/modules/archive/{parse.base.d.ts → unzip/stream.base.d.ts} +60 -5
  232. package/dist/types/modules/archive/{parse.browser.d.ts → unzip/stream.browser.d.ts} +2 -2
  233. package/dist/types/modules/archive/{parse.d.ts → unzip/stream.d.ts} +3 -3
  234. package/dist/{browser/modules/archive → types/modules/archive/unzip}/zip-parser.d.ts +1 -1
  235. package/dist/types/modules/archive/utils/async-queue.d.ts +7 -0
  236. package/dist/types/modules/archive/utils/compressibility.d.ts +10 -0
  237. package/dist/types/modules/archive/utils/pattern-scanner.d.ts +21 -0
  238. package/dist/types/modules/archive/utils/zip-extra-fields.d.ts +1 -1
  239. package/dist/types/modules/archive/zip/index.d.ts +42 -0
  240. package/dist/types/modules/archive/{streaming-zip.d.ts → zip/stream.d.ts} +29 -6
  241. package/dist/types/modules/archive/zip/zip-bytes.d.ts +73 -0
  242. package/dist/types/modules/archive/{zip-entry-metadata.d.ts → zip/zip-entry-metadata.d.ts} +1 -1
  243. package/dist/types/modules/archive/{zip-records.d.ts → zip-spec/zip-records.d.ts} +20 -0
  244. package/dist/types/modules/excel/form-control.d.ts +2 -0
  245. package/dist/types/modules/excel/stream/workbook-writer.browser.d.ts +1 -1
  246. package/dist/types/modules/excel/utils/ooxml-validator.d.ts +48 -0
  247. package/dist/types/modules/excel/xlsx/xform/drawing/ctrl-prop-xform.d.ts +1 -0
  248. package/dist/types/modules/excel/xlsx/xform/drawing/sp-xform.d.ts +18 -0
  249. package/dist/types/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +6 -1
  250. package/dist/types/modules/excel/xlsx/xform/sheet/page-setup-xform.d.ts +1 -0
  251. package/dist/types/modules/stream/base-transform.d.ts +3 -0
  252. package/dist/types/modules/stream/buffered-stream.d.ts +2 -12
  253. package/dist/types/modules/stream/index.browser.d.ts +13 -19
  254. package/dist/types/modules/stream/index.d.ts +18 -41
  255. package/dist/types/modules/stream/internal/event-utils.d.ts +17 -0
  256. package/dist/types/modules/stream/internal/type-guards.d.ts +9 -0
  257. package/dist/types/modules/stream/pull-stream.d.ts +5 -6
  258. package/dist/types/modules/stream/shared.d.ts +1 -1
  259. package/dist/types/modules/stream/streams.browser.d.ts +32 -42
  260. package/dist/types/modules/stream/streams.d.ts +4 -20
  261. package/package.json +19 -15
  262. package/dist/browser/modules/archive/byte-queue.d.ts +0 -18
  263. package/dist/browser/modules/archive/byte-queue.js +0 -125
  264. package/dist/browser/modules/archive/parse.base.js +0 -610
  265. package/dist/browser/modules/archive/utils/zip-extra.d.ts +0 -18
  266. package/dist/browser/modules/archive/utils/zip-extra.js +0 -68
  267. package/dist/browser/modules/archive/zip-builder.d.ts +0 -117
  268. package/dist/browser/modules/archive/zip-builder.js +0 -292
  269. package/dist/browser/modules/archive/zip-constants.d.ts +0 -18
  270. package/dist/browser/modules/archive/zip-constants.js +0 -23
  271. package/dist/browser/modules/archive/zip-records.js +0 -84
  272. package/dist/cjs/modules/archive/byte-queue.js +0 -129
  273. package/dist/cjs/modules/archive/parse.base.js +0 -632
  274. package/dist/cjs/modules/archive/utils/zip-extra.js +0 -74
  275. package/dist/cjs/modules/archive/zip-builder.js +0 -297
  276. package/dist/cjs/modules/archive/zip-constants.js +0 -26
  277. package/dist/cjs/modules/archive/zip-records.js +0 -90
  278. package/dist/esm/modules/archive/byte-queue.js +0 -125
  279. package/dist/esm/modules/archive/parse.base.js +0 -610
  280. package/dist/esm/modules/archive/utils/zip-extra.js +0 -68
  281. package/dist/esm/modules/archive/zip-builder.js +0 -292
  282. package/dist/esm/modules/archive/zip-constants.js +0 -23
  283. package/dist/esm/modules/archive/zip-records.js +0 -84
  284. package/dist/types/modules/archive/byte-queue.d.ts +0 -18
  285. package/dist/types/modules/archive/utils/zip-extra.d.ts +0 -18
  286. package/dist/types/modules/archive/zip-builder.d.ts +0 -117
  287. package/dist/types/modules/archive/zip-constants.d.ts +0 -18
  288. /package/dist/browser/modules/archive/{crc32.base.d.ts → compression/crc32.base.d.ts} +0 -0
  289. /package/dist/browser/modules/archive/{crc32.base.js → compression/crc32.base.js} +0 -0
  290. /package/dist/browser/modules/archive/{crc32.browser.js → compression/crc32.browser.js} +0 -0
  291. /package/dist/browser/modules/archive/{deflate-fallback.d.ts → compression/deflate-fallback.d.ts} +0 -0
  292. /package/dist/browser/modules/archive/{streaming-compress.base.d.ts → compression/streaming-compress.base.d.ts} +0 -0
  293. /package/dist/browser/modules/archive/{streaming-compress.base.js → compression/streaming-compress.base.js} +0 -0
  294. /package/dist/browser/modules/archive/{extract.js → unzip/extract.js} +0 -0
  295. /package/dist/browser/modules/archive/{zip-entry-metadata.d.ts → zip/zip-entry-metadata.d.ts} +0 -0
  296. /package/dist/browser/modules/archive/{zip-entry-info.d.ts → zip-spec/zip-entry-info.d.ts} +0 -0
  297. /package/dist/browser/modules/archive/{zip-entry-info.js → zip-spec/zip-entry-info.js} +0 -0
  298. /package/dist/cjs/modules/archive/{crc32.base.js → compression/crc32.base.js} +0 -0
  299. /package/dist/cjs/modules/archive/{crc32.browser.js → compression/crc32.browser.js} +0 -0
  300. /package/dist/cjs/modules/archive/{streaming-compress.base.js → compression/streaming-compress.base.js} +0 -0
  301. /package/dist/cjs/modules/archive/{extract.js → unzip/extract.js} +0 -0
  302. /package/dist/cjs/modules/archive/{zip-entry-info.js → zip-spec/zip-entry-info.js} +0 -0
  303. /package/dist/esm/modules/archive/{crc32.base.js → compression/crc32.base.js} +0 -0
  304. /package/dist/esm/modules/archive/{crc32.browser.js → compression/crc32.browser.js} +0 -0
  305. /package/dist/esm/modules/archive/{streaming-compress.base.js → compression/streaming-compress.base.js} +0 -0
  306. /package/dist/esm/modules/archive/{extract.js → unzip/extract.js} +0 -0
  307. /package/dist/esm/modules/archive/{zip-entry-info.js → zip-spec/zip-entry-info.js} +0 -0
  308. /package/dist/{LICENSE → iife/LICENSE} +0 -0
  309. /package/dist/types/modules/archive/{compress.d.ts → compression/compress.d.ts} +0 -0
  310. /package/dist/types/modules/archive/{crc32.base.d.ts → compression/crc32.base.d.ts} +0 -0
  311. /package/dist/types/modules/archive/{crc32.browser.d.ts → compression/crc32.browser.d.ts} +0 -0
  312. /package/dist/types/modules/archive/{crc32.d.ts → compression/crc32.d.ts} +0 -0
  313. /package/dist/types/modules/archive/{deflate-fallback.d.ts → compression/deflate-fallback.d.ts} +0 -0
  314. /package/dist/types/modules/archive/{streaming-compress.base.d.ts → compression/streaming-compress.base.d.ts} +0 -0
  315. /package/dist/types/modules/archive/{streaming-compress.d.ts → compression/streaming-compress.d.ts} +0 -0
  316. /package/dist/types/modules/archive/{extract.d.ts → unzip/extract.d.ts} +0 -0
  317. /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: () => {
@@ -346,7 +537,27 @@ function createParseClass(createInflateRawFn) {
346
537
  }
347
538
  };
348
539
  queueMicrotask(() => {
349
- this._parsingDone = (0, parse_base_1.runParseLoop)(this._opts, io, emitter, () => createInflateRawFn(), this._driverState);
540
+ // NOTE: We intentionally do NOT pass inflateRawSync to runParseLoop in browser.
541
+ // Browser's native DecompressionStream is faster than our pure-JS fallback,
542
+ // so we always use the streaming path for decompression in browsers.
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
559
+ // No inflateRawSync - always use streaming DecompressionStream in browser
560
+ );
350
561
  this._parsingDone.catch((e) => {
351
562
  if (!this.__emittedError || this.__emittedError !== e) {
352
563
  this.__emittedError = e;
@@ -356,8 +567,16 @@ function createParseClass(createInflateRawFn) {
356
567
  });
357
568
  });
358
569
  }
359
- _handleWrite(chunk) {
570
+ _handleWrite(chunk, callback) {
360
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
+ }
361
580
  this._wakeUp();
362
581
  this.emit("data-available");
363
582
  this.emit("chunk");
@@ -368,13 +587,6 @@ function createParseClass(createInflateRawFn) {
368
587
  set buffer(value) {
369
588
  this._buffer.reset(value);
370
589
  }
371
- _maybeReleaseWriteCallback() {
372
- if (typeof this.cb === "function") {
373
- const callback = this.cb;
374
- this.cb = undefined;
375
- callback();
376
- }
377
- }
378
590
  _wakeUp() {
379
591
  if (this._pendingResolve) {
380
592
  const resolve = this._pendingResolve;
@@ -382,6 +594,17 @@ function createParseClass(createInflateRawFn) {
382
594
  resolve();
383
595
  }
384
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
+ }
385
608
  _waitForData() {
386
609
  return new Promise(resolve => {
387
610
  this._pendingResolve = resolve;
@@ -395,60 +618,76 @@ function createParseClass(createInflateRawFn) {
395
618
  if (this.finished) {
396
619
  if (this._buffer.length > 0) {
397
620
  const data = this._buffer.read(this._buffer.length);
621
+ this._maybeReleaseWriteCallback();
398
622
  return data;
399
623
  }
400
624
  throw new Error("FILE_ENDED");
401
625
  }
402
626
  await this._waitForData();
403
627
  }
404
- return this._buffer.read(length);
628
+ const out = this._buffer.read(length);
629
+ this._maybeReleaseWriteCallback();
630
+ return out;
405
631
  }
406
632
  async _pullUntilInternal(pattern, includeEof = false) {
407
633
  const chunks = [];
408
- let searchFrom = 0;
409
- const overlap = Math.max(0, pattern.length - 1);
634
+ const scanner = new pattern_scanner_1.PatternScanner(pattern);
410
635
  while (true) {
411
- const view = this._buffer.view();
412
- const match = (0, bytes_1.indexOfUint8ArrayPattern)(view, pattern, searchFrom);
636
+ const bufLen = this._buffer.length;
637
+ const match = scanner.find(this._buffer);
413
638
  if (match !== -1) {
414
639
  this.match = match;
415
640
  const toRead = match + (includeEof ? pattern.length : 0);
416
641
  if (toRead > 0) {
417
642
  chunks.push(this._buffer.read(toRead));
643
+ this._maybeReleaseWriteCallback();
418
644
  }
419
- return (0, _stream_1.concatUint8Arrays)(chunks);
645
+ return chunks.length === 1 ? chunks[0] : (0, _stream_1.concatUint8Arrays)(chunks);
420
646
  }
421
647
  // No match yet. Avoid rescanning bytes that can't start a match.
422
- searchFrom = Math.max(searchFrom, Math.max(0, view.length - overlap));
648
+ scanner.onNoMatch(bufLen);
423
649
  if (this.finished) {
424
650
  throw new Error("FILE_ENDED");
425
651
  }
426
652
  const safeLen = Math.max(0, this._buffer.length - pattern.length);
427
653
  if (safeLen > 0) {
428
654
  chunks.push(this._buffer.read(safeLen));
429
- searchFrom = Math.max(0, searchFrom - safeLen);
655
+ scanner.onConsume(safeLen);
656
+ this._maybeReleaseWriteCallback();
430
657
  }
431
658
  await this._waitForData();
432
659
  }
433
660
  }
434
661
  _streamFixedLength(length) {
435
- const output = new _stream_1.PassThrough();
662
+ const output = new _stream_1.PassThrough({ highWaterMark: DEFAULT_UNZIP_STREAM_HIGH_WATER_MARK });
436
663
  let remaining = length;
437
664
  let done = false;
665
+ let waitingDrain = false;
438
666
  const pull = () => {
439
667
  if (done) {
440
668
  return;
441
669
  }
670
+ if (waitingDrain) {
671
+ return;
672
+ }
442
673
  while (remaining > 0 && this._buffer.length > 0) {
443
674
  const toRead = Math.min(remaining, this._buffer.length);
444
675
  const chunk = this._buffer.read(toRead);
445
676
  remaining -= toRead;
446
- 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
+ }
447
687
  }
448
688
  if (remaining === 0) {
449
689
  done = true;
450
690
  this.removeListener("data-available", pull);
451
- this._maybeReleaseWriteCallback();
452
691
  output.end();
453
692
  }
454
693
  else if (this.finished) {
@@ -462,42 +701,69 @@ function createParseClass(createInflateRawFn) {
462
701
  return output;
463
702
  }
464
703
  _streamUntilPattern(pattern, includeEof = false) {
465
- const output = new _stream_1.PassThrough();
704
+ const output = new _stream_1.PassThrough({ highWaterMark: DEFAULT_UNZIP_STREAM_HIGH_WATER_MARK });
466
705
  let done = false;
467
- let searchFrom = 0;
468
- 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;
469
709
  const pull = () => {
470
- if (done) {
710
+ if (done || waitingDrain) {
471
711
  return;
472
712
  }
473
- const view = this._buffer.view();
474
- const match = (0, bytes_1.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));
713
+ while (true) {
714
+ if (this._buffer.length <= 0) {
715
+ break;
480
716
  }
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);
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);
500
758
  this._maybeReleaseWriteCallback();
759
+ if (!ok) {
760
+ waitingDrain = true;
761
+ output.once("drain", () => {
762
+ waitingDrain = false;
763
+ pull();
764
+ });
765
+ return;
766
+ }
501
767
  }
502
768
  };
503
769
  this.on("data-available", pull);
@@ -520,11 +786,7 @@ function createParseClass(createInflateRawFn) {
520
786
  return Promise.reject(new Error("FILE_ENDED"));
521
787
  }
522
788
  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);
789
+ return Promise.resolve(this._buffer.read(eof));
528
790
  }
529
791
  return this._pullInternal(eof);
530
792
  }
@@ -538,16 +800,20 @@ function createParseClass(createInflateRawFn) {
538
800
  return this.pull(pattern, includeEof);
539
801
  }
540
802
  _streamUntilDataDescriptor() {
541
- return (0, parse_base_1.streamUntilValidatedDataDescriptor)({
803
+ return (0, stream_base_1.streamUntilValidatedDataDescriptor)({
542
804
  source: {
543
- getView: () => this._buffer.view(),
544
805
  getLength: () => this._buffer.length,
545
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),
546
811
  isFinished: () => this.finished,
547
812
  onDataAvailable: (cb) => {
548
813
  this.on("data-available", cb);
549
814
  return () => this.removeListener("data-available", cb);
550
- }
815
+ },
816
+ maybeReleaseWriteCallback: () => this._maybeReleaseWriteCallback()
551
817
  },
552
818
  dataDescriptorSignature
553
819
  });