@ismail-elkorchi/bytefold 0.6.0

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 (314) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +48 -0
  3. package/SPEC.md +285 -0
  4. package/dist/abort.d.ts +3 -0
  5. package/dist/abort.d.ts.map +1 -0
  6. package/dist/abort.js +33 -0
  7. package/dist/abort.js.map +1 -0
  8. package/dist/archive/errors.d.ts +34 -0
  9. package/dist/archive/errors.d.ts.map +1 -0
  10. package/dist/archive/errors.js +45 -0
  11. package/dist/archive/errors.js.map +1 -0
  12. package/dist/archive/httpArchiveErrors.d.ts +2 -0
  13. package/dist/archive/httpArchiveErrors.d.ts.map +1 -0
  14. package/dist/archive/httpArchiveErrors.js +25 -0
  15. package/dist/archive/httpArchiveErrors.js.map +1 -0
  16. package/dist/archive/index.d.ts +47 -0
  17. package/dist/archive/index.d.ts.map +1 -0
  18. package/dist/archive/index.js +1490 -0
  19. package/dist/archive/index.js.map +1 -0
  20. package/dist/archive/types.d.ts +91 -0
  21. package/dist/archive/types.d.ts.map +1 -0
  22. package/dist/archive/types.js +2 -0
  23. package/dist/archive/types.js.map +1 -0
  24. package/dist/archive/xzPreflight.d.ts +13 -0
  25. package/dist/archive/xzPreflight.d.ts.map +1 -0
  26. package/dist/archive/xzPreflight.js +44 -0
  27. package/dist/archive/xzPreflight.js.map +1 -0
  28. package/dist/archive/zipPreflight.d.ts +18 -0
  29. package/dist/archive/zipPreflight.d.ts.map +1 -0
  30. package/dist/archive/zipPreflight.js +50 -0
  31. package/dist/archive/zipPreflight.js.map +1 -0
  32. package/dist/binary.d.ts +12 -0
  33. package/dist/binary.d.ts.map +1 -0
  34. package/dist/binary.js +59 -0
  35. package/dist/binary.js.map +1 -0
  36. package/dist/bun/index.d.ts +19 -0
  37. package/dist/bun/index.d.ts.map +1 -0
  38. package/dist/bun/index.js +427 -0
  39. package/dist/bun/index.js.map +1 -0
  40. package/dist/compress/errors.d.ts +30 -0
  41. package/dist/compress/errors.d.ts.map +1 -0
  42. package/dist/compress/errors.js +40 -0
  43. package/dist/compress/errors.js.map +1 -0
  44. package/dist/compress/index.d.ts +12 -0
  45. package/dist/compress/index.d.ts.map +1 -0
  46. package/dist/compress/index.js +339 -0
  47. package/dist/compress/index.js.map +1 -0
  48. package/dist/compress/types.d.ts +41 -0
  49. package/dist/compress/types.d.ts.map +1 -0
  50. package/dist/compress/types.js +2 -0
  51. package/dist/compress/types.js.map +1 -0
  52. package/dist/compression/bzip2.d.ts +9 -0
  53. package/dist/compression/bzip2.d.ts.map +1 -0
  54. package/dist/compression/bzip2.js +546 -0
  55. package/dist/compression/bzip2.js.map +1 -0
  56. package/dist/compression/codecs.d.ts +6 -0
  57. package/dist/compression/codecs.d.ts.map +1 -0
  58. package/dist/compression/codecs.js +82 -0
  59. package/dist/compression/codecs.js.map +1 -0
  60. package/dist/compression/deflate64.d.ts +3 -0
  61. package/dist/compression/deflate64.d.ts.map +1 -0
  62. package/dist/compression/deflate64.js +549 -0
  63. package/dist/compression/deflate64.js.map +1 -0
  64. package/dist/compression/node-backend.d.ts +9 -0
  65. package/dist/compression/node-backend.d.ts.map +1 -0
  66. package/dist/compression/node-backend.js +103 -0
  67. package/dist/compression/node-backend.js.map +1 -0
  68. package/dist/compression/registry.d.ts +10 -0
  69. package/dist/compression/registry.d.ts.map +1 -0
  70. package/dist/compression/registry.js +30 -0
  71. package/dist/compression/registry.js.map +1 -0
  72. package/dist/compression/streams.d.ts +31 -0
  73. package/dist/compression/streams.d.ts.map +1 -0
  74. package/dist/compression/streams.js +147 -0
  75. package/dist/compression/streams.js.map +1 -0
  76. package/dist/compression/types.d.ts +19 -0
  77. package/dist/compression/types.d.ts.map +1 -0
  78. package/dist/compression/types.js +2 -0
  79. package/dist/compression/types.js.map +1 -0
  80. package/dist/compression/xz.d.ts +21 -0
  81. package/dist/compression/xz.d.ts.map +1 -0
  82. package/dist/compression/xz.js +1455 -0
  83. package/dist/compression/xz.js.map +1 -0
  84. package/dist/compression/xzFilters.d.ts +14 -0
  85. package/dist/compression/xzFilters.d.ts.map +1 -0
  86. package/dist/compression/xzFilters.js +736 -0
  87. package/dist/compression/xzFilters.js.map +1 -0
  88. package/dist/compression/xzIndexPreflight.d.ts +20 -0
  89. package/dist/compression/xzIndexPreflight.d.ts.map +1 -0
  90. package/dist/compression/xzIndexPreflight.js +371 -0
  91. package/dist/compression/xzIndexPreflight.js.map +1 -0
  92. package/dist/compression/xzScan.d.ts +15 -0
  93. package/dist/compression/xzScan.d.ts.map +1 -0
  94. package/dist/compression/xzScan.js +310 -0
  95. package/dist/compression/xzScan.js.map +1 -0
  96. package/dist/cp437.d.ts +2 -0
  97. package/dist/cp437.d.ts.map +1 -0
  98. package/dist/cp437.js +31 -0
  99. package/dist/cp437.js.map +1 -0
  100. package/dist/crc32.d.ts +7 -0
  101. package/dist/crc32.d.ts.map +1 -0
  102. package/dist/crc32.js +37 -0
  103. package/dist/crc32.js.map +1 -0
  104. package/dist/crc64.d.ts +6 -0
  105. package/dist/crc64.d.ts.map +1 -0
  106. package/dist/crc64.js +32 -0
  107. package/dist/crc64.js.map +1 -0
  108. package/dist/crypto/ctr.d.ts +11 -0
  109. package/dist/crypto/ctr.d.ts.map +1 -0
  110. package/dist/crypto/ctr.js +56 -0
  111. package/dist/crypto/ctr.js.map +1 -0
  112. package/dist/crypto/sha256.d.ts +16 -0
  113. package/dist/crypto/sha256.d.ts.map +1 -0
  114. package/dist/crypto/sha256.js +152 -0
  115. package/dist/crypto/sha256.js.map +1 -0
  116. package/dist/crypto/winzip-aes.d.ts +17 -0
  117. package/dist/crypto/winzip-aes.d.ts.map +1 -0
  118. package/dist/crypto/winzip-aes.js +98 -0
  119. package/dist/crypto/winzip-aes.js.map +1 -0
  120. package/dist/crypto/zipcrypto.d.ts +23 -0
  121. package/dist/crypto/zipcrypto.d.ts.map +1 -0
  122. package/dist/crypto/zipcrypto.js +99 -0
  123. package/dist/crypto/zipcrypto.js.map +1 -0
  124. package/dist/deno/index.d.ts +19 -0
  125. package/dist/deno/index.d.ts.map +1 -0
  126. package/dist/deno/index.js +422 -0
  127. package/dist/deno/index.js.map +1 -0
  128. package/dist/dosTime.d.ts +7 -0
  129. package/dist/dosTime.d.ts.map +1 -0
  130. package/dist/dosTime.js +21 -0
  131. package/dist/dosTime.js.map +1 -0
  132. package/dist/errorContext.d.ts +2 -0
  133. package/dist/errorContext.d.ts.map +1 -0
  134. package/dist/errorContext.js +24 -0
  135. package/dist/errorContext.js.map +1 -0
  136. package/dist/errors.d.ts +46 -0
  137. package/dist/errors.d.ts.map +1 -0
  138. package/dist/errors.js +51 -0
  139. package/dist/errors.js.map +1 -0
  140. package/dist/extraFields.d.ts +29 -0
  141. package/dist/extraFields.d.ts.map +1 -0
  142. package/dist/extraFields.js +201 -0
  143. package/dist/extraFields.js.map +1 -0
  144. package/dist/generated/unicodeCaseFolding.d.ts +4 -0
  145. package/dist/generated/unicodeCaseFolding.d.ts.map +1 -0
  146. package/dist/generated/unicodeCaseFolding.js +1594 -0
  147. package/dist/generated/unicodeCaseFolding.js.map +1 -0
  148. package/dist/http/errors.d.ts +26 -0
  149. package/dist/http/errors.d.ts.map +1 -0
  150. package/dist/http/errors.js +33 -0
  151. package/dist/http/errors.js.map +1 -0
  152. package/dist/index.d.ts +10 -0
  153. package/dist/index.d.ts.map +1 -0
  154. package/dist/index.js +7 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/limits.d.ts +22 -0
  157. package/dist/limits.d.ts.map +1 -0
  158. package/dist/limits.js +39 -0
  159. package/dist/limits.js.map +1 -0
  160. package/dist/node/index.d.ts +13 -0
  161. package/dist/node/index.d.ts.map +1 -0
  162. package/dist/node/index.js +448 -0
  163. package/dist/node/index.js.map +1 -0
  164. package/dist/node/zip/RandomAccess.d.ts +12 -0
  165. package/dist/node/zip/RandomAccess.d.ts.map +1 -0
  166. package/dist/node/zip/RandomAccess.js +38 -0
  167. package/dist/node/zip/RandomAccess.js.map +1 -0
  168. package/dist/node/zip/Sink.d.ts +17 -0
  169. package/dist/node/zip/Sink.d.ts.map +1 -0
  170. package/dist/node/zip/Sink.js +45 -0
  171. package/dist/node/zip/Sink.js.map +1 -0
  172. package/dist/node/zip/ZipReader.d.ts +51 -0
  173. package/dist/node/zip/ZipReader.d.ts.map +1 -0
  174. package/dist/node/zip/ZipReader.js +1540 -0
  175. package/dist/node/zip/ZipReader.js.map +1 -0
  176. package/dist/node/zip/ZipWriter.d.ts +21 -0
  177. package/dist/node/zip/ZipWriter.d.ts.map +1 -0
  178. package/dist/node/zip/ZipWriter.js +196 -0
  179. package/dist/node/zip/ZipWriter.js.map +1 -0
  180. package/dist/node/zip/entryStream.d.ts +22 -0
  181. package/dist/node/zip/entryStream.d.ts.map +1 -0
  182. package/dist/node/zip/entryStream.js +241 -0
  183. package/dist/node/zip/entryStream.js.map +1 -0
  184. package/dist/node/zip/entryWriter.d.ts +54 -0
  185. package/dist/node/zip/entryWriter.d.ts.map +1 -0
  186. package/dist/node/zip/entryWriter.js +512 -0
  187. package/dist/node/zip/entryWriter.js.map +1 -0
  188. package/dist/node/zip/index.d.ts +8 -0
  189. package/dist/node/zip/index.d.ts.map +1 -0
  190. package/dist/node/zip/index.js +5 -0
  191. package/dist/node/zip/index.js.map +1 -0
  192. package/dist/reader/RandomAccess.d.ts +55 -0
  193. package/dist/reader/RandomAccess.d.ts.map +1 -0
  194. package/dist/reader/RandomAccess.js +528 -0
  195. package/dist/reader/RandomAccess.js.map +1 -0
  196. package/dist/reader/ZipReader.d.ts +89 -0
  197. package/dist/reader/ZipReader.d.ts.map +1 -0
  198. package/dist/reader/ZipReader.js +1359 -0
  199. package/dist/reader/ZipReader.js.map +1 -0
  200. package/dist/reader/centralDirectory.d.ts +40 -0
  201. package/dist/reader/centralDirectory.d.ts.map +1 -0
  202. package/dist/reader/centralDirectory.js +311 -0
  203. package/dist/reader/centralDirectory.js.map +1 -0
  204. package/dist/reader/entryStream.d.ts +22 -0
  205. package/dist/reader/entryStream.d.ts.map +1 -0
  206. package/dist/reader/entryStream.js +122 -0
  207. package/dist/reader/entryStream.js.map +1 -0
  208. package/dist/reader/eocd.d.ts +22 -0
  209. package/dist/reader/eocd.d.ts.map +1 -0
  210. package/dist/reader/eocd.js +184 -0
  211. package/dist/reader/eocd.js.map +1 -0
  212. package/dist/reader/httpZipErrors.d.ts +4 -0
  213. package/dist/reader/httpZipErrors.d.ts.map +1 -0
  214. package/dist/reader/httpZipErrors.js +48 -0
  215. package/dist/reader/httpZipErrors.js.map +1 -0
  216. package/dist/reader/localHeader.d.ts +15 -0
  217. package/dist/reader/localHeader.d.ts.map +1 -0
  218. package/dist/reader/localHeader.js +37 -0
  219. package/dist/reader/localHeader.js.map +1 -0
  220. package/dist/reportSchema.d.ts +3 -0
  221. package/dist/reportSchema.d.ts.map +1 -0
  222. package/dist/reportSchema.js +3 -0
  223. package/dist/reportSchema.js.map +1 -0
  224. package/dist/streams/adapters.d.ts +10 -0
  225. package/dist/streams/adapters.d.ts.map +1 -0
  226. package/dist/streams/adapters.js +54 -0
  227. package/dist/streams/adapters.js.map +1 -0
  228. package/dist/streams/buffer.d.ts +5 -0
  229. package/dist/streams/buffer.d.ts.map +1 -0
  230. package/dist/streams/buffer.js +44 -0
  231. package/dist/streams/buffer.js.map +1 -0
  232. package/dist/streams/crcTransform.d.ts +15 -0
  233. package/dist/streams/crcTransform.d.ts.map +1 -0
  234. package/dist/streams/crcTransform.js +30 -0
  235. package/dist/streams/crcTransform.js.map +1 -0
  236. package/dist/streams/emit.d.ts +7 -0
  237. package/dist/streams/emit.d.ts.map +1 -0
  238. package/dist/streams/emit.js +13 -0
  239. package/dist/streams/emit.js.map +1 -0
  240. package/dist/streams/limits.d.ts +16 -0
  241. package/dist/streams/limits.d.ts.map +1 -0
  242. package/dist/streams/limits.js +39 -0
  243. package/dist/streams/limits.js.map +1 -0
  244. package/dist/streams/measure.d.ts +5 -0
  245. package/dist/streams/measure.d.ts.map +1 -0
  246. package/dist/streams/measure.js +9 -0
  247. package/dist/streams/measure.js.map +1 -0
  248. package/dist/streams/progress.d.ts +8 -0
  249. package/dist/streams/progress.d.ts.map +1 -0
  250. package/dist/streams/progress.js +69 -0
  251. package/dist/streams/progress.js.map +1 -0
  252. package/dist/streams/web.d.ts +5 -0
  253. package/dist/streams/web.d.ts.map +1 -0
  254. package/dist/streams/web.js +33 -0
  255. package/dist/streams/web.js.map +1 -0
  256. package/dist/tar/TarReader.d.ts +41 -0
  257. package/dist/tar/TarReader.d.ts.map +1 -0
  258. package/dist/tar/TarReader.js +930 -0
  259. package/dist/tar/TarReader.js.map +1 -0
  260. package/dist/tar/TarWriter.d.ts +25 -0
  261. package/dist/tar/TarWriter.d.ts.map +1 -0
  262. package/dist/tar/TarWriter.js +307 -0
  263. package/dist/tar/TarWriter.js.map +1 -0
  264. package/dist/tar/index.d.ts +4 -0
  265. package/dist/tar/index.d.ts.map +1 -0
  266. package/dist/tar/index.js +3 -0
  267. package/dist/tar/index.js.map +1 -0
  268. package/dist/tar/types.d.ts +67 -0
  269. package/dist/tar/types.d.ts.map +1 -0
  270. package/dist/tar/types.js +2 -0
  271. package/dist/tar/types.js.map +1 -0
  272. package/dist/text/caseFold.d.ts +7 -0
  273. package/dist/text/caseFold.d.ts.map +1 -0
  274. package/dist/text/caseFold.js +45 -0
  275. package/dist/text/caseFold.js.map +1 -0
  276. package/dist/types.d.ts +190 -0
  277. package/dist/types.d.ts.map +1 -0
  278. package/dist/types.js +2 -0
  279. package/dist/types.js.map +1 -0
  280. package/dist/web/index.d.ts +11 -0
  281. package/dist/web/index.d.ts.map +1 -0
  282. package/dist/web/index.js +95 -0
  283. package/dist/web/index.js.map +1 -0
  284. package/dist/writer/Sink.d.ts +21 -0
  285. package/dist/writer/Sink.d.ts.map +1 -0
  286. package/dist/writer/Sink.js +24 -0
  287. package/dist/writer/Sink.js.map +1 -0
  288. package/dist/writer/ZipWriter.d.ts +27 -0
  289. package/dist/writer/ZipWriter.d.ts.map +1 -0
  290. package/dist/writer/ZipWriter.js +153 -0
  291. package/dist/writer/ZipWriter.js.map +1 -0
  292. package/dist/writer/centralDirectoryWriter.d.ts +8 -0
  293. package/dist/writer/centralDirectoryWriter.d.ts.map +1 -0
  294. package/dist/writer/centralDirectoryWriter.js +77 -0
  295. package/dist/writer/centralDirectoryWriter.js.map +1 -0
  296. package/dist/writer/entryWriter.d.ts +54 -0
  297. package/dist/writer/entryWriter.d.ts.map +1 -0
  298. package/dist/writer/entryWriter.js +327 -0
  299. package/dist/writer/entryWriter.js.map +1 -0
  300. package/dist/writer/finalize.d.ts +10 -0
  301. package/dist/writer/finalize.d.ts.map +1 -0
  302. package/dist/writer/finalize.js +56 -0
  303. package/dist/writer/finalize.js.map +1 -0
  304. package/dist/zip/index.d.ts +8 -0
  305. package/dist/zip/index.d.ts.map +1 -0
  306. package/dist/zip/index.js +5 -0
  307. package/dist/zip/index.js.map +1 -0
  308. package/jsr.json +41 -0
  309. package/package.json +117 -0
  310. package/schemas/audit-report.schema.json +38 -0
  311. package/schemas/capabilities-report.schema.json +25 -0
  312. package/schemas/detection-report.schema.json +23 -0
  313. package/schemas/error.schema.json +22 -0
  314. package/schemas/normalize-report.schema.json +47 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/node/zip/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AA4B3C,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC"}
