@loaders.gl/zip 4.0.0-alpha.18 → 4.0.0-alpha.20

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 (68) hide show
  1. package/dist/dist.min.js +263 -1
  2. package/dist/es5/hash-file-utility.js +50 -0
  3. package/dist/es5/hash-file-utility.js.map +1 -0
  4. package/dist/es5/index.js +66 -0
  5. package/dist/es5/index.js.map +1 -1
  6. package/dist/es5/parse-zip/cd-file-header.js +121 -0
  7. package/dist/es5/parse-zip/cd-file-header.js.map +1 -0
  8. package/dist/es5/parse-zip/data-view-file.js +129 -0
  9. package/dist/es5/parse-zip/data-view-file.js.map +1 -0
  10. package/dist/es5/parse-zip/end-of-central-directory.js +100 -0
  11. package/dist/es5/parse-zip/end-of-central-directory.js.map +1 -0
  12. package/dist/es5/parse-zip/file-provider.js +2 -0
  13. package/dist/es5/parse-zip/file-provider.js.map +1 -0
  14. package/dist/es5/parse-zip/local-file-header.js +113 -0
  15. package/dist/es5/parse-zip/local-file-header.js.map +1 -0
  16. package/dist/es5/parse-zip/search-from-the-end.js +69 -0
  17. package/dist/es5/parse-zip/search-from-the-end.js.map +1 -0
  18. package/dist/es5/zip-loader.js +1 -1
  19. package/dist/esm/hash-file-utility.js +41 -0
  20. package/dist/esm/hash-file-utility.js.map +1 -0
  21. package/dist/esm/index.js +6 -0
  22. package/dist/esm/index.js.map +1 -1
  23. package/dist/esm/parse-zip/cd-file-header.js +45 -0
  24. package/dist/esm/parse-zip/cd-file-header.js.map +1 -0
  25. package/dist/esm/parse-zip/data-view-file.js +32 -0
  26. package/dist/esm/parse-zip/data-view-file.js.map +1 -0
  27. package/dist/esm/parse-zip/end-of-central-directory.js +33 -0
  28. package/dist/esm/parse-zip/end-of-central-directory.js.map +1 -0
  29. package/dist/esm/parse-zip/file-provider.js +2 -0
  30. package/dist/esm/parse-zip/file-provider.js.map +1 -0
  31. package/dist/esm/parse-zip/local-file-header.js +40 -0
  32. package/dist/esm/parse-zip/local-file-header.js.map +1 -0
  33. package/dist/esm/parse-zip/search-from-the-end.js +16 -0
  34. package/dist/esm/parse-zip/search-from-the-end.js.map +1 -0
  35. package/dist/esm/zip-loader.js +1 -1
  36. package/dist/hash-file-utility.d.ts +28 -0
  37. package/dist/hash-file-utility.d.ts.map +1 -0
  38. package/dist/hash-file-utility.js +65 -0
  39. package/dist/index.d.ts +8 -0
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +17 -1
  42. package/dist/parse-zip/cd-file-header.d.ts +31 -0
  43. package/dist/parse-zip/cd-file-header.d.ts.map +1 -0
  44. package/dist/parse-zip/cd-file-header.js +55 -0
  45. package/dist/parse-zip/data-view-file.d.ts +36 -0
  46. package/dist/parse-zip/data-view-file.d.ts.map +1 -0
  47. package/dist/parse-zip/data-view-file.js +61 -0
  48. package/dist/parse-zip/end-of-central-directory.d.ts +18 -0
  49. package/dist/parse-zip/end-of-central-directory.d.ts.map +1 -0
  50. package/dist/parse-zip/end-of-central-directory.js +41 -0
  51. package/dist/parse-zip/file-provider.d.ts +36 -0
  52. package/dist/parse-zip/file-provider.d.ts.map +1 -0
  53. package/dist/parse-zip/file-provider.js +2 -0
  54. package/dist/parse-zip/local-file-header.d.ts +27 -0
  55. package/dist/parse-zip/local-file-header.d.ts.map +1 -0
  56. package/dist/parse-zip/local-file-header.js +53 -0
  57. package/dist/parse-zip/search-from-the-end.d.ts +11 -0
  58. package/dist/parse-zip/search-from-the-end.d.ts.map +1 -0
  59. package/dist/parse-zip/search-from-the-end.js +31 -0
  60. package/package.json +2 -2
  61. package/src/hash-file-utility.ts +79 -0
  62. package/src/index.ts +13 -0
  63. package/src/parse-zip/cd-file-header.ts +106 -0
  64. package/src/parse-zip/data-view-file.ts +69 -0
  65. package/src/parse-zip/end-of-central-directory.ts +78 -0
  66. package/src/parse-zip/file-provider.ts +40 -0
  67. package/src/parse-zip/local-file-header.ts +91 -0
  68. package/src/parse-zip/search-from-the-end.ts +38 -0
package/dist/dist.min.js CHANGED
@@ -3027,18 +3027,280 @@
3027
3027
  }
3028
3028
  });
3029
3029
 
