@loaders.gl/zip 4.0.4 → 4.1.0-alpha.10
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.
- package/dist/dist.dev.js +434 -27
- package/dist/filesystems/zip-filesystem.d.ts.map +1 -1
- package/dist/filesystems/zip-filesystem.js.map +1 -1
- package/dist/hash-file-utility.d.ts +6 -0
- package/dist/hash-file-utility.d.ts.map +1 -1
- package/dist/hash-file-utility.js +22 -0
- package/dist/hash-file-utility.js.map +1 -1
- package/dist/index.cjs +462 -32
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/tar/header.d.ts.map +1 -1
- package/dist/lib/tar/header.js.map +1 -1
- package/dist/lib/tar/tar.d.ts.map +1 -1
- package/dist/lib/tar/tar.js.map +1 -1
- package/dist/lib/tar/types.d.ts.map +1 -1
- package/dist/lib/tar/types.js.map +1 -1
- package/dist/lib/tar/utils.d.ts.map +1 -1
- package/dist/lib/tar/utils.js.map +1 -1
- package/dist/parse-zip/cd-file-header.d.ts +18 -0
- package/dist/parse-zip/cd-file-header.d.ts.map +1 -1
- package/dist/parse-zip/cd-file-header.js +101 -1
- package/dist/parse-zip/cd-file-header.js.map +1 -1
- package/dist/parse-zip/end-of-central-directory.d.ts +19 -0
- package/dist/parse-zip/end-of-central-directory.d.ts.map +1 -1
- package/dist/parse-zip/end-of-central-directory.js +41 -8
- package/dist/parse-zip/end-of-central-directory.js.map +1 -1
- package/dist/parse-zip/local-file-header.d.ts +16 -0
- package/dist/parse-zip/local-file-header.d.ts.map +1 -1
- package/dist/parse-zip/local-file-header.js +73 -1
- package/dist/parse-zip/local-file-header.js.map +1 -1
- package/dist/parse-zip/search-from-the-end.d.ts.map +1 -1
- package/dist/parse-zip/search-from-the-end.js.map +1 -1
- package/dist/parse-zip/zip-compozition.d.ts +8 -0
- package/dist/parse-zip/zip-compozition.d.ts.map +1 -0
- package/dist/parse-zip/zip-compozition.js +43 -0
- package/dist/parse-zip/zip-compozition.js.map +1 -0
- package/dist/parse-zip/zip64-info-generation.d.ts +24 -0
- package/dist/parse-zip/zip64-info-generation.d.ts.map +1 -0
- package/dist/parse-zip/zip64-info-generation.js +50 -0
- package/dist/parse-zip/zip64-info-generation.js.map +1 -0
- package/dist/tar-builder.d.ts.map +1 -1
- package/dist/tar-builder.js.map +1 -1
- package/dist/zip-loader.d.ts.map +1 -1
- package/dist/zip-loader.js +1 -1
- package/dist/zip-loader.js.map +1 -1
- package/dist/zip-writer.d.ts +2 -2
- package/dist/zip-writer.d.ts.map +1 -1
- package/dist/zip-writer.js +22 -7
- package/dist/zip-writer.js.map +1 -1
- package/package.json +7 -7
- package/src/filesystems/zip-filesystem.ts +2 -1
- package/src/hash-file-utility.ts +52 -2
- package/src/index.ts +8 -4
- package/src/lib/tar/header.ts +2 -1
- package/src/lib/tar/tar.ts +2 -1
- package/src/lib/tar/types.ts +2 -1
- package/src/lib/tar/utils.ts +2 -1
- package/src/parse-zip/cd-file-header.ts +185 -2
- package/src/parse-zip/end-of-central-directory.ts +99 -9
- package/src/parse-zip/local-file-header.ts +128 -2
- package/src/parse-zip/search-from-the-end.ts +2 -1
- package/src/parse-zip/zip-compozition.ts +113 -0
- package/src/parse-zip/zip64-info-generation.ts +106 -0
- package/src/tar-builder.ts +2 -1
- package/src/zip-loader.ts +2 -1
- package/src/zip-writer.ts +24 -10
package/dist/dist.dev.js
CHANGED
|
@@ -6951,12 +6951,16 @@ var __exports__ = (() => {
|
|
|
6951
6951
|
// src/index.ts
|
|
6952
6952
|
var src_exports = {};
|
|
6953
6953
|
__export(src_exports, {
|
|
6954
|
+
CD_HEADER_SIGNATURE: () => signature2,
|
|
6954
6955
|
TarBuilder: () => TarBuilder,
|
|
6955
6956
|
ZipFileSystem: () => ZipFileSystem,
|
|
6956
6957
|
ZipLoader: () => ZipLoader,
|
|
6957
6958
|
ZipWriter: () => ZipWriter,
|
|
6958
|
-
|
|
6959
|
-
|
|
6959
|
+
addOneFile: () => addOneFile,
|
|
6960
|
+
composeHashFile: () => composeHashFile,
|
|
6961
|
+
generateCDHeader: () => generateCDHeader,
|
|
6962
|
+
generateLocalHeader: () => generateLocalHeader,
|
|
6963
|
+
localHeaderSignature: () => signature3,
|
|
6960
6964
|
makeHashTableFromZipHeaders: () => makeHashTableFromZipHeaders,
|
|
6961
6965
|
makeZipCDHeaderIterator: () => makeZipCDHeaderIterator,
|
|
6962
6966
|
parseEoCDRecord: () => parseEoCDRecord,
|
|
@@ -6968,7 +6972,7 @@ var __exports__ = (() => {
|
|
|
6968
6972
|
|
|
6969
6973
|
// src/zip-loader.ts
|
|
6970
6974
|
var import_jszip = __toESM(require_jszip_min(), 1);
|
|
6971
|
-
var VERSION =
|
|
6975
|
+
var VERSION = true ? "4.1.0-alpha.10" : "latest";
|
|
6972
6976
|
var ZipLoader = {
|
|
6973
6977
|
id: "zip",
|
|
6974
6978
|
module: "zip",
|
|
@@ -7013,11 +7017,22 @@ var __exports__ = (() => {
|
|
|
7013
7017
|
|
|
7014
7018
|
// src/zip-writer.ts
|
|
7015
7019
|
var import_jszip2 = __toESM(require_jszip_min(), 1);
|
|
7020
|
+
var VERSION2 = true ? "4.1.0-alpha.10" : "latest";
|
|
7016
7021
|
var ZipWriter = {
|
|
7017
7022
|
name: "Zip Archive",
|
|
7023
|
+
id: "zip",
|
|
7024
|
+
module: "zip",
|
|
7025
|
+
version: VERSION2,
|
|
7018
7026
|
extensions: ["zip"],
|
|
7019
7027
|
category: "archive",
|
|
7020
7028
|
mimeTypes: ["application/zip"],
|
|
7029
|
+
options: {
|
|
7030
|
+
zip: {
|
|
7031
|
+
onUpdate: () => {
|
|
7032
|
+
}
|
|
7033
|
+
},
|
|
7034
|
+
jszip: {}
|
|
7035
|
+
},
|
|
7021
7036
|
encode: encodeZipAsync
|
|
7022
7037
|
};
|
|
7023
7038
|
async function encodeZipAsync(fileMap, options = {}) {
|
|
@@ -7026,18 +7041,21 @@ var __exports__ = (() => {
|
|
|
7026
7041
|
const subFileData = fileMap[subFileName];
|
|
7027
7042
|
jsZip.file(subFileName, subFileData, options?.jszip || {});
|
|
7028
7043
|
}
|
|
7044
|
+
const zipOptions = {
|
|
7045
|
+
...ZipWriter.options.zip,
|
|
7046
|
+
...options?.zip
|
|
7047
|
+
};
|
|
7029
7048
|
const jszipOptions = {
|
|
7030
|
-
...options?.jszip,
|
|
7031
|
-
|
|
7049
|
+
...ZipWriter.options?.jszip,
|
|
7050
|
+
...options.jszip
|
|
7032
7051
|
};
|
|
7033
|
-
const {
|
|
7034
|
-
onUpdate = () => {
|
|
7035
|
-
}
|
|
7036
|
-
} = options;
|
|
7037
7052
|
try {
|
|
7038
|
-
return await jsZip.generateAsync(
|
|
7053
|
+
return await jsZip.generateAsync({
|
|
7054
|
+
...jszipOptions,
|
|
7055
|
+
type: "arraybuffer"
|
|
7056
|
+
}, zipOptions.onUpdate);
|
|
7039
7057
|
} catch (error) {
|
|
7040
|
-
options.log.error(`Unable to
|
|
7058
|
+
options.log.error(`Unable to encode zip archive: ${error}`);
|
|
7041
7059
|
throw error;
|
|
7042
7060
|
}
|
|
7043
7061
|
}
|
|
@@ -7278,6 +7296,9 @@ var __exports__ = (() => {
|
|
|
7278
7296
|
return true;
|
|
7279
7297
|
}
|
|
7280
7298
|
function concatenateArrayBuffers(...sources) {
|
|
7299
|
+
return concatenateArrayBuffersFromArray(sources);
|
|
7300
|
+
}
|
|
7301
|
+
function concatenateArrayBuffersFromArray(sources) {
|
|
7281
7302
|
const sourceArrays = sources.map((source2) => source2 instanceof ArrayBuffer ? new Uint8Array(source2) : source2);
|
|
7282
7303
|
const byteLength = sourceArrays.reduce((length, typedArray) => length + typedArray.byteLength, 0);
|
|
7283
7304
|
const result = new Uint8Array(byteLength);
|
|
@@ -7360,6 +7381,12 @@ var __exports__ = (() => {
|
|
|
7360
7381
|
async stat() {
|
|
7361
7382
|
throw NOT_IMPLEMENTED;
|
|
7362
7383
|
}
|
|
7384
|
+
async truncate(length) {
|
|
7385
|
+
throw NOT_IMPLEMENTED;
|
|
7386
|
+
}
|
|
7387
|
+
async append(data) {
|
|
7388
|
+
throw NOT_IMPLEMENTED;
|
|
7389
|
+
}
|
|
7363
7390
|
async close() {
|
|
7364
7391
|
}
|
|
7365
7392
|
};
|
|
@@ -7371,9 +7398,14 @@ var __exports__ = (() => {
|
|
|
7371
7398
|
|
|
7372
7399
|
// ../loader-utils/src/lib/file-provider/file-handle-file.ts
|
|
7373
7400
|
var FileHandleFile = class {
|
|
7374
|
-
constructor(path) {
|
|
7375
|
-
this.file = new NodeFileFacade(path, "r");
|
|
7376
|
-
|
|
7401
|
+
constructor(path, append = false) {
|
|
7402
|
+
this.file = new NodeFileFacade(path, append ? "a+" : "r");
|
|
7403
|
+
}
|
|
7404
|
+
async truncate(length) {
|
|
7405
|
+
await this.file.truncate(length);
|
|
7406
|
+
}
|
|
7407
|
+
async append(buffer) {
|
|
7408
|
+
await this.file.append(buffer);
|
|
7377
7409
|
}
|
|
7378
7410
|
async destroy() {
|
|
7379
7411
|
await this.file.close();
|
|
@@ -7419,7 +7451,7 @@ var __exports__ = (() => {
|
|
|
7419
7451
|
return await this.file.read(startOffset, length);
|
|
7420
7452
|
}
|
|
7421
7453
|
get length() {
|
|
7422
|
-
return this.
|
|
7454
|
+
return this.file.bigsize;
|
|
7423
7455
|
}
|
|
7424
7456
|
};
|
|
7425
7457
|
|
|
@@ -7440,38 +7472,119 @@ var __exports__ = (() => {
|
|
|
7440
7472
|
return targetOffset;
|
|
7441
7473
|
};
|
|
7442
7474
|
|
|
7475
|
+
// src/parse-zip/zip64-info-generation.ts
|
|
7476
|
+
var signature = new Uint8Array([1, 0]);
|
|
7477
|
+
function createZip64Info(options) {
|
|
7478
|
+
const optionsToUse = {
|
|
7479
|
+
...options,
|
|
7480
|
+
zip64Length: (options.offset ? 1 : 0) * 8 + (options.size ? 1 : 0) * 16
|
|
7481
|
+
};
|
|
7482
|
+
const arraysToConcat = [];
|
|
7483
|
+
for (const field of ZIP64_FIELDS) {
|
|
7484
|
+
if (!optionsToUse[field.name ?? ""] && !field.default) {
|
|
7485
|
+
continue;
|
|
7486
|
+
}
|
|
7487
|
+
const newValue = new DataView(new ArrayBuffer(field.size));
|
|
7488
|
+
NUMBER_SETTERS[field.size](newValue, 0, optionsToUse[field.name ?? ""] ?? field.default);
|
|
7489
|
+
arraysToConcat.push(newValue.buffer);
|
|
7490
|
+
}
|
|
7491
|
+
return concatenateArrayBuffers(...arraysToConcat);
|
|
7492
|
+
}
|
|
7493
|
+
function setFieldToNumber(header, fieldSize, fieldOffset, value) {
|
|
7494
|
+
NUMBER_SETTERS[fieldSize](header, Number(fieldOffset), value);
|
|
7495
|
+
}
|
|
7496
|
+
var NUMBER_SETTERS = {
|
|
7497
|
+
2: (header, offset, value) => {
|
|
7498
|
+
header.setUint16(offset, Number(value), true);
|
|
7499
|
+
},
|
|
7500
|
+
4: (header, offset, value) => {
|
|
7501
|
+
header.setUint32(offset, Number(value), true);
|
|
7502
|
+
},
|
|
7503
|
+
8: (header, offset, value) => {
|
|
7504
|
+
header.setBigUint64(offset, BigInt(value), true);
|
|
7505
|
+
}
|
|
7506
|
+
};
|
|
7507
|
+
var ZIP64_FIELDS = [{
|
|
7508
|
+
size: 2,
|
|
7509
|
+
default: new DataView(signature.buffer).getUint16(0, true)
|
|
7510
|
+
}, {
|
|
7511
|
+
size: 2,
|
|
7512
|
+
name: "zip64Length"
|
|
7513
|
+
}, {
|
|
7514
|
+
size: 8,
|
|
7515
|
+
name: "size"
|
|
7516
|
+
}, {
|
|
7517
|
+
size: 8,
|
|
7518
|
+
name: "size"
|
|
7519
|
+
}, {
|
|
7520
|
+
size: 8,
|
|
7521
|
+
name: "offset"
|
|
7522
|
+
}];
|
|
7523
|
+
|
|
7443
7524
|
// src/parse-zip/end-of-central-directory.ts
|
|
7444
7525
|
var eoCDSignature = new Uint8Array([80, 75, 5, 6]);
|
|
7445
7526
|
var zip64EoCDLocatorSignature = new Uint8Array([80, 75, 6, 7]);
|
|
7446
7527
|
var zip64EoCDSignature = new Uint8Array([80, 75, 6, 6]);
|
|
7447
7528
|
var CD_RECORDS_NUMBER_OFFSET = 8n;
|
|
7529
|
+
var CD_RECORDS_NUMBER_ON_DISC_OFFSET = 10n;
|
|
7530
|
+
var CD_CD_BYTE_SIZE_OFFSET = 12n;
|
|
7448
7531
|
var CD_START_OFFSET_OFFSET = 16n;
|
|
7449
7532
|
var ZIP64_EOCD_START_OFFSET_OFFSET = 8n;
|
|
7450
7533
|
var ZIP64_CD_RECORDS_NUMBER_OFFSET = 24n;
|
|
7534
|
+
var ZIP64_CD_RECORDS_NUMBER_ON_DISC_OFFSET = 32n;
|
|
7535
|
+
var ZIP64_CD_CD_BYTE_SIZE_OFFSET = 40n;
|
|
7451
7536
|
var ZIP64_CD_START_OFFSET_OFFSET = 48n;
|
|
7452
7537
|
var parseEoCDRecord = async (file) => {
|
|
7453
7538
|
const zipEoCDOffset = await searchFromTheEnd(file, eoCDSignature);
|
|
7454
7539
|
let cdRecordsNumber = BigInt(await file.getUint16(zipEoCDOffset + CD_RECORDS_NUMBER_OFFSET));
|
|
7455
7540
|
let cdStartOffset = BigInt(await file.getUint32(zipEoCDOffset + CD_START_OFFSET_OFFSET));
|
|
7456
|
-
|
|
7457
|
-
|
|
7458
|
-
|
|
7459
|
-
|
|
7460
|
-
|
|
7461
|
-
}
|
|
7462
|
-
const zip64EoCDOffset = await file.getBigUint64(zip64EoCDLocatorOffset + ZIP64_EOCD_START_OFFSET_OFFSET);
|
|
7541
|
+
let zip64EoCDLocatorOffset = zipEoCDOffset - 20n;
|
|
7542
|
+
let zip64EoCDOffset = 0n;
|
|
7543
|
+
const magicBytes = await file.slice(zip64EoCDLocatorOffset, zip64EoCDLocatorOffset + 4n);
|
|
7544
|
+
if (compareArrayBuffers(magicBytes, zip64EoCDLocatorSignature)) {
|
|
7545
|
+
zip64EoCDOffset = await file.getBigUint64(zip64EoCDLocatorOffset + ZIP64_EOCD_START_OFFSET_OFFSET);
|
|
7463
7546
|
const endOfCDMagicBytes = await file.slice(zip64EoCDOffset, zip64EoCDOffset + 4n);
|
|
7464
7547
|
if (!compareArrayBuffers(endOfCDMagicBytes, zip64EoCDSignature.buffer)) {
|
|
7465
7548
|
throw new Error("zip64 EoCD not found");
|
|
7466
7549
|
}
|
|
7467
7550
|
cdRecordsNumber = await file.getBigUint64(zip64EoCDOffset + ZIP64_CD_RECORDS_NUMBER_OFFSET);
|
|
7468
7551
|
cdStartOffset = await file.getBigUint64(zip64EoCDOffset + ZIP64_CD_START_OFFSET_OFFSET);
|
|
7552
|
+
} else {
|
|
7553
|
+
zip64EoCDLocatorOffset = 0n;
|
|
7469
7554
|
}
|
|
7470
7555
|
return {
|
|
7471
7556
|
cdRecordsNumber,
|
|
7472
|
-
cdStartOffset
|
|
7557
|
+
cdStartOffset,
|
|
7558
|
+
offsets: {
|
|
7559
|
+
zip64EoCDOffset,
|
|
7560
|
+
zip64EoCDLocatorOffset,
|
|
7561
|
+
zipEoCDOffset
|
|
7562
|
+
}
|
|
7473
7563
|
};
|
|
7474
7564
|
};
|
|
7565
|
+
async function updateEoCD(eocdBody, oldEoCDOffsets, newCDStartOffset, eocdStartOffset, newCDRecordsNumber) {
|
|
7566
|
+
const eocd = new DataView(eocdBody);
|
|
7567
|
+
const classicEoCDOffset = oldEoCDOffsets.zip64EoCDOffset ? oldEoCDOffsets.zipEoCDOffset - oldEoCDOffsets.zip64EoCDOffset : 0n;
|
|
7568
|
+
if (Number(newCDRecordsNumber) <= 65535) {
|
|
7569
|
+
setFieldToNumber(eocd, 2, classicEoCDOffset + CD_RECORDS_NUMBER_OFFSET, newCDRecordsNumber);
|
|
7570
|
+
setFieldToNumber(eocd, 2, classicEoCDOffset + CD_RECORDS_NUMBER_ON_DISC_OFFSET, newCDRecordsNumber);
|
|
7571
|
+
}
|
|
7572
|
+
if (eocdStartOffset - newCDStartOffset <= 4294967295) {
|
|
7573
|
+
setFieldToNumber(eocd, 4, classicEoCDOffset + CD_CD_BYTE_SIZE_OFFSET, eocdStartOffset - newCDStartOffset);
|
|
7574
|
+
}
|
|
7575
|
+
if (newCDStartOffset < 4294967295) {
|
|
7576
|
+
setFieldToNumber(eocd, 4, classicEoCDOffset + CD_START_OFFSET_OFFSET, newCDStartOffset);
|
|
7577
|
+
}
|
|
7578
|
+
if (oldEoCDOffsets.zip64EoCDLocatorOffset && oldEoCDOffsets.zip64EoCDOffset) {
|
|
7579
|
+
const locatorOffset = oldEoCDOffsets.zip64EoCDLocatorOffset - oldEoCDOffsets.zip64EoCDOffset;
|
|
7580
|
+
setFieldToNumber(eocd, 8, locatorOffset + ZIP64_EOCD_START_OFFSET_OFFSET, eocdStartOffset);
|
|
7581
|
+
setFieldToNumber(eocd, 8, ZIP64_CD_START_OFFSET_OFFSET, newCDStartOffset);
|
|
7582
|
+
setFieldToNumber(eocd, 8, ZIP64_CD_RECORDS_NUMBER_OFFSET, newCDRecordsNumber);
|
|
7583
|
+
setFieldToNumber(eocd, 8, ZIP64_CD_RECORDS_NUMBER_ON_DISC_OFFSET, newCDRecordsNumber);
|
|
7584
|
+
setFieldToNumber(eocd, 8, ZIP64_CD_CD_BYTE_SIZE_OFFSET, eocdStartOffset - newCDStartOffset);
|
|
7585
|
+
}
|
|
7586
|
+
return new Uint8Array(eocd.buffer);
|
|
7587
|
+
}
|
|
7475
7588
|
|
|
7476
7589
|
// src/parse-zip/cd-file-header.ts
|
|
7477
7590
|
var CD_COMPRESSED_SIZE_OFFSET = 20n;
|
|
@@ -7481,10 +7594,10 @@ var __exports__ = (() => {
|
|
|
7481
7594
|
var CD_START_DISK_OFFSET = 32n;
|
|
7482
7595
|
var CD_LOCAL_HEADER_OFFSET_OFFSET = 42n;
|
|
7483
7596
|
var CD_FILE_NAME_OFFSET = 46n;
|
|
7484
|
-
var
|
|
7597
|
+
var signature2 = new Uint8Array([80, 75, 1, 2]);
|
|
7485
7598
|
var parseZipCDFileHeader = async (headerOffset, file) => {
|
|
7486
7599
|
const magicBytes = await file.slice(headerOffset, headerOffset + 4n);
|
|
7487
|
-
if (!compareArrayBuffers(magicBytes,
|
|
7600
|
+
if (!compareArrayBuffers(magicBytes, signature2.buffer)) {
|
|
7488
7601
|
return null;
|
|
7489
7602
|
}
|
|
7490
7603
|
const compressedSize = BigInt(await file.getUint32(headerOffset + CD_COMPRESSED_SIZE_OFFSET));
|
|
@@ -7570,6 +7683,104 @@ var __exports__ = (() => {
|
|
|
7570
7683
|
}
|
|
7571
7684
|
return zip64dataList;
|
|
7572
7685
|
};
|
|
7686
|
+
function generateCDHeader(options) {
|
|
7687
|
+
const optionsToUse = {
|
|
7688
|
+
...options,
|
|
7689
|
+
fnlength: options.fileName.length,
|
|
7690
|
+
extraLength: 0
|
|
7691
|
+
};
|
|
7692
|
+
let zip64header = new ArrayBuffer(0);
|
|
7693
|
+
const optionsToZip64 = {};
|
|
7694
|
+
if (optionsToUse.offset >= 4294967295) {
|
|
7695
|
+
optionsToZip64.offset = optionsToUse.offset;
|
|
7696
|
+
optionsToUse.offset = BigInt(4294967295);
|
|
7697
|
+
}
|
|
7698
|
+
if (optionsToUse.length >= 4294967295) {
|
|
7699
|
+
optionsToZip64.size = optionsToUse.length;
|
|
7700
|
+
optionsToUse.length = 4294967295;
|
|
7701
|
+
}
|
|
7702
|
+
if (Object.keys(optionsToZip64).length) {
|
|
7703
|
+
zip64header = createZip64Info(optionsToZip64);
|
|
7704
|
+
optionsToUse.extraLength = zip64header.byteLength;
|
|
7705
|
+
}
|
|
7706
|
+
const header = new DataView(new ArrayBuffer(Number(CD_FILE_NAME_OFFSET)));
|
|
7707
|
+
for (const field of ZIP_HEADER_FIELDS) {
|
|
7708
|
+
setFieldToNumber(header, field.size, field.offset, optionsToUse[field.name ?? ""] ?? field.default ?? 0);
|
|
7709
|
+
}
|
|
7710
|
+
const encodedName = new TextEncoder().encode(optionsToUse.fileName);
|
|
7711
|
+
const resHeader = concatenateArrayBuffers(header.buffer, encodedName, zip64header);
|
|
7712
|
+
return resHeader;
|
|
7713
|
+
}
|
|
7714
|
+
var ZIP_HEADER_FIELDS = [{
|
|
7715
|
+
offset: 0,
|
|
7716
|
+
size: 4,
|
|
7717
|
+
default: new DataView(signature2.buffer).getUint32(0, true)
|
|
7718
|
+
}, {
|
|
7719
|
+
offset: 4,
|
|
7720
|
+
size: 2,
|
|
7721
|
+
default: 45
|
|
7722
|
+
}, {
|
|
7723
|
+
offset: 6,
|
|
7724
|
+
size: 2,
|
|
7725
|
+
default: 45
|
|
7726
|
+
}, {
|
|
7727
|
+
offset: 8,
|
|
7728
|
+
size: 2,
|
|
7729
|
+
default: 0
|
|
7730
|
+
}, {
|
|
7731
|
+
offset: 10,
|
|
7732
|
+
size: 2,
|
|
7733
|
+
default: 0
|
|
7734
|
+
}, {
|
|
7735
|
+
offset: 12,
|
|
7736
|
+
size: 2,
|
|
7737
|
+
default: 0
|
|
7738
|
+
}, {
|
|
7739
|
+
offset: 14,
|
|
7740
|
+
size: 2,
|
|
7741
|
+
default: 0
|
|
7742
|
+
}, {
|
|
7743
|
+
offset: 16,
|
|
7744
|
+
size: 4,
|
|
7745
|
+
name: "crc32"
|
|
7746
|
+
}, {
|
|
7747
|
+
offset: 20,
|
|
7748
|
+
size: 4,
|
|
7749
|
+
name: "length"
|
|
7750
|
+
}, {
|
|
7751
|
+
offset: 24,
|
|
7752
|
+
size: 4,
|
|
7753
|
+
name: "length"
|
|
7754
|
+
}, {
|
|
7755
|
+
offset: 28,
|
|
7756
|
+
size: 2,
|
|
7757
|
+
name: "fnlength"
|
|
7758
|
+
}, {
|
|
7759
|
+
offset: 30,
|
|
7760
|
+
size: 2,
|
|
7761
|
+
default: 0,
|
|
7762
|
+
name: "extraLength"
|
|
7763
|
+
}, {
|
|
7764
|
+
offset: 32,
|
|
7765
|
+
size: 2,
|
|
7766
|
+
default: 0
|
|
7767
|
+
}, {
|
|
7768
|
+
offset: 34,
|
|
7769
|
+
size: 2,
|
|
7770
|
+
default: 0
|
|
7771
|
+
}, {
|
|
7772
|
+
offset: 36,
|
|
7773
|
+
size: 2,
|
|
7774
|
+
default: 0
|
|
7775
|
+
}, {
|
|
7776
|
+
offset: 38,
|
|
7777
|
+
size: 4,
|
|
7778
|
+
default: 0
|
|
7779
|
+
}, {
|
|
7780
|
+
offset: 42,
|
|
7781
|
+
size: 4,
|
|
7782
|
+
name: "offset"
|
|
7783
|
+
}];
|
|
7573
7784
|
|
|
7574
7785
|
// src/parse-zip/local-file-header.ts
|
|
7575
7786
|
var COMPRESSION_METHOD_OFFSET = 8n;
|
|
@@ -7578,10 +7789,10 @@ var __exports__ = (() => {
|
|
|
7578
7789
|
var FILE_NAME_LENGTH_OFFSET = 26n;
|
|
7579
7790
|
var EXTRA_FIELD_LENGTH_OFFSET = 28n;
|
|
7580
7791
|
var FILE_NAME_OFFSET = 30n;
|
|
7581
|
-
var
|
|
7792
|
+
var signature3 = new Uint8Array([80, 75, 3, 4]);
|
|
7582
7793
|
var parseZipLocalFileHeader = async (headerOffset, buffer) => {
|
|
7583
7794
|
const magicBytes = await buffer.slice(headerOffset, headerOffset + 4n);
|
|
7584
|
-
if (!compareArrayBuffers(magicBytes,
|
|
7795
|
+
if (!compareArrayBuffers(magicBytes, signature3)) {
|
|
7585
7796
|
return null;
|
|
7586
7797
|
}
|
|
7587
7798
|
const fileNameLength = await buffer.getUint16(headerOffset + FILE_NAME_LENGTH_OFFSET);
|
|
@@ -7613,6 +7824,76 @@ var __exports__ = (() => {
|
|
|
7613
7824
|
compressionMethod
|
|
7614
7825
|
};
|
|
7615
7826
|
};
|
|
7827
|
+
function generateLocalHeader(options) {
|
|
7828
|
+
const optionsToUse = {
|
|
7829
|
+
...options,
|
|
7830
|
+
extraLength: 0,
|
|
7831
|
+
fnlength: options.fileName.length
|
|
7832
|
+
};
|
|
7833
|
+
let zip64header = new ArrayBuffer(0);
|
|
7834
|
+
const optionsToZip64 = {};
|
|
7835
|
+
if (optionsToUse.length >= 4294967295) {
|
|
7836
|
+
optionsToZip64.size = optionsToUse.length;
|
|
7837
|
+
optionsToUse.length = 4294967295;
|
|
7838
|
+
}
|
|
7839
|
+
if (Object.keys(optionsToZip64).length) {
|
|
7840
|
+
zip64header = createZip64Info(optionsToZip64);
|
|
7841
|
+
optionsToUse.extraLength = zip64header.byteLength;
|
|
7842
|
+
}
|
|
7843
|
+
const header = new DataView(new ArrayBuffer(Number(FILE_NAME_OFFSET)));
|
|
7844
|
+
for (const field of ZIP_HEADER_FIELDS2) {
|
|
7845
|
+
setFieldToNumber(header, field.size, field.offset, optionsToUse[field.name ?? ""] ?? field.default ?? 0);
|
|
7846
|
+
}
|
|
7847
|
+
const encodedName = new TextEncoder().encode(optionsToUse.fileName);
|
|
7848
|
+
const resHeader = concatenateArrayBuffers(header.buffer, encodedName, zip64header);
|
|
7849
|
+
return resHeader;
|
|
7850
|
+
}
|
|
7851
|
+
var ZIP_HEADER_FIELDS2 = [{
|
|
7852
|
+
offset: 0,
|
|
7853
|
+
size: 4,
|
|
7854
|
+
default: new DataView(signature3.buffer).getUint32(0, true)
|
|
7855
|
+
}, {
|
|
7856
|
+
offset: 4,
|
|
7857
|
+
size: 2,
|
|
7858
|
+
default: 45
|
|
7859
|
+
}, {
|
|
7860
|
+
offset: 6,
|
|
7861
|
+
size: 2,
|
|
7862
|
+
default: 0
|
|
7863
|
+
}, {
|
|
7864
|
+
offset: 8,
|
|
7865
|
+
size: 2,
|
|
7866
|
+
default: 0
|
|
7867
|
+
}, {
|
|
7868
|
+
offset: 10,
|
|
7869
|
+
size: 2,
|
|
7870
|
+
default: 0
|
|
7871
|
+
}, {
|
|
7872
|
+
offset: 12,
|
|
7873
|
+
size: 2,
|
|
7874
|
+
default: 0
|
|
7875
|
+
}, {
|
|
7876
|
+
offset: 14,
|
|
7877
|
+
size: 4,
|
|
7878
|
+
name: "crc32"
|
|
7879
|
+
}, {
|
|
7880
|
+
offset: 18,
|
|
7881
|
+
size: 4,
|
|
7882
|
+
name: "length"
|
|
7883
|
+
}, {
|
|
7884
|
+
offset: 22,
|
|
7885
|
+
size: 4,
|
|
7886
|
+
name: "length"
|
|
7887
|
+
}, {
|
|
7888
|
+
offset: 26,
|
|
7889
|
+
size: 2,
|
|
7890
|
+
name: "fnlength"
|
|
7891
|
+
}, {
|
|
7892
|
+
offset: 28,
|
|
7893
|
+
size: 2,
|
|
7894
|
+
default: 0,
|
|
7895
|
+
name: "extraLength"
|
|
7896
|
+
}];
|
|
7616
7897
|
|
|
7617
7898
|
// ../crypto/src/lib/hash.ts
|
|
7618
7899
|
var Hash = class {
|
|
@@ -7639,6 +7920,29 @@ var __exports__ = (() => {
|
|
|
7639
7920
|
}
|
|
7640
7921
|
};
|
|
7641
7922
|
|
|
7923
|
+
// ../crypto/src/lib/algorithms/crc32.ts
|
|
7924
|
+
var CRC32 = class {
|
|
7925
|
+
constructor() {
|
|
7926
|
+
this.crc = ~0;
|
|
7927
|
+
}
|
|
7928
|
+
update(arrayBuffer) {
|
|
7929
|
+
const CRC32_TABLE = getCRC32Table();
|
|
7930
|
+
const byteArray = new Uint8Array(arrayBuffer);
|
|
7931
|
+
for (let i = 0; i < byteArray.byteLength; i++) {
|
|
7932
|
+
this.crc = this.crc >>> 8 ^ CRC32_TABLE[(this.crc ^ byteArray[i]) & 255];
|
|
7933
|
+
}
|
|
7934
|
+
return this;
|
|
7935
|
+
}
|
|
7936
|
+
finalize() {
|
|
7937
|
+
this.crc = (this.crc ^ -1) >>> 0;
|
|
7938
|
+
return this.crc;
|
|
7939
|
+
}
|
|
7940
|
+
};
|
|
7941
|
+
var CRC32TAB = Uint32Array.of(0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035, 249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049, 498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639, 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317, 997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443, 901097722, 1119000684, 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665, 651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303, 671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565, 1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059, 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297, 1802195444, 476864866, 2238001368, 4066508878, 1812370925, 453092731, 2181625025, 4111451223, 1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405, 1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995, 1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649, 1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015, 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989, 3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523, 3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377, 4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879, 4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637, 3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859, 3624741850, 2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135, 1181335161, 3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815, 3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221, 2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371, 2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881, 2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, 1873836001, 414664567, 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701, 2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035, 2932959818, 3654703836, 1088359270, 936918e3, 2847714899, 3736837829, 1202900863, 817233897, 3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431, 3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117);
|
|
7942
|
+
function getCRC32Table() {
|
|
7943
|
+
return CRC32TAB;
|
|
7944
|
+
}
|
|
7945
|
+
|
|
7642
7946
|
// ../crypto/src/lib/utils/base64-utils.ts
|
|
7643
7947
|
function asciiToBase64(string) {
|
|
7644
7948
|
string = `${string}`;
|
|
@@ -7690,6 +7994,16 @@ var __exports__ = (() => {
|
|
|
7690
7994
|
}
|
|
7691
7995
|
|
|
7692
7996
|
// ../crypto/src/lib/utils/digest-utils.ts
|
|
7997
|
+
function encodeNumber(number, encoding) {
|
|
7998
|
+
switch (encoding) {
|
|
7999
|
+
case "hex":
|
|
8000
|
+
return convertNumberToHex(number);
|
|
8001
|
+
case "base64":
|
|
8002
|
+
return convertHexToBase64(convertNumberToHex(number));
|
|
8003
|
+
default:
|
|
8004
|
+
throw new Error(encoding);
|
|
8005
|
+
}
|
|
8006
|
+
}
|
|
7693
8007
|
function encodeHex(hex, encoding) {
|
|
7694
8008
|
switch (encoding) {
|
|
7695
8009
|
case "hex":
|
|
@@ -7708,6 +8022,43 @@ var __exports__ = (() => {
|
|
|
7708
8022
|
const string = matches2.map((a) => String.fromCharCode(parseInt(a, 16))).join("");
|
|
7709
8023
|
return asciiToBase64(string) || "";
|
|
7710
8024
|
}
|
|
8025
|
+
function convertNumberToHex(cipher) {
|
|
8026
|
+
const hexString = cipher.toString(16);
|
|
8027
|
+
return hexString === "0" ? `0${hexString}` : hexString;
|
|
8028
|
+
}
|
|
8029
|
+
|
|
8030
|
+
// ../crypto/src/lib/crc32-hash.ts
|
|
8031
|
+
var CRC32Hash = class extends Hash {
|
|
8032
|
+
name = "crc32";
|
|
8033
|
+
constructor(options = {}) {
|
|
8034
|
+
super();
|
|
8035
|
+
this.options = {
|
|
8036
|
+
crypto: {},
|
|
8037
|
+
...options
|
|
8038
|
+
};
|
|
8039
|
+
this.hashBatches = this.hashBatches.bind(this);
|
|
8040
|
+
}
|
|
8041
|
+
async hash(input, encoding) {
|
|
8042
|
+
return this.hashSync(input, encoding);
|
|
8043
|
+
}
|
|
8044
|
+
hashSync(input, encoding) {
|
|
8045
|
+
const hash = new CRC32();
|
|
8046
|
+
hash.update(input);
|
|
8047
|
+
const digest = hash.finalize();
|
|
8048
|
+
return encodeNumber(digest, encoding);
|
|
8049
|
+
}
|
|
8050
|
+
async *hashBatches(asyncIterator, encoding = "base64") {
|
|
8051
|
+
const hash = new CRC32();
|
|
8052
|
+
for await (const chunk of asyncIterator) {
|
|
8053
|
+
hash.update(chunk);
|
|
8054
|
+
yield chunk;
|
|
8055
|
+
}
|
|
8056
|
+
const digest = hash.finalize();
|
|
8057
|
+
this.options.crypto?.onEnd?.({
|
|
8058
|
+
hash: encodeNumber(digest, encoding)
|
|
8059
|
+
});
|
|
8060
|
+
}
|
|
8061
|
+
};
|
|
7711
8062
|
|
|
7712
8063
|
// ../crypto/src/lib/algorithms/md5-wasm.ts
|
|
7713
8064
|
var atb = typeof atob === "function" ? atob : typeof Buffer === "function" ? nodeATOB : identity;
|
|
@@ -8132,6 +8483,45 @@ var __exports__ = (() => {
|
|
|
8132
8483
|
}
|
|
8133
8484
|
};
|
|
8134
8485
|
|
|
8486
|
+
// src/parse-zip/zip-compozition.ts
|
|
8487
|
+
async function cutTheTailOff(provider) {
|
|
8488
|
+
const oldEoCDinfo = await parseEoCDRecord(provider);
|
|
8489
|
+
const oldCDStartOffset = oldEoCDinfo.cdStartOffset;
|
|
8490
|
+
const oldCDLength = Number(oldEoCDinfo.offsets.zip64EoCDOffset ? oldEoCDinfo.offsets.zip64EoCDOffset - oldCDStartOffset : oldEoCDinfo.offsets.zipEoCDOffset - oldCDStartOffset);
|
|
8491
|
+
const zipEnding = await provider.slice(oldCDStartOffset, provider.length);
|
|
8492
|
+
await provider.truncate(Number(oldCDStartOffset));
|
|
8493
|
+
const oldCDBody = zipEnding.slice(0, oldCDLength);
|
|
8494
|
+
const eocdBody = zipEnding.slice(oldCDLength, zipEnding.byteLength);
|
|
8495
|
+
return [oldCDBody, eocdBody, oldEoCDinfo];
|
|
8496
|
+
}
|
|
8497
|
+
async function generateFileHeaders(fileName, fileToAdd, localFileHeaderOffset) {
|
|
8498
|
+
const newFileCRC322 = parseInt(await new CRC32Hash().hash(fileToAdd, "hex"), 16);
|
|
8499
|
+
const newFileLocalHeader = generateLocalHeader({
|
|
8500
|
+
crc32: newFileCRC322,
|
|
8501
|
+
fileName,
|
|
8502
|
+
length: fileToAdd.byteLength
|
|
8503
|
+
});
|
|
8504
|
+
const newFileCDHeader = generateCDHeader({
|
|
8505
|
+
crc32: newFileCRC322,
|
|
8506
|
+
fileName,
|
|
8507
|
+
offset: localFileHeaderOffset,
|
|
8508
|
+
length: fileToAdd.byteLength
|
|
8509
|
+
});
|
|
8510
|
+
return [new Uint8Array(concatenateArrayBuffers(newFileLocalHeader, fileToAdd)), new Uint8Array(newFileCDHeader)];
|
|
8511
|
+
}
|
|
8512
|
+
async function addOneFile(zipUrl, fileToAdd, fileName) {
|
|
8513
|
+
const provider = new FileHandleFile(zipUrl, true);
|
|
8514
|
+
const [oldCDBody, eocdBody, oldEoCDinfo] = await cutTheTailOff(provider);
|
|
8515
|
+
const newFileOffset = provider.length;
|
|
8516
|
+
const [localPart, cdHeaderPart] = await generateFileHeaders(fileName, fileToAdd, newFileOffset);
|
|
8517
|
+
await provider.append(localPart);
|
|
8518
|
+
const newCDBody = concatenateArrayBuffers(oldCDBody, cdHeaderPart);
|
|
8519
|
+
const newCDStartOffset = provider.length;
|
|
8520
|
+
await provider.append(new Uint8Array(newCDBody));
|
|
8521
|
+
const eocdOffset = provider.length;
|
|
8522
|
+
await provider.append(await updateEoCD(eocdBody, oldEoCDinfo.offsets, newCDStartOffset, eocdOffset, oldEoCDinfo.cdRecordsNumber + 1n));
|
|
8523
|
+
}
|
|
8524
|
+
|
|
8135
8525
|
// src/hash-file-utility.ts
|
|
8136
8526
|
function parseHashTable(arrayBuffer) {
|
|
8137
8527
|
const dataView = new DataView(arrayBuffer);
|
|
@@ -8159,6 +8549,23 @@ var __exports__ = (() => {
|
|
|
8159
8549
|
}
|
|
8160
8550
|
return hashTable;
|
|
8161
8551
|
}
|
|
8552
|
+
async function composeHashFile(fileProvider) {
|
|
8553
|
+
const hashArray = await makeHashTableFromZipHeaders(fileProvider);
|
|
8554
|
+
const bufferArray = Object.entries(hashArray).map(([key, value]) => concatenateArrayBuffers(hexStringToBuffer(key), bigintToBuffer(value))).sort(compareHashes);
|
|
8555
|
+
return concatenateArrayBuffersFromArray(bufferArray);
|
|
8556
|
+
}
|
|
8557
|
+
function compareHashes(arrA, arrB) {
|
|
8558
|
+
const a = new BigUint64Array(arrA);
|
|
8559
|
+
const b = new BigUint64Array(arrB);
|
|
8560
|
+
return Number(a[0] === b[0] ? a[1] - b[1] : a[0] - b[0]);
|
|
8561
|
+
}
|
|
8562
|
+
function hexStringToBuffer(str) {
|
|
8563
|
+
const byteArray = str.match(/../g)?.map((h) => parseInt(h, 16));
|
|
8564
|
+
return new Uint8Array(byteArray ?? new Array(16)).buffer;
|
|
8565
|
+
}
|
|
8566
|
+
function bigintToBuffer(n) {
|
|
8567
|
+
return new BigUint64Array([n]).buffer;
|
|
8568
|
+
}
|
|
8162
8569
|
|
|
8163
8570
|
// ../compression/src/lib/compression.ts
|
|
8164
8571
|
var Compression = class {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zip-filesystem.d.ts","sourceRoot":"","sources":["../../src/filesystems/zip-filesystem.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"zip-filesystem.d.ts","sourceRoot":"","sources":["../../src/filesystems/zip-filesystem.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,UAAU,EAAY,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAC,YAAY,EAAiB,MAAM,0BAA0B,CAAC;AAEtE,OAAO,EAAC,eAAe,EAA0B,MAAM,6BAA6B,CAAC;AAiBrF;;;GAGG;AACH,qBAAa,aAAc,YAAW,UAAU;IAC9C,oCAAoC;IACpC,SAAS,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI,CAAQ;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;gBACS,IAAI,EAAE,YAAY,GAAG,MAAM;IAcvC,yBAAyB;IACnB,OAAO;IAMb;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAYlC;;;;OAIG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,CAAC;IAKvE;;;;OAIG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IA8BhD;;;;OAIG;YACW,eAAe;CAiB9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zip-filesystem.js","names":["isBrowser","isFileProvider","FileHandleFile","makeZipCDHeaderIterator","parseZipLocalFileHeader","DeflateCompression","COMPRESSION_METHODS","compressedFile","compression","raw","decompressedData","decompress","ZipFileSystem","constructor","file","fileProvider","fileName","Error","destroy","readdir","fileNames","zipCDIterator","cdHeader","push","stat","filename","cdFileHeader","getCDFileHeader","size","Number","uncompressedSize","fetch","localFileHeader","localHeaderOffset","compressionHandler","compressionMethod","toString","slice","fileDataOffset","compressedSize","uncompressedFile","response","Response","Object","defineProperty","value","result"],"sources":["../../src/filesystems/zip-filesystem.ts"],"sourcesContent":["// loaders.gl
|
|
1
|
+
{"version":3,"file":"zip-filesystem.js","names":["isBrowser","isFileProvider","FileHandleFile","makeZipCDHeaderIterator","parseZipLocalFileHeader","DeflateCompression","COMPRESSION_METHODS","compressedFile","compression","raw","decompressedData","decompress","ZipFileSystem","constructor","file","fileProvider","fileName","Error","destroy","readdir","fileNames","zipCDIterator","cdHeader","push","stat","filename","cdFileHeader","getCDFileHeader","size","Number","uncompressedSize","fetch","localFileHeader","localHeaderOffset","compressionHandler","compressionMethod","toString","slice","fileDataOffset","compressedSize","uncompressedFile","response","Response","Object","defineProperty","value","result"],"sources":["../../src/filesystems/zip-filesystem.ts"],"sourcesContent":["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {FileSystem, isBrowser} from '@loaders.gl/loader-utils';\nimport {FileProvider, isFileProvider} from '@loaders.gl/loader-utils';\nimport {FileHandleFile} from '@loaders.gl/loader-utils';\nimport {ZipCDFileHeader, makeZipCDHeaderIterator} from '../parse-zip/cd-file-header';\nimport {parseZipLocalFileHeader} from '../parse-zip/local-file-header';\nimport {DeflateCompression} from '@loaders.gl/compression';\n\ntype CompressionHandler = (compressedFile: ArrayBuffer) => Promise<ArrayBuffer>;\n/** Handling different compression types in zip */\nconst COMPRESSION_METHODS: {[key: number]: CompressionHandler} = {\n /** No compression */\n 0: async (compressedFile) => compressedFile,\n /** Deflation */\n 8: async (compressedFile) => {\n const compression = new DeflateCompression({raw: true});\n const decompressedData = await compression.decompress(compressedFile);\n return decompressedData;\n }\n};\n\n/**\n * FileSystem adapter for a ZIP file\n * Holds FileProvider object that provides random access to archived files\n */\nexport class ZipFileSystem implements FileSystem {\n /** FileProvider instance promise */\n protected fileProvider: FileProvider | null = null;\n public fileName?: string;\n\n /**\n * Constructor\n * @param file - instance of FileProvider or file path string\n */\n constructor(file: FileProvider | string) {\n // Try to open file in NodeJS\n if (typeof file === 'string') {\n this.fileName = file;\n if (!isBrowser) {\n this.fileProvider = new FileHandleFile(file);\n } else {\n throw new Error('Cannot open file for random access in a WEB browser');\n }\n } else if (isFileProvider(file)) {\n this.fileProvider = file;\n }\n }\n\n /** Clean up resources */\n async destroy() {\n if (this.fileProvider) {\n await this.fileProvider.destroy();\n }\n }\n\n /**\n * Get file names list from zip archive\n * @returns array of file names\n */\n async readdir(): Promise<string[]> {\n if (!this.fileProvider) {\n throw new Error('No data detected in the zip archive');\n }\n const fileNames: string[] = [];\n const zipCDIterator = makeZipCDHeaderIterator(this.fileProvider);\n for await (const cdHeader of zipCDIterator) {\n fileNames.push(cdHeader.fileName);\n }\n return fileNames;\n }\n\n /**\n * Get file metadata\n * @param filename - name of a file\n * @returns central directory data\n */\n async stat(filename: string): Promise<ZipCDFileHeader & {size: number}> {\n const cdFileHeader = await this.getCDFileHeader(filename);\n return {...cdFileHeader, size: Number(cdFileHeader.uncompressedSize)};\n }\n\n /**\n * Implementation of fetch against this file system\n * @param filename - name of a file\n * @returns - Response with file data\n */\n async fetch(filename: string): Promise<Response> {\n if (!this.fileProvider) {\n throw new Error('No data detected in the zip archive');\n }\n const cdFileHeader = await this.getCDFileHeader(filename);\n const localFileHeader = await parseZipLocalFileHeader(\n cdFileHeader.localHeaderOffset,\n this.fileProvider\n );\n if (!localFileHeader) {\n throw new Error('Local file header has not been found in the zip archive`');\n }\n\n const compressionHandler = COMPRESSION_METHODS[localFileHeader.compressionMethod.toString()];\n if (!compressionHandler) {\n throw Error('Only Deflation compression is supported');\n }\n\n const compressedFile = await this.fileProvider.slice(\n localFileHeader.fileDataOffset,\n localFileHeader.fileDataOffset + localFileHeader.compressedSize\n );\n\n const uncompressedFile = await compressionHandler(compressedFile);\n\n const response = new Response(uncompressedFile);\n Object.defineProperty(response, 'url', {value: `${this.fileName || ''}/${filename}`});\n return response;\n }\n\n /**\n * Get central directory file header\n * @param filename - name of a file\n * @returns central directory file header\n */\n private async getCDFileHeader(filename: string): Promise<ZipCDFileHeader> {\n if (!this.fileProvider) {\n throw new Error('No data detected in the zip archive');\n }\n const zipCDIterator = makeZipCDHeaderIterator(this.fileProvider);\n let result: ZipCDFileHeader | null = null;\n for await (const cdHeader of zipCDIterator) {\n if (cdHeader.fileName === filename) {\n result = cdHeader;\n break;\n }\n }\n if (!result) {\n throw new Error('File has not been found in the zip archive');\n }\n return result;\n }\n}\n"],"mappings":"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"}
|
|
@@ -11,4 +11,10 @@ export declare function parseHashTable(arrayBuffer: ArrayBuffer): Record<string,
|
|
|
11
11
|
* @returns ready to use hash info
|
|
12
12
|
*/
|
|
13
13
|
export declare function makeHashTableFromZipHeaders(fileProvider: FileProvider): Promise<Record<string, bigint>>;
|
|
14
|
+
/**
|
|
15
|
+
* creates hash file that later can be added to the SLPK archive
|
|
16
|
+
* @param fileProvider SLPK archive where we need to add hash file
|
|
17
|
+
* @returns ArrayBuffer containing hash file
|
|
18
|
+
*/
|
|
19
|
+
export declare function composeHashFile(fileProvider: FileProvider): Promise<ArrayBuffer>;
|
|
14
20
|
//# sourceMappingURL=hash-file-utility.d.ts.map
|