@@ -0,0 +1,55 @@
1
+ export interface RandomAccess {
2
+ size(signal?: AbortSignal): Promise<bigint>;
3
+ read(offset: bigint, length: number, signal?: AbortSignal): Promise<Uint8Array>;
4
+ close(): Promise<void>;
5
+ }
6
+ export declare class BufferRandomAccess implements RandomAccess {
7
+ private readonly data;
8
+ constructor(data: Uint8Array);
9
+ size(signal?: AbortSignal): Promise<bigint>;
10
+ read(offset: bigint, length: number, signal?: AbortSignal): Promise<Uint8Array>;
11
+ close(): Promise<void>;
12
+ }
13
+ export declare class BlobRandomAccess implements RandomAccess {
14
+ private readonly blob;
15
+ constructor(blob: Blob);
16
+ size(signal?: AbortSignal): Promise<bigint>;
17
+ read(offset: bigint, length: number, signal?: AbortSignal): Promise<Uint8Array>;
18
+ close(): Promise<void>;
19
+ }
20
+ export interface HttpRandomAccessOptions {
21
+ headers?: Record<string, string>;
22
+ cache?: {
23
+ blockSize?: number;
24
+ maxBlocks?: number;
25
+ };
26
+ signal?: AbortSignal;
27
+ snapshotPolicy?: 'require-strong-etag' | 'best-effort';
28
+ }
29
+ export declare class HttpRandomAccess implements RandomAccess {
30
+ private readonly url;
31
+ private readonly headers;
32
+ private readonly blockSize;
33
+ private readonly maxBlocks;
34
+ private readonly cache;
35
+ private resolvedSizeBytes?;
36
+ private pinnedEtag?;
37
+ private pinnedLastModified?;
38
+ private readonly signal;
39
+ private readonly snapshotPolicy;
40
+ private readonly shouldSkipRangeAcceptEncoding;
41
+ constructor(url: string | URL, options?: HttpRandomAccessOptions);
42
+ size(signal?: AbortSignal): Promise<bigint>;
43
+ read(offset: bigint, length: number, signal?: AbortSignal): Promise<Uint8Array>;
44
+ close(): Promise<void>;
45
+ private tryHeadSize;
46
+ private probeSizeWithRangeRequest;
47
+ private getBlock;
48
+ private fetchRange;
49
+ private fetchRangeResponse;
50
+ private buildIfRangeHeader;
51
+ private applyValidators;
52
+ private findValidatorMismatch;
53
+ private enforceStrongEtag;
54
+ }
55
+ //# sourceMappingURL=RandomAccess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RandomAccess.d.ts","sourceRoot":"","sources":["../../src/reader/RandomAccess.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,qBAAa,kBAAmB,YAAW,YAAY;IACzC,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAEvC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAK3C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAO/E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED,qBAAa,gBAAiB,YAAW,YAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,IAAI;IAEjC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAK3C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAiB/E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE;QACN,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,cAAc,CAAC,EAAE,qBAAqB,GAAG,aAAa,CAAC;CACxD;AAED,qBAAa,gBAAiB,YAAW,YAAY;IACnD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,OAAO,CAAC,iBAAiB,CAAC,CAAS;IACnC,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,kBAAkB,CAAC,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwC;IACvE,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAU;gBAE5C,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,OAAO,CAAC,EAAE,uBAAuB;IAc1D,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAc3C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAgC/E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAId,WAAW;YA4BX,yBAAyB;YASzB,QAAQ;YAkBR,UAAU;YASV,kBAAkB;IA0KhC,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,iBAAiB;CAU1B"}
@@ -0,0 +1,528 @@
1
+ import { HttpError } from '../http/errors.js';
2
+ import { mergeSignals, throwIfAborted } from '../abort.js';
3
+ export class BufferRandomAccess {
4
+ data;
5
+ constructor(data) {
6
+ this.data = data;
7
+ }
8
+ async size(signal) {
9
+ throwIfAborted(signal);
10
+ return BigInt(this.data.length);
11
+ }
12
+ async read(offset, length, signal) {
13
+ throwIfAborted(signal);
14
+ const start = Number(offset);
15
+ const end = Math.min(this.data.length, start + length);
16
+ return this.data.subarray(start, end);
17
+ }
18
+ async close() {
19
+ return;
20
+ }
21
+ }
22
+ export class BlobRandomAccess {
23
+ blob;
24
+ constructor(blob) {
25
+ this.blob = blob;
26
+ }
27
+ async size(signal) {
28
+ throwIfAborted(signal);
29
+ return BigInt(this.blob.size);
30
+ }
31
+ async read(offset, length, signal) {
32
+ throwIfAborted(signal);
33
+ if (length <= 0)
34
+ return new Uint8Array(0);
35
+ const size = BigInt(this.blob.size);
36
+ if (offset >= size)
37
+ return new Uint8Array(0);
38
+ const end = minBigInt(offset + BigInt(length), size);
39
+ const startNumber = Number(offset);
40
+ const endNumber = Number(end);
41
+ if (!Number.isSafeInteger(startNumber) || !Number.isSafeInteger(endNumber)) {
42
+ throw new RangeError('Blob random access offset exceeds safe integer range');
43
+ }
44
+ const chunk = this.blob.slice(startNumber, endNumber);
45
+ const bytes = new Uint8Array(await chunk.arrayBuffer());
46
+ throwIfAborted(signal);
47
+ return bytes;
48
+ }
49
+ async close() {
50
+ return;
51
+ }
52
+ }
53
+ export class HttpRandomAccess {
54
+ url;
55
+ headers;
56
+ blockSize;
57
+ maxBlocks;
58
+ cache = new Map();
59
+ resolvedSizeBytes;
60
+ pinnedEtag;
61
+ pinnedLastModified;
62
+ signal;
63
+ snapshotPolicy;
64
+ shouldSkipRangeAcceptEncoding;
65
+ constructor(url, options) {
66
+ this.url = typeof url === 'string' ? url : url.toString();
67
+ const headers = new Headers(options?.headers ?? {});
68
+ headers.delete('accept-encoding');
69
+ this.headers = headers;
70
+ const blockSize = options?.cache?.blockSize ?? 64 * 1024;
71
+ const maxBlocks = options?.cache?.maxBlocks ?? 64;
72
+ this.blockSize = Number.isFinite(blockSize) && blockSize > 0 ? Math.floor(blockSize) : 64 * 1024;
73
+ this.maxBlocks = Number.isFinite(maxBlocks) && maxBlocks > 0 ? Math.floor(maxBlocks) : 64;
74
+ this.signal = options?.signal ?? null;
75
+ this.snapshotPolicy = options?.snapshotPolicy ?? 'best-effort';
76
+ this.shouldSkipRangeAcceptEncoding = isNodeRuntime();
77
+ }
78
+ async size(signal) {
79
+ if (this.resolvedSizeBytes !== undefined)
80
+ return this.resolvedSizeBytes;
81
+ const headSize = await this.tryHeadSize(signal);
82
+ if (headSize !== undefined) {
83
+ this.resolvedSizeBytes = headSize;
84
+ return headSize;
85
+ }
86
+ const rangeSize = await this.probeSizeWithRangeRequest(signal);
87
+ this.resolvedSizeBytes = rangeSize;
88
+ return rangeSize;
89
+ }
90
+ async read(offset, length, signal) {
91
+ throwIfAborted(signal);
92
+ if (length <= 0)
93
+ return new Uint8Array(0);
94
+ const size = await this.size(signal);
95
+ if (offset >= size)
96
+ return new Uint8Array(0);
97
+ const available = size - offset;
98
+ const lengthToRead = available < BigInt(length) ? Number(available) : length;
99
+ if (lengthToRead <= 0)
100
+ return new Uint8Array(0);
101
+ const blockSize = BigInt(this.blockSize);
102
+ const startBlock = offset / blockSize;
103
+ const endBlock = (offset + BigInt(lengthToRead) - 1n) / blockSize;
104
+ const requestedBytes = new Uint8Array(lengthToRead);
105
+ for (let blockIndex = startBlock; blockIndex <= endBlock; blockIndex += 1n) {
106
+ throwIfAborted(signal);
107
+ const blockStart = blockIndex * blockSize;
108
+ const blockEnd = minBigInt(blockStart + blockSize - 1n, size - 1n);
109
+ const block = await this.getBlock(blockIndex, blockStart, blockEnd, signal);
110
+ const copyStart = offset > blockStart ? offset - blockStart : 0n;
111
+ const copyEnd = minBigInt(blockStart + BigInt(block.length), offset + BigInt(lengthToRead)) - blockStart;
112
+ const copyLength = Number(copyEnd - copyStart);
113
+ if (copyLength <= 0)
114
+ continue;
115
+ const destOffset = Number(blockStart + copyStart - offset);
116
+ requestedBytes.set(block.subarray(Number(copyStart), Number(copyStart) + copyLength), destOffset);
117
+ }
118
+ return requestedBytes;
119
+ }
120
+ async close() {
121
+ this.cache.clear();
122
+ }
123
+ async tryHeadSize(signal) {
124
+ try {
125
+ const merged = mergeSignals(this.signal, signal);
126
+ const headers = new Headers(this.headers);
127
+ applyAcceptEncoding(headers);
128
+ const response = await fetch(this.url, {
129
+ method: 'HEAD',
130
+ headers,
131
+ signal: merged ?? null
132
+ });
133
+ if (!response.ok)
134
+ return undefined;
135
+ ensureIdentityEncoding(this.url, response, 'HEAD');
136
+ this.applyValidators(response);
137
+ const lengthHeader = response.headers.get('content-length');
138
+ if (!lengthHeader)
139
+ return undefined;
140
+ try {
141
+ const parsedLength = BigInt(lengthHeader);
142
+ if (parsedLength < 0n)
143
+ return undefined;
144
+ return parsedLength;
145
+ }
146
+ catch {
147
+ return undefined;
148
+ }
149
+ }
150
+ catch (err) {
151
+ if (err instanceof HttpError)
152
+ throw err;
153
+ return undefined;
154
+ }
155
+ }
156
+ async probeSizeWithRangeRequest(signal) {
157
+ const response = await this.fetchRangeResponse(0n, 0n, signal ? { signal, shouldExpectTotalSize: true } : { shouldExpectTotalSize: true });
158
+ return response.size;
159
+ }
160
+ async getBlock(index, start, end, signal) {
161
+ const cached = this.cache.get(index);
162
+ if (cached) {
163
+ this.cache.delete(index);
164
+ this.cache.set(index, cached);
165
+ return cached;
166
+ }
167
+ const data = await this.fetchRange(start, end, signal);
168
+ if (this.maxBlocks > 0) {
169
+ this.cache.set(index, data);
170
+ if (this.cache.size > this.maxBlocks) {
171
+ const oldest = this.cache.keys().next().value;
172
+ if (oldest !== undefined)
173
+ this.cache.delete(oldest);
174
+ }
175
+ }
176
+ return data;
177
+ }
178
+ async fetchRange(start, end, signal) {
179
+ const response = await this.fetchRangeResponse(start, end, signal ? { signal, shouldExpectTotalSize: false } : { shouldExpectTotalSize: false });
180
+ return response.data;
181
+ }
182
+ async fetchRangeResponse(start, end, options) {
183
+ const requestController = new AbortController();
184
+ const merged = mergeSignals(this.signal, options.signal, requestController.signal);
185
+ const headers = new Headers(this.headers);
186
+ if (!this.shouldSkipRangeAcceptEncoding) {
187
+ applyAcceptEncoding(headers);
188
+ }
189
+ headers.set('Range', `bytes=${start}-${end}`);
190
+ const ifRange = this.buildIfRangeHeader();
191
+ const didSendIfRange = ifRange !== undefined;
192
+ if (ifRange) {
193
+ headers.set('If-Range', ifRange);
194
+ }
195
+ let response;
196
+ try {
197
+ response = await fetch(this.url, {
198
+ method: 'GET',
199
+ headers,
200
+ signal: merged ?? null
201
+ });
202
+ }
203
+ catch (err) {
204
+ if (isLikelyContentEncodingError(err)) {
205
+ throw new HttpError('HTTP_CONTENT_ENCODING', 'Content-Encoding is not allowed for seekable HTTP range sessions', {
206
+ context: { url: this.url, contentEncoding: 'unknown', requestedRange: `${start}-${end}` }
207
+ });
208
+ }
209
+ throw err;
210
+ }
211
+ const rejectFromHeaders = async (code, message, context) => {
212
+ await abortResponse(response, requestController);
213
+ throw new HttpError(code, message, context ? { context } : undefined);
214
+ };
215
+ if (response.status === 200) {
216
+ const mismatch = this.findValidatorMismatch(response);
217
+ if (didSendIfRange) {
218
+ await rejectFromHeaders('HTTP_RESOURCE_CHANGED', 'Remote resource changed during range session', mismatch ?? {
219
+ expectedEtag: ifRange ?? 'unknown'
220
+ });
221
+ }
222
+ await rejectFromHeaders('HTTP_RANGE_UNSUPPORTED', 'Server does not support HTTP range requests');
223
+ }
224
+ if (response.status === 416) {
225
+ await rejectFromHeaders('HTTP_RANGE_INVALID', 'HTTP range request was rejected by the server', {
226
+ status: String(response.status)
227
+ });
228
+ }
229
+ if (response.status !== 206) {
230
+ await rejectFromHeaders('HTTP_BAD_RESPONSE', `Unexpected HTTP status ${response.status}`);
231
+ }
232
+ try {
233
+ ensureIdentityEncoding(this.url, response, `${start}-${end}`);
234
+ this.applyValidators(response);
235
+ }
236
+ catch (err) {
237
+ await abortResponse(response, requestController);
238
+ throw err;
239
+ }
240
+ const contentRangeHeader = response.headers.get('content-range');
241
+ if (!contentRangeHeader) {
242
+ await rejectFromHeaders('HTTP_RANGE_INVALID', 'Missing Content-Range header', {
243
+ range: `${start}-${end}`
244
+ });
245
+ }
246
+ const contentRange = contentRangeHeader;
247
+ const parsedContentRange = parseContentRange(contentRange.trim());
248
+ if (!parsedContentRange) {
249
+ await rejectFromHeaders('HTTP_RANGE_INVALID', 'Malformed Content-Range header', {
250
+ contentRange
251
+ });
252
+ }
253
+ const parsedRange = parsedContentRange;
254
+ if (parsedRange.start !== start || parsedRange.end !== end) {
255
+ await rejectFromHeaders('HTTP_RANGE_INVALID', 'Content-Range does not match requested range', {
256
+ requested: `${start}-${end}`,
257
+ actual: `${parsedRange.start}-${parsedRange.end}`
258
+ });
259
+ }
260
+ if (parsedRange.size === undefined) {
261
+ if (options.shouldExpectTotalSize) {
262
+ await rejectFromHeaders('HTTP_SIZE_UNKNOWN', 'Unable to determine remote size from Content-Range');
263
+ }
264
+ await rejectFromHeaders('HTTP_RANGE_INVALID', 'Content-Range did not include a total size', {
265
+ contentRange
266
+ });
267
+ }
268
+ const parsedSize = parsedRange.size;
269
+ if (this.resolvedSizeBytes !== undefined && parsedSize !== this.resolvedSizeBytes) {
270
+ await rejectFromHeaders('HTTP_RESOURCE_CHANGED', 'Remote resource changed during range session', {
271
+ expectedSize: this.resolvedSizeBytes.toString(),
272
+ actualSize: parsedSize.toString()
273
+ });
274
+ }
275
+ const expectedLength = Number(parsedRange.end - parsedRange.start + 1n);
276
+ if (!Number.isFinite(expectedLength) || expectedLength < 0) {
277
+ await rejectFromHeaders('HTTP_RANGE_INVALID', 'Content-Range produced an invalid length', {
278
+ contentRange
279
+ });
280
+ }
281
+ const contentLengthHeader = response.headers.get('content-length');
282
+ if (contentLengthHeader !== null) {
283
+ if (!/^\d+$/.test(contentLengthHeader.trim())) {
284
+ await rejectFromHeaders('HTTP_BAD_RESPONSE', 'Invalid Content-Length header on HTTP range response', {
285
+ contentLength: contentLengthHeader
286
+ });
287
+ }
288
+ const parsedContentLength = Number(contentLengthHeader);
289
+ if (!Number.isSafeInteger(parsedContentLength) || parsedContentLength < 0) {
290
+ await rejectFromHeaders('HTTP_BAD_RESPONSE', 'Invalid Content-Length header on HTTP range response', {
291
+ contentLength: contentLengthHeader
292
+ });
293
+ }
294
+ if (parsedContentLength !== expectedLength) {
295
+ await rejectFromHeaders('HTTP_BAD_RESPONSE', 'Content-Length does not match requested range', {
296
+ expectedLength: String(expectedLength),
297
+ contentLength: String(parsedContentLength)
298
+ });
299
+ }
300
+ }
301
+ try {
302
+ const data = await readExpectedBodyBytes(response, expectedLength, requestController, `${start}-${end}`, contentRange);
303
+ return { data, size: parsedSize };
304
+ }
305
+ catch (err) {
306
+ if (err instanceof HttpError)
307
+ throw err;
308
+ await abortResponse(response, requestController).catch(() => { });
309
+ if (isLikelyContentEncodingError(err)) {
310
+ throw new HttpError('HTTP_CONTENT_ENCODING', 'Content-Encoding is not allowed for seekable HTTP range sessions', {
311
+ context: { url: this.url, contentEncoding: 'unknown', requestedRange: `${start}-${end}` }
312
+ });
313
+ }
314
+ throw new HttpError('HTTP_BAD_RESPONSE', 'Failed to read HTTP range response body', {
315
+ context: { requestedRange: `${start}-${end}` },
316
+ ...(err instanceof Error ? { cause: err } : {})
317
+ });
318
+ }
319
+ }
320
+ buildIfRangeHeader() {
321
+ if (this.pinnedEtag && isStrongEtag(this.pinnedEtag)) {
322
+ return this.pinnedEtag;
323
+ }
324
+ return undefined;
325
+ }
326
+ applyValidators(response) {
327
+ const mismatch = this.findValidatorMismatch(response);
328
+ if (mismatch) {
329
+ throw new HttpError('HTTP_RESOURCE_CHANGED', 'Remote resource changed during range session', {
330
+ context: mismatch
331
+ });
332
+ }
333
+ const etag = response.headers.get('etag');
334
+ if (etag && !this.pinnedEtag) {
335
+ this.pinnedEtag = etag;
336
+ }
337
+ const lastModified = response.headers.get('last-modified');
338
+ if (lastModified && !this.pinnedLastModified) {
339
+ this.pinnedLastModified = lastModified;
340
+ }
341
+ this.enforceStrongEtag(response);
342
+ }
343
+ findValidatorMismatch(response) {
344
+ const context = {};
345
+ const etag = response.headers.get('etag');
346
+ if (etag && this.pinnedEtag && etag !== this.pinnedEtag) {
347
+ context.expectedEtag = this.pinnedEtag;
348
+ context.actualEtag = etag;
349
+ }
350
+ const lastModified = response.headers.get('last-modified');
351
+ if (lastModified && this.pinnedLastModified && lastModified !== this.pinnedLastModified) {
352
+ context.expectedLastModified = this.pinnedLastModified;
353
+ context.actualLastModified = lastModified;
354
+ }
355
+ return Object.keys(context).length > 0 ? context : null;
356
+ }
357
+ enforceStrongEtag(response) {
358
+ if (this.snapshotPolicy !== 'require-strong-etag')
359
+ return;
360
+ const etag = response.headers.get('etag');
361
+ const hasStrongPinnedEtag = this.pinnedEtag ? isStrongEtag(this.pinnedEtag) : false;
362
+ const hasStrongCurrentEtag = etag ? isStrongEtag(etag) : false;
363
+ if (hasStrongPinnedEtag || hasStrongCurrentEtag)
364
+ return;
365
+ throw new HttpError('HTTP_STRONG_ETAG_REQUIRED', 'Strong ETag required for HTTP snapshot consistency', {
366
+ context: { url: this.url }
367
+ });
368
+ }
369
+ }
370
+ async function readExpectedBodyBytes(response, expectedLength, requestController, requestedRange, contentRange) {
371
+ const body = response.body;
372
+ if (!body) {
373
+ await abortResponse(response, requestController);
374
+ throw new HttpError('HTTP_BAD_RESPONSE', 'HTTP range response body was missing', {
375
+ context: { requestedRange, contentRange }
376
+ });
377
+ }
378
+ const reader = body.getReader();
379
+ const responseBytes = new Uint8Array(expectedLength);
380
+ let offset = 0;
381
+ try {
382
+ while (offset < expectedLength) {
383
+ const { done, value } = await reader.read();
384
+ if (done) {
385
+ await abortResponse(response, requestController);
386
+ throw new HttpError('HTTP_BAD_RESPONSE', 'HTTP range response body was shorter than expected', {
387
+ context: {
388
+ requestedRange,
389
+ contentRange,
390
+ expectedLength: String(expectedLength),
391
+ actualLength: String(offset)
392
+ }
393
+ });
394
+ }
395
+ if (!value || value.length === 0)
396
+ continue;
397
+ const remaining = expectedLength - offset;
398
+ if (value.length > remaining) {
399
+ await abortResponse(response, requestController);
400
+ throw new HttpError('HTTP_BAD_RESPONSE', 'HTTP range response body was longer than expected', {
401
+ context: {
402
+ requestedRange,
403
+ contentRange,
404
+ expectedLength: String(expectedLength),
405
+ actualLength: String(offset + value.length)
406
+ }
407
+ });
408
+ }
409
+ responseBytes.set(value, offset);
410
+ offset += value.length;
411
+ }
412
+ const trailingRead = await reader.read();
413
+ if (!trailingRead.done && trailingRead.value && trailingRead.value.length > 0) {
414
+ await abortResponse(response, requestController);
415
+ throw new HttpError('HTTP_BAD_RESPONSE', 'HTTP range response body was longer than expected', {
416
+ context: {
417
+ requestedRange,
418
+ contentRange,
419
+ expectedLength: String(expectedLength),
420
+ actualLength: String(expectedLength + trailingRead.value.length)
421
+ }
422
+ });
423
+ }
424
+ return responseBytes;
425
+ }
426
+ catch (err) {
427
+ if (err instanceof HttpError)
428
+ throw err;
429
+ if (isLikelyContentEncodingError(err)) {
430
+ throw new HttpError('HTTP_CONTENT_ENCODING', 'Content-Encoding is not allowed for seekable HTTP range sessions', {
431
+ context: { url: response.url, contentEncoding: 'unknown', requestedRange }
432
+ });
433
+ }
434
+ throw err;
435
+ }
436
+ finally {
437
+ try {
438
+ reader.releaseLock();
439
+ }
440
+ catch {
441
+ // ignore release errors
442
+ }
443
+ }
444
+ }
445
+ async function abortResponse(response, requestController) {
446
+ try {
447
+ requestController.abort(new DOMException('HTTP range response rejected', 'AbortError'));
448
+ }
449
+ catch {
450
+ // ignore abort errors
451
+ }
452
+ await cancelResponseBody(response);
453
+ }
454
+ function parseContentRange(header) {
455
+ const match = /^bytes\s+(\d+)-(\d+)\/(\d+|\*)$/i.exec(header);
456
+ if (!match)
457
+ return null;
458
+ const start = BigInt(match[1]);
459
+ const end = BigInt(match[2]);
460
+ if (end < start)
461
+ return null;
462
+ const sizeText = match[3];
463
+ let size;
464
+ if (sizeText !== '*') {
465
+ size = BigInt(sizeText);
466
+ if (size <= end)
467
+ return null;
468
+ }
469
+ if (size === undefined) {
470
+ return { start, end };
471
+ }
472
+ return { start, end, size };
473
+ }
474
+ function applyAcceptEncoding(headers) {
475
+ headers.delete('accept-encoding');
476
+ headers.set('Accept-Encoding', 'identity');
477
+ }
478
+ function ensureIdentityEncoding(url, response, requestedRange) {
479
+ const encoding = response.headers.get('content-encoding');
480
+ if (!encoding)
481
+ return;
482
+ const normalized = encoding.trim().toLowerCase();
483
+ if (normalized === '' || normalized === 'identity')
484
+ return;
485
+ throw new HttpError('HTTP_CONTENT_ENCODING', 'Content-Encoding is not allowed for seekable HTTP range sessions', {
486
+ context: { url, contentEncoding: encoding, requestedRange }
487
+ });
488
+ }
489
+ function isStrongEtag(etag) {
490
+ const trimmed = etag.trimStart();
491
+ if (trimmed === '*')
492
+ return false;
493
+ return !/^w\//i.test(trimmed);
494
+ }
495
+ function isLikelyContentEncodingError(err) {
496
+ if (!err || typeof err !== 'object')
497
+ return false;
498
+ const message = err.message;
499
+ if (typeof message !== 'string')
500
+ return false;
501
+ const lower = message.toLowerCase();
502
+ return (lower.includes('gzip') ||
503
+ lower.includes('zlib') ||
504
+ (lower.includes('content') && lower.includes('encoding')) ||
505
+ lower.includes('decompress'));
506
+ }
507
+ function isNodeRuntime() {
508
+ const proc = typeof process !== 'undefined' ? process : undefined;
509
+ const hasNode = !!proc?.versions?.node;
510
+ const isBun = typeof globalThis.Bun !== 'undefined';
511
+ const isDeno = typeof globalThis.Deno !== 'undefined';
512
+ return hasNode && !isBun && !isDeno;
513
+ }
514
+ async function cancelResponseBody(response) {
515
+ const body = response.body;
516
+ if (!body)
517
+ return;
518
+ try {
519
+ await body.cancel();
520
+ }
521
+ catch {
522
+ // ignore cancellation errors
523
+ }
524
+ }
525
+ function minBigInt(a, b) {
526
+ return a < b ? a : b;
527
+ }
528
+ //# sourceMappingURL=RandomAccess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RandomAccess.js","sourceRoot":"","sources":["../../src/reader/RandomAccess.ts"],"names":[],"mappings":"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"}