3030
+ // src/parse-zip/cd-file-header.ts
3031
+ var offsets, signature, parseZipCDFileHeader;
3032
+ var init_cd_file_header = __esm({
3033
+ "src/parse-zip/cd-file-header.ts"() {
3034
+ offsets = {
3035
+ CD_COMPRESSED_SIZE_OFFSET: 20n,
3036
+ CD_UNCOMPRESSED_SIZE_OFFSET: 24n,
3037
+ CD_FILE_NAME_LENGTH_OFFSET: 28n,
3038
+ CD_EXTRA_FIELD_LENGTH_OFFSET: 30n,
3039
+ CD_LOCAL_HEADER_OFFSET_OFFSET: 42n,
3040
+ CD_FILE_NAME_OFFSET: 46n
3041
+ };
3042
+ signature = [80, 75, 1, 2];
3043
+ parseZipCDFileHeader = async (headerOffset, buffer) => {
3044
+ if (Buffer.from(await buffer.slice(headerOffset, headerOffset + 4n)).compare(Buffer.from(signature)) !== 0) {
3045
+ return null;
3046
+ }
3047
+ let compressedSize = BigInt(await buffer.getUint32(headerOffset + offsets.CD_COMPRESSED_SIZE_OFFSET));
3048
+ let uncompressedSize = BigInt(await buffer.getUint32(headerOffset + offsets.CD_UNCOMPRESSED_SIZE_OFFSET));
3049
+ const extraFieldLength = await buffer.getUint16(headerOffset + offsets.CD_EXTRA_FIELD_LENGTH_OFFSET);
3050
+ const fileNameLength = await buffer.getUint16(headerOffset + offsets.CD_FILE_NAME_LENGTH_OFFSET);
3051
+ const fileName = new TextDecoder().decode(await buffer.slice(headerOffset + offsets.CD_FILE_NAME_OFFSET, headerOffset + offsets.CD_FILE_NAME_OFFSET + BigInt(fileNameLength)));
3052
+ const extraOffset = headerOffset + offsets.CD_FILE_NAME_OFFSET + BigInt(fileNameLength);
3053
+ const oldFormatOffset = await buffer.getUint32(headerOffset + offsets.CD_LOCAL_HEADER_OFFSET_OFFSET);
3054
+ let fileDataOffset = BigInt(oldFormatOffset);
3055
+ let offsetInZip64Data = 4n;
3056
+ if (uncompressedSize === BigInt(4294967295)) {
3057
+ uncompressedSize = await buffer.getBigUint64(extraOffset + offsetInZip64Data);
3058
+ offsetInZip64Data += 8n;
3059
+ }
3060
+ if (compressedSize === BigInt(4294967295)) {
3061
+ compressedSize = await buffer.getBigUint64(extraOffset + offsetInZip64Data);
3062
+ offsetInZip64Data += 8n;
3063
+ }
3064
+ if (fileDataOffset === BigInt(4294967295)) {
3065
+ fileDataOffset = await buffer.getBigUint64(extraOffset + offsetInZip64Data);
3066
+ }
3067
+ const localHeaderOffset = fileDataOffset;
3068
+ return {
3069
+ compressedSize,
3070
+ uncompressedSize,
3071
+ extraFieldLength,
3072
+ fileNameLength,
3073
+ fileName,
3074
+ extraOffset,
3075
+ localHeaderOffset
3076
+ };
3077
+ };
3078
+ }
3079
+ });
3080
+
3081
+ // src/parse-zip/local-file-header.ts
3082
+ var offsets2, signature2, parseZipLocalFileHeader;
3083
+ var init_local_file_header = __esm({
3084
+ "src/parse-zip/local-file-header.ts"() {
3085
+ offsets2 = {
3086
+ COMPRESSED_SIZE_OFFSET: 18n,
3087
+ UNCOMPRESSED_SIZE_OFFSET: 22n,
3088
+ FILE_NAME_LENGTH_OFFSET: 26n,
3089
+ EXTRA_FIELD_LENGTH_OFFSET: 28n,
3090
+ FILE_NAME_OFFSET: 30n
3091
+ };
3092
+ signature2 = Buffer.from([80, 75, 3, 4]);
3093
+ parseZipLocalFileHeader = async (headerOffset, buffer) => {
3094
+ if (Buffer.from(await buffer.slice(headerOffset, headerOffset + 4n)).compare(signature2) !== 0) {
3095
+ return null;
3096
+ }
3097
+ const fileNameLength = await buffer.getUint16(headerOffset + offsets2.FILE_NAME_LENGTH_OFFSET);
3098
+ const fileName = new TextDecoder().decode(await buffer.slice(headerOffset + offsets2.FILE_NAME_OFFSET, headerOffset + offsets2.FILE_NAME_OFFSET + BigInt(fileNameLength))).split("\\").join("/");
3099
+ const extraFieldLength = await buffer.getUint16(headerOffset + offsets2.EXTRA_FIELD_LENGTH_OFFSET);
3100
+ let fileDataOffset = headerOffset + offsets2.FILE_NAME_OFFSET + BigInt(fileNameLength + extraFieldLength);
3101
+ let compressedSize = BigInt(await buffer.getUint32(headerOffset + offsets2.COMPRESSED_SIZE_OFFSET));
3102
+ let uncompressedSize = BigInt(await buffer.getUint32(headerOffset + offsets2.UNCOMPRESSED_SIZE_OFFSET));
3103
+ const extraOffset = headerOffset + offsets2.FILE_NAME_OFFSET + BigInt(fileNameLength);
3104
+ let offsetInZip64Data = 4n;
3105
+ if (uncompressedSize === BigInt(4294967295)) {
3106
+ uncompressedSize = await buffer.getBigUint64(extraOffset + offsetInZip64Data);
3107
+ offsetInZip64Data += 8n;
3108
+ }
3109
+ if (compressedSize === BigInt(4294967295)) {
3110
+ compressedSize = await buffer.getBigUint64(extraOffset + offsetInZip64Data);
3111
+ offsetInZip64Data += 8n;
3112
+ }
3113
+ if (fileDataOffset === BigInt(4294967295)) {
3114
+ fileDataOffset = await buffer.getBigUint64(extraOffset + offsetInZip64Data);
3115
+ }
3116
+ return {
3117
+ fileNameLength,
3118
+ fileName,
3119
+ extraFieldLength,
3120
+ fileDataOffset,
3121
+ compressedSize
3122
+ };
3123
+ };
3124
+ }
3125
+ });
3126
+
3127
+ // src/parse-zip/search-from-the-end.ts
3128
+ var searchFromTheEnd;
3129
+ var init_search_from_the_end = __esm({
3130
+ "src/parse-zip/search-from-the-end.ts"() {
3131
+ searchFromTheEnd = async (file, target) => {
3132
+ const searchWindow = [
3133
+ await file.getUint8(file.length - 1n),
3134
+ await file.getUint8(file.length - 2n),
3135
+ await file.getUint8(file.length - 3n),
3136
+ void 0
3137
+ ];
3138
+ let targetOffset = 0n;
3139
+ for (let i = file.length - 4n; i > -1; i--) {
3140
+ searchWindow[3] = searchWindow[2];
3141
+ searchWindow[2] = searchWindow[1];
3142
+ searchWindow[1] = searchWindow[0];
3143
+ searchWindow[0] = await file.getUint8(i);
3144
+ if (searchWindow.every((val, index) => val === target[index])) {
3145
+ targetOffset = i;
3146
+ break;
3147
+ }
3148
+ }
3149
+ return targetOffset;
3150
+ };
3151
+ }
3152
+ });
3153
+
3154
+ // src/parse-zip/end-of-central-directory.ts
3155
+ var eoCDSignature, zip64EoCDLocatorSignature, zip64EoCDSignature, offsets3, parseEoCDRecord;
3156
+ var init_end_of_central_directory = __esm({
3157
+ "src/parse-zip/end-of-central-directory.ts"() {
3158
+ init_search_from_the_end();
3159
+ eoCDSignature = [80, 75, 5, 6];
3160
+ zip64EoCDLocatorSignature = Buffer.from([80, 75, 6, 7]);
3161
+ zip64EoCDSignature = Buffer.from([80, 75, 6, 6]);
3162
+ offsets3 = {
3163
+ CD_RECORDS_NUMBER_OFFSET: 8n,
3164
+ CD_START_OFFSET_OFFSET: 16n,
3165
+ ZIP64_EOCD_START_OFFSET_OFFSET: 8n,
3166
+ ZIP64_CD_RECORDS_NUMBER_OFFSET: 24n,
3167
+ ZIP64_CD_START_OFFSET_OFFSET: 48n
3168
+ };
3169
+ parseEoCDRecord = async (fileProvider) => {
3170
+ const zipEoCDOffset = await searchFromTheEnd(fileProvider, eoCDSignature);
3171
+ let cdRecordsNumber = BigInt(await fileProvider.getUint16(zipEoCDOffset + offsets3.CD_RECORDS_NUMBER_OFFSET));
3172
+ let cdStartOffset = BigInt(await fileProvider.getUint32(zipEoCDOffset + offsets3.CD_START_OFFSET_OFFSET));
3173
+ if (cdStartOffset === BigInt(4294967295) || cdRecordsNumber === BigInt(4294967295)) {
3174
+ const zip64EoCDLocatorOffset = zipEoCDOffset - 20n;
3175
+ if (Buffer.from(await fileProvider.slice(zip64EoCDLocatorOffset, zip64EoCDLocatorOffset + 4n)).compare(zip64EoCDLocatorSignature) !== 0) {
3176
+ throw new Error("zip64 EoCD locator not found");
3177
+ }
3178
+ const zip64EoCDOffset = await fileProvider.getBigUint64(zip64EoCDLocatorOffset + offsets3.ZIP64_EOCD_START_OFFSET_OFFSET);
3179
+ if (Buffer.from(await fileProvider.slice(zip64EoCDOffset, zip64EoCDOffset + 4n)).compare(zip64EoCDSignature) !== 0) {
3180
+ throw new Error("zip64 EoCD not found");
3181
+ }
3182
+ cdRecordsNumber = await fileProvider.getBigUint64(zip64EoCDOffset + offsets3.ZIP64_CD_RECORDS_NUMBER_OFFSET);
3183
+ cdStartOffset = await fileProvider.getBigUint64(zip64EoCDOffset + offsets3.ZIP64_CD_START_OFFSET_OFFSET);
3184
+ }
3185
+ return {
3186
+ cdRecordsNumber,
3187
+ cdStartOffset
3188
+ };
3189
+ };
3190
+ }
3191
+ });
3192
+
3193
+ // src/parse-zip/data-view-file.ts
3194
+ var toNumber, DataViewFile;
3195
+ var init_data_view_file = __esm({
3196
+ "src/parse-zip/data-view-file.ts"() {
3197
+ toNumber = (bigint) => {
3198
+ if (bigint > Number.MAX_SAFE_INTEGER) {
3199
+ throw new Error("Offset is out of bounds");
3200
+ }
3201
+ return Number(bigint);
3202
+ };
3203
+ DataViewFile = class {
3204
+ constructor(file) {
3205
+ this.file = file;
3206
+ }
3207
+ async getUint8(offset) {
3208
+ return this.file.getUint8(toNumber(offset));
3209
+ }
3210
+ async getUint16(offset) {
3211
+ return this.file.getUint16(toNumber(offset), true);
3212
+ }
3213
+ async getUint32(offset) {
3214
+ return this.file.getUint32(toNumber(offset), true);
3215
+ }
3216
+ async getBigUint64(offset) {
3217
+ return this.file.getBigUint64(toNumber(offset), true);
3218
+ }
3219
+ async slice(startOffset, endOffset) {
3220
+ return this.file.buffer.slice(toNumber(startOffset), toNumber(endOffset));
3221
+ }
3222
+ get length() {
3223
+ return BigInt(this.file.byteLength);
3224
+ }
3225
+ };
3226
+ }
3227
+ });
3228
+
3229
+ // src/hash-file-utility.ts
3230
+ var compareHashes, parseHashFile, findBin;
3231
+ var init_hash_file_utility = __esm({
3232
+ "src/hash-file-utility.ts"() {
3233
+ compareHashes = (hash1, hash2) => {
3234
+ const h1 = new BigUint64Array(hash1.buffer, hash1.byteOffset, 2);
3235
+ const h2 = new BigUint64Array(hash2.buffer, hash2.byteOffset, 2);
3236
+ const diff = h1[0] === h2[0] ? h1[1] - h2[1] : h1[0] - h2[0];
3237
+ if (diff < 0n) {
3238
+ return -1;
3239
+ } else if (diff === 0n) {
3240
+ return 0;
3241
+ }
3242
+ return 1;
3243
+ };
3244
+ parseHashFile = (hashFile) => {
3245
+ const hashFileBuffer = Buffer.from(hashFile);
3246
+ const hashArray = [];
3247
+ for (let i = 0; i < hashFileBuffer.buffer.byteLength; i = i + 24) {
3248
+ const offsetBuffer = new DataView(hashFileBuffer.buffer.slice(hashFileBuffer.byteOffset + i + 16, hashFileBuffer.byteOffset + i + 24));
3249
+ const offset = offsetBuffer.getBigUint64(offsetBuffer.byteOffset, true);
3250
+ hashArray.push({
3251
+ hash: Buffer.from(hashFileBuffer.subarray(hashFileBuffer.byteOffset + i, hashFileBuffer.byteOffset + i + 16)),
3252
+ offset
3253
+ });
3254
+ }
3255
+ return hashArray;
3256
+ };
3257
+ findBin = (hashToSearch, hashArray) => {
3258
+ let lowerBorder = 0;
3259
+ let upperBorder = hashArray.length;
3260
+ while (upperBorder - lowerBorder > 1) {
3261
+ const middle = lowerBorder + Math.floor((upperBorder - lowerBorder) / 2);
3262
+ const value = compareHashes(hashArray[middle].hash, hashToSearch);
3263
+ if (value === 0) {
3264
+ return hashArray[middle];
3265
+ } else if (value < 0) {
3266
+ lowerBorder = middle;
3267
+ } else {
3268
+ upperBorder = middle;
3269
+ }
3270
+ }
3271
+ return void 0;
3272
+ };
3273
+ }
3274
+ });
3275
+
3030
3276
  // src/index.ts
3031
3277
  var src_exports = {};
3032
3278
  __export(src_exports, {
3279
+ DataViewFile: () => DataViewFile,
3033
3280
  TarBuilder: () => TARBuilder,
3034
3281
  ZipLoader: () => ZipLoader,
3035
- ZipWriter: () => ZipWriter
3282
+ ZipWriter: () => ZipWriter,
3283
+ cdSignature: () => signature,
3284
+ compareHashes: () => compareHashes,
3285
+ findBin: () => findBin,
3286
+ localHeaderSignature: () => signature2,
3287
+ parseEoCDRecord: () => parseEoCDRecord,
3288
+ parseHashFile: () => parseHashFile,
3289
+ parseZipCDFileHeader: () => parseZipCDFileHeader,
3290
+ parseZipLocalFileHeader: () => parseZipLocalFileHeader,
3291
+ searchFromTheEnd: () => searchFromTheEnd
3036
3292
  });
3037
3293
  var init_src = __esm({
3038
3294
  "src/index.ts"() {
3039
3295
  init_zip_loader();
3040
3296
  init_zip_writer();
3041
3297
  init_tar_builder();
3298
+ init_cd_file_header();
3299
+ init_local_file_header();
3300
+ init_end_of_central_directory();
3301
+ init_search_from_the_end();
3302
+ init_data_view_file();
3303
+ init_hash_file_utility();
3042
3304
  }
3043
3305
  });
3044
3306
 
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.parseHashFile = exports.findBin = exports.compareHashes = void 0;
7
+ var compareHashes = function compareHashes(hash1, hash2) {
8
+ var h1 = new BigUint64Array(hash1.buffer, hash1.byteOffset, 2);
9
+ var h2 = new BigUint64Array(hash2.buffer, hash2.byteOffset, 2);
10
+ var diff = h1[0] === h2[0] ? h1[1] - h2[1] : h1[0] - h2[0];
11
+ if (diff < 0n) {
12
+ return -1;
13
+ } else if (diff === 0n) {
14
+ return 0;
15
+ }
16
+ return 1;
17
+ };
18
+ exports.compareHashes = compareHashes;
19
+ var parseHashFile = function parseHashFile(hashFile) {
20
+ var hashFileBuffer = Buffer.from(hashFile);
21
+ var hashArray = [];
22
+ for (var i = 0; i < hashFileBuffer.buffer.byteLength; i = i + 24) {
23
+ var offsetBuffer = new DataView(hashFileBuffer.buffer.slice(hashFileBuffer.byteOffset + i + 16, hashFileBuffer.byteOffset + i + 24));
24
+ var offset = offsetBuffer.getBigUint64(offsetBuffer.byteOffset, true);
25
+ hashArray.push({
26
+ hash: Buffer.from(hashFileBuffer.subarray(hashFileBuffer.byteOffset + i, hashFileBuffer.byteOffset + i + 16)),
27
+ offset: offset
28
+ });
29
+ }
30
+ return hashArray;
31
+ };
32
+ exports.parseHashFile = parseHashFile;
33
+ var findBin = function findBin(hashToSearch, hashArray) {
34
+ var lowerBorder = 0;
35
+ var upperBorder = hashArray.length;
36
+ while (upperBorder - lowerBorder > 1) {
37
+ var middle = lowerBorder + Math.floor((upperBorder - lowerBorder) / 2);
38
+ var value = compareHashes(hashArray[middle].hash, hashToSearch);
39
+ if (value === 0) {
40
+ return hashArray[middle];
41
+ } else if (value < 0) {
42
+ lowerBorder = middle;
43
+ } else {
44
+ upperBorder = middle;
45
+ }
46
+ }
47
+ return undefined;
48
+ };
49
+ exports.findBin = findBin;
50
+ //# sourceMappingURL=hash-file-utility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash-file-utility.js","names":["compareHashes","hash1","hash2","h1","BigUint64Array","buffer","byteOffset","h2","diff","exports","parseHashFile","hashFile","hashFileBuffer","Buffer","from","hashArray","i","byteLength","offsetBuffer","DataView","slice","offset","getBigUint64","push","hash","subarray","findBin","hashToSearch","lowerBorder","upperBorder","length","middle","Math","floor","value","undefined"],"sources":["../../src/hash-file-utility.ts"],"sourcesContent":["/** Element of hash array */\nexport type HashElement = {\n /** File name hash */\n hash: Buffer;\n /** File offset in the archive */\n offset: bigint;\n};\n\n/**\n * Comparing md5 hashes according to https://github.com/Esri/i3s-spec/blob/master/docs/2.0/slpk_hashtable.pcsl.md step 5\n * @param hash1 hash to compare\n * @param hash2 hash to compare\n * @returns -1 if hash1 < hash2, 0 of hash1 === hash2, 1 if hash1 > hash2\n */\nexport const compareHashes = (hash1: Buffer, hash2: Buffer): number => {\n const h1 = new BigUint64Array(hash1.buffer, hash1.byteOffset, 2);\n const h2 = new BigUint64Array(hash2.buffer, hash2.byteOffset, 2);\n\n const diff = h1[0] === h2[0] ? h1[1] - h2[1] : h1[0] - h2[0];\n\n if (diff < 0n) {\n return -1;\n } else if (diff === 0n) {\n return 0;\n }\n return 1;\n};\n\n/**\n * Reads hash file from buffer and returns it in ready-to-use form\n * @param hashFile - bufer containing hash file\n * @returns Array containing file info\n */\nexport const parseHashFile = (hashFile: ArrayBuffer): HashElement[] => {\n const hashFileBuffer = Buffer.from(hashFile);\n const hashArray: HashElement[] = [];\n for (let i = 0; i < hashFileBuffer.buffer.byteLength; i = i + 24) {\n const offsetBuffer = new DataView(\n hashFileBuffer.buffer.slice(\n hashFileBuffer.byteOffset + i + 16,\n hashFileBuffer.byteOffset + i + 24\n )\n );\n const offset = offsetBuffer.getBigUint64(offsetBuffer.byteOffset, true);\n hashArray.push({\n hash: Buffer.from(\n hashFileBuffer.subarray(hashFileBuffer.byteOffset + i, hashFileBuffer.byteOffset + i + 16)\n ),\n offset\n });\n }\n return hashArray;\n};\n\n/**\n * Binary search in the hash info\n * @param hashToSearch hash that we need to find\n * @returns required hash element or undefined if not found\n */\nexport const findBin = (\n hashToSearch: Buffer,\n hashArray: HashElement[]\n): HashElement | undefined => {\n let lowerBorder = 0;\n let upperBorder = hashArray.length;\n\n while (upperBorder - lowerBorder > 1) {\n const middle = lowerBorder + Math.floor((upperBorder - lowerBorder) / 2);\n const value = compareHashes(hashArray[middle].hash, hashToSearch);\n if (value === 0) {\n return hashArray[middle];\n } else if (value < 0) {\n lowerBorder = middle;\n } else {\n upperBorder = middle;\n }\n }\n return undefined;\n};\n"],"mappings":";;;;;;AAcO,IAAMA,aAAa,GAAG,SAAhBA,aAAaA,CAAIC,KAAa,EAAEC,KAAa,EAAa;EACrE,IAAMC,EAAE,GAAG,IAAIC,cAAc,CAACH,KAAK,CAACI,MAAM,EAAEJ,KAAK,CAACK,UAAU,EAAE,CAAC,CAAC;EAChE,IAAMC,EAAE,GAAG,IAAIH,cAAc,CAACF,KAAK,CAACG,MAAM,EAAEH,KAAK,CAACI,UAAU,EAAE,CAAC,CAAC;EAEhE,IAAME,IAAI,GAAGL,EAAE,CAAC,CAAC,CAAC,KAAKI,EAAE,CAAC,CAAC,CAAC,GAAGJ,EAAE,CAAC,CAAC,CAAC,GAAGI,EAAE,CAAC,CAAC,CAAC,GAAGJ,EAAE,CAAC,CAAC,CAAC,GAAGI,EAAE,CAAC,CAAC,CAAC;EAE5D,IAAIC,IAAI,GAAG,EAAE,EAAE;IACb,OAAO,CAAC,CAAC;EACX,CAAC,MAAM,IAAIA,IAAI,KAAK,EAAE,EAAE;IACtB,OAAO,CAAC;EACV;EACA,OAAO,CAAC;AACV,CAAC;AAACC,OAAA,CAAAT,aAAA,GAAAA,aAAA;AAOK,IAAMU,aAAa,GAAG,SAAhBA,aAAaA,CAAIC,QAAqB,EAAoB;EACrE,IAAMC,cAAc,GAAGC,MAAM,CAACC,IAAI,CAACH,QAAQ,CAAC;EAC5C,IAAMI,SAAwB,GAAG,EAAE;EACnC,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,cAAc,CAACP,MAAM,CAACY,UAAU,EAAED,CAAC,GAAGA,CAAC,GAAG,EAAE,EAAE;IAChE,IAAME,YAAY,GAAG,IAAIC,QAAQ,CAC/BP,cAAc,CAACP,MAAM,CAACe,KAAK,CACzBR,cAAc,CAACN,UAAU,GAAGU,CAAC,GAAG,EAAE,EAClCJ,cAAc,CAACN,UAAU,GAAGU,CAAC,GAAG,EAClC,CACF,CAAC;IACD,IAAMK,MAAM,GAAGH,YAAY,CAACI,YAAY,CAACJ,YAAY,CAACZ,UAAU,EAAE,IAAI,CAAC;IACvES,SAAS,CAACQ,IAAI,CAAC;MACbC,IAAI,EAAEX,MAAM,CAACC,IAAI,CACfF,cAAc,CAACa,QAAQ,CAACb,cAAc,CAACN,UAAU,GAAGU,CAAC,EAAEJ,cAAc,CAACN,UAAU,GAAGU,CAAC,GAAG,EAAE,CAC3F,CAAC;MACDK,MAAM,EAANA;IACF,CAAC,CAAC;EACJ;EACA,OAAON,SAAS;AAClB,CAAC;AAACN,OAAA,CAAAC,aAAA,GAAAA,aAAA;AAOK,IAAMgB,OAAO,GAAG,SAAVA,OAAOA,CAClBC,YAAoB,EACpBZ,SAAwB,EACI;EAC5B,IAAIa,WAAW,GAAG,CAAC;EACnB,IAAIC,WAAW,GAAGd,SAAS,CAACe,MAAM;EAElC,OAAOD,WAAW,GAAGD,WAAW,GAAG,CAAC,EAAE;IACpC,IAAMG,MAAM,GAAGH,WAAW,GAAGI,IAAI,CAACC,KAAK,CAAC,CAACJ,WAAW,GAAGD,WAAW,IAAI,CAAC,CAAC;IACxE,IAAMM,KAAK,GAAGlC,aAAa,CAACe,SAAS,CAACgB,MAAM,CAAC,CAACP,IAAI,EAAEG,YAAY,CAAC;IACjE,IAAIO,KAAK,KAAK,CAAC,EAAE;MACf,OAAOnB,SAAS,CAACgB,MAAM,CAAC;IAC1B,CAAC,MAAM,IAAIG,KAAK,GAAG,CAAC,EAAE;MACpBN,WAAW,GAAGG,MAAM;IACtB,CAAC,MAAM;MACLF,WAAW,GAAGE,MAAM;IACtB;EACF;EACA,OAAOI,SAAS;AAClB,CAAC;AAAC1B,OAAA,CAAAiB,OAAA,GAAAA,OAAA"}
package/dist/es5/index.js CHANGED
@@ -4,6 +4,12 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
+ Object.defineProperty(exports, "DataViewFile", {
8
+ enumerable: true,
9
+ get: function get() {
10
+ return _dataViewFile.DataViewFile;
11
+ }
12
+ });
7
13
  Object.defineProperty(exports, "TarBuilder", {
8
14
  enumerable: true,
9
15
  get: function get() {
@@ -22,7 +28,67 @@ Object.defineProperty(exports, "ZipWriter", {
22
28
  return _zipWriter.ZipWriter;
23
29
  }
24
30
  });
31
+ Object.defineProperty(exports, "cdSignature", {
32
+ enumerable: true,
33
+ get: function get() {
34
+ return _cdFileHeader.signature;
35
+ }
36
+ });
37
+ Object.defineProperty(exports, "compareHashes", {
38
+ enumerable: true,
39
+ get: function get() {
40
+ return _hashFileUtility.compareHashes;
41
+ }
42
+ });
43
+ Object.defineProperty(exports, "findBin", {
44
+ enumerable: true,
45
+ get: function get() {
46
+ return _hashFileUtility.findBin;
47
+ }
48
+ });
49
+ Object.defineProperty(exports, "localHeaderSignature", {
50
+ enumerable: true,
51
+ get: function get() {
52
+ return _localFileHeader.signature;
53
+ }
54
+ });
55
+ Object.defineProperty(exports, "parseEoCDRecord", {
56
+ enumerable: true,
57
+ get: function get() {
58
+ return _endOfCentralDirectory.parseEoCDRecord;
59
+ }
60
+ });
61
+ Object.defineProperty(exports, "parseHashFile", {
62
+ enumerable: true,
63
+ get: function get() {
64
+ return _hashFileUtility.parseHashFile;
65
+ }
66
+ });
67
+ Object.defineProperty(exports, "parseZipCDFileHeader", {
68
+ enumerable: true,
69
+ get: function get() {
70
+ return _cdFileHeader.parseZipCDFileHeader;
71
+ }
72
+ });
73
+ Object.defineProperty(exports, "parseZipLocalFileHeader", {
74
+ enumerable: true,
75
+ get: function get() {
76
+ return _localFileHeader.parseZipLocalFileHeader;
77
+ }
78
+ });
79
+ Object.defineProperty(exports, "searchFromTheEnd", {
80
+ enumerable: true,
81
+ get: function get() {
82
+ return _searchFromTheEnd.searchFromTheEnd;
83
+ }
84
+ });
25
85
  var _zipLoader = require("./zip-loader");
26
86
  var _zipWriter = require("./zip-writer");
27
87
  var _tarBuilder = _interopRequireDefault(require("./tar-builder"));
88
+ var _cdFileHeader = require("./parse-zip/cd-file-header");
89
+ var _localFileHeader = require("./parse-zip/local-file-header");
90
+ var _endOfCentralDirectory = require("./parse-zip/end-of-central-directory");
91
+ var _searchFromTheEnd = require("./parse-zip/search-from-the-end");
92
+ var _dataViewFile = require("./parse-zip/data-view-file");
93
+ var _hashFileUtility = require("./hash-file-utility");
28
94
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_zipLoader","require","_zipWriter","_tarBuilder","_interopRequireDefault"],"sources":["../../src/index.ts"],"sourcesContent":["export {ZipLoader} from './zip-loader';\nexport {ZipWriter} from './zip-writer';\nexport {default as TarBuilder} from './tar-builder';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,UAAA,GAAAD,OAAA;AACA,IAAAE,WAAA,GAAAC,sBAAA,CAAAH,OAAA"}
1
+ {"version":3,"file":"index.js","names":["_zipLoader","require","_zipWriter","_tarBuilder","_interopRequireDefault","_cdFileHeader","_localFileHeader","_endOfCentralDirectory","_searchFromTheEnd","_dataViewFile","_hashFileUtility"],"sources":["../../src/index.ts"],"sourcesContent":["export {ZipLoader} from './zip-loader';\nexport {ZipWriter} from './zip-writer';\nexport {default as TarBuilder} from './tar-builder';\n\nexport type {FileProvider} from './parse-zip/file-provider';\nexport {parseZipCDFileHeader, signature as cdSignature} from './parse-zip/cd-file-header';\nexport {\n parseZipLocalFileHeader,\n signature as localHeaderSignature\n} from './parse-zip/local-file-header';\nexport {parseEoCDRecord} from './parse-zip/end-of-central-directory';\nexport {searchFromTheEnd} from './parse-zip/search-from-the-end';\nexport {DataViewFile} from './parse-zip/data-view-file';\n\nexport type {HashElement} from './hash-file-utility';\nexport {compareHashes, parseHashFile, findBin} from './hash-file-utility';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,UAAA,GAAAD,OAAA;AACA,IAAAE,WAAA,GAAAC,sBAAA,CAAAH,OAAA;AAGA,IAAAI,aAAA,GAAAJ,OAAA;AACA,IAAAK,gBAAA,GAAAL,OAAA;AAIA,IAAAM,sBAAA,GAAAN,OAAA;AACA,IAAAO,iBAAA,GAAAP,OAAA;AACA,IAAAQ,aAAA,GAAAR,OAAA;AAGA,IAAAS,gBAAA,GAAAT,OAAA"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.signature = exports.parseZipCDFileHeader = void 0;
8
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
+ var offsets = {
11
+ CD_COMPRESSED_SIZE_OFFSET: 20n,
12
+ CD_UNCOMPRESSED_SIZE_OFFSET: 24n,
13
+ CD_FILE_NAME_LENGTH_OFFSET: 28n,
14
+ CD_EXTRA_FIELD_LENGTH_OFFSET: 30n,
15
+ CD_LOCAL_HEADER_OFFSET_OFFSET: 42n,
16
+ CD_FILE_NAME_OFFSET: 46n
17
+ };
18
+ var signature = [0x50, 0x4b, 0x01, 0x02];
19
+ exports.signature = signature;
20
+ var parseZipCDFileHeader = function () {
21
+ var _ref = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(headerOffset, buffer) {
22
+ var compressedSize, uncompressedSize, extraFieldLength, fileNameLength, fileName, extraOffset, oldFormatOffset, fileDataOffset, offsetInZip64Data, localHeaderOffset;
23
+ return _regenerator.default.wrap(function _callee$(_context) {
24
+ while (1) switch (_context.prev = _context.next) {
25
+ case 0:
26
+ _context.t0 = Buffer;
27
+ _context.next = 3;
28
+ return buffer.slice(headerOffset, headerOffset + 4n);
29
+ case 3:
30
+ _context.t1 = _context.sent;
31
+ _context.t2 = _context.t0.from.call(_context.t0, _context.t1).compare(Buffer.from(signature));
32
+ if (!(_context.t2 !== 0)) {
33
+ _context.next = 7;
34
+ break;
35
+ }
36
+ return _context.abrupt("return", null);
37
+ case 7:
38
+ _context.t3 = BigInt;
39
+ _context.next = 10;
40
+ return buffer.getUint32(headerOffset + offsets.CD_COMPRESSED_SIZE_OFFSET);
41
+ case 10:
42
+ _context.t4 = _context.sent;
43
+ compressedSize = (0, _context.t3)(_context.t4);
44
+ _context.t5 = BigInt;
45
+ _context.next = 15;
46
+ return buffer.getUint32(headerOffset + offsets.CD_UNCOMPRESSED_SIZE_OFFSET);
47
+ case 15:
48
+ _context.t6 = _context.sent;
49
+ uncompressedSize = (0, _context.t5)(_context.t6);
50
+ _context.next = 19;
51
+ return buffer.getUint16(headerOffset + offsets.CD_EXTRA_FIELD_LENGTH_OFFSET);
52
+ case 19:
53
+ extraFieldLength = _context.sent;
54
+ _context.next = 22;
55
+ return buffer.getUint16(headerOffset + offsets.CD_FILE_NAME_LENGTH_OFFSET);
56
+ case 22:
57
+ fileNameLength = _context.sent;
58
+ _context.t7 = new TextDecoder();
59
+ _context.next = 26;
60
+ return buffer.slice(headerOffset + offsets.CD_FILE_NAME_OFFSET, headerOffset + offsets.CD_FILE_NAME_OFFSET + BigInt(fileNameLength));
61
+ case 26:
62
+ _context.t8 = _context.sent;
63
+ fileName = _context.t7.decode.call(_context.t7, _context.t8);
64
+ extraOffset = headerOffset + offsets.CD_FILE_NAME_OFFSET + BigInt(fileNameLength);
65
+ _context.next = 31;
66
+ return buffer.getUint32(headerOffset + offsets.CD_LOCAL_HEADER_OFFSET_OFFSET);
67
+ case 31:
68
+ oldFormatOffset = _context.sent;
69
+ fileDataOffset = BigInt(oldFormatOffset);
70
+ offsetInZip64Data = 4n;
71
+ if (!(uncompressedSize === BigInt(0xffffffff))) {
72
+ _context.next = 39;
73
+ break;
74
+ }
75
+ _context.next = 37;
76
+ return buffer.getBigUint64(extraOffset + offsetInZip64Data);
77
+ case 37:
78
+ uncompressedSize = _context.sent;
79
+ offsetInZip64Data += 8n;
80
+ case 39:
81
+ if (!(compressedSize === BigInt(0xffffffff))) {
82
+ _context.next = 44;
83
+ break;
84
+ }
85
+ _context.next = 42;
86
+ return buffer.getBigUint64(extraOffset + offsetInZip64Data);
87
+ case 42:
88
+ compressedSize = _context.sent;
89
+ offsetInZip64Data += 8n;
90
+ case 44:
91
+ if (!(fileDataOffset === BigInt(0xffffffff))) {
92
+ _context.next = 48;
93
+ break;
94
+ }
95
+ _context.next = 47;
96
+ return buffer.getBigUint64(extraOffset + offsetInZip64Data);
97
+ case 47:
98
+ fileDataOffset = _context.sent;
99
+ case 48:
100
+ localHeaderOffset = fileDataOffset;
101
+ return _context.abrupt("return", {
102
+ compressedSize: compressedSize,
103
+ uncompressedSize: uncompressedSize,
104
+ extraFieldLength: extraFieldLength,
105
+ fileNameLength: fileNameLength,
106
+ fileName: fileName,
107
+ extraOffset: extraOffset,
108
+ localHeaderOffset: localHeaderOffset
109
+ });
110
+ case 50:
111
+ case "end":
112
+ return _context.stop();
113
+ }
114
+ }, _callee);
115
+ }));
116
+ return function parseZipCDFileHeader(_x, _x2) {
117
+ return _ref.apply(this, arguments);
118
+ };
119
+ }();
120
+ exports.parseZipCDFileHeader = parseZipCDFileHeader;
121
+ //# sourceMappingURL=cd-file-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cd-file-header.js","names":["offsets","CD_COMPRESSED_SIZE_OFFSET","CD_UNCOMPRESSED_SIZE_OFFSET","CD_FILE_NAME_LENGTH_OFFSET","CD_EXTRA_FIELD_LENGTH_OFFSET","CD_LOCAL_HEADER_OFFSET_OFFSET","CD_FILE_NAME_OFFSET","signature","exports","parseZipCDFileHeader","_ref","_asyncToGenerator2","default","_regenerator","mark","_callee","headerOffset","buffer","compressedSize","uncompressedSize","extraFieldLength","fileNameLength","fileName","extraOffset","oldFormatOffset","fileDataOffset","offsetInZip64Data","localHeaderOffset","wrap","_callee$","_context","prev","next","t0","Buffer","slice","t1","sent","t2","from","call","compare","abrupt","t3","BigInt","getUint32","t4","t5","t6","getUint16","t7","TextDecoder","t8","decode","getBigUint64","stop","_x","_x2","apply","arguments"],"sources":["../../../src/parse-zip/cd-file-header.ts"],"sourcesContent":["import {FileProvider} from './file-provider';\nimport {ZipSignature} from './search-from-the-end';\n\n/**\n * zip central directory file header info\n * according to https://en.wikipedia.org/wiki/ZIP_(file_format)\n */\nexport type ZipCDFileHeader = {\n /** Compressed size */\n compressedSize: bigint;\n /** Uncompressed size */\n uncompressedSize: bigint;\n /** Extra field size */\n extraFieldLength: number;\n /** File name length */\n fileNameLength: number;\n /** File name */\n fileName: string;\n /** Extra field offset */\n extraOffset: bigint;\n /** Relative offset of local file header */\n localHeaderOffset: bigint;\n};\n\nconst offsets = {\n CD_COMPRESSED_SIZE_OFFSET: 20n,\n CD_UNCOMPRESSED_SIZE_OFFSET: 24n,\n CD_FILE_NAME_LENGTH_OFFSET: 28n,\n CD_EXTRA_FIELD_LENGTH_OFFSET: 30n,\n CD_LOCAL_HEADER_OFFSET_OFFSET: 42n,\n CD_FILE_NAME_OFFSET: 46n\n};\n\nexport const signature: ZipSignature = [0x50, 0x4b, 0x01, 0x02];\n\n/**\n * Parses central directory file header of zip file\n * @param headerOffset - offset in the archive where header starts\n * @param buffer - buffer containing whole array\n * @returns Info from the header\n */\nexport const parseZipCDFileHeader = async (\n headerOffset: bigint,\n buffer: FileProvider\n): Promise<ZipCDFileHeader | null> => {\n if (\n Buffer.from(await buffer.slice(headerOffset, headerOffset + 4n)).compare(\n Buffer.from(signature)\n ) !== 0\n ) {\n return null;\n }\n\n let compressedSize = BigInt(\n await buffer.getUint32(headerOffset + offsets.CD_COMPRESSED_SIZE_OFFSET)\n );\n\n let uncompressedSize = BigInt(\n await buffer.getUint32(headerOffset + offsets.CD_UNCOMPRESSED_SIZE_OFFSET)\n );\n\n const extraFieldLength = await buffer.getUint16(\n headerOffset + offsets.CD_EXTRA_FIELD_LENGTH_OFFSET\n );\n\n const fileNameLength = await buffer.getUint16(headerOffset + offsets.CD_FILE_NAME_LENGTH_OFFSET);\n\n const fileName = new TextDecoder().decode(\n await buffer.slice(\n headerOffset + offsets.CD_FILE_NAME_OFFSET,\n headerOffset + offsets.CD_FILE_NAME_OFFSET + BigInt(fileNameLength)\n )\n );\n\n const extraOffset = headerOffset + offsets.CD_FILE_NAME_OFFSET + BigInt(fileNameLength);\n\n const oldFormatOffset = await buffer.getUint32(\n headerOffset + offsets.CD_LOCAL_HEADER_OFFSET_OFFSET\n );\n\n let fileDataOffset = BigInt(oldFormatOffset);\n let offsetInZip64Data = 4n;\n // looking for info that might be also be in zip64 extra field\n if (uncompressedSize === BigInt(0xffffffff)) {\n uncompressedSize = await buffer.getBigUint64(extraOffset + offsetInZip64Data);\n offsetInZip64Data += 8n;\n }\n if (compressedSize === BigInt(0xffffffff)) {\n compressedSize = await buffer.getBigUint64(extraOffset + offsetInZip64Data);\n offsetInZip64Data += 8n;\n }\n if (fileDataOffset === BigInt(0xffffffff)) {\n fileDataOffset = await buffer.getBigUint64(extraOffset + offsetInZip64Data); // setting it to the one from zip64\n }\n const localHeaderOffset = fileDataOffset;\n\n return {\n compressedSize,\n uncompressedSize,\n extraFieldLength,\n fileNameLength,\n fileName,\n extraOffset,\n localHeaderOffset\n };\n};\n"],"mappings":"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"}