@zip.js/zip.js 2.8.47 → 2.8.49
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/deno.json +1 -1
- package/dist/zip-core-external.js +71 -36
- package/dist/zip-core-external.min.js +1 -1
- package/dist/zip-core.js +71 -36
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core-external.js +72 -37
- package/dist/zip-fs-core-external.min.js +1 -1
- package/dist/zip-fs-core.js +55 -34
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-external.js +72 -37
- package/dist/zip-fs-external.min.js +1 -1
- package/dist/zip-fs-native.js +75 -40
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +73 -38
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +73 -38
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +74 -39
- package/dist/zip-native.min.js +1 -1
- package/dist/zip-web-worker-native.js +1 -1
- package/dist/zip-web-worker.js +1 -1
- package/dist/zip.js +72 -37
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +75 -40
- package/index-native.min.js +1 -1
- package/index.cjs +73 -38
- package/index.min.js +1 -1
- package/lib/core/codec-pool.js +1 -1
- package/lib/core/codec-worker.js +25 -9
- package/lib/core/io.js +3 -23
- package/lib/core/streams/zlib-js/zlib-streams.min.js +1 -1
- package/lib/core/util/blob-temp-stream.js +4 -2
- package/lib/core/util/compatible-streams.js +30 -2
- package/lib/core/util/opfs-temp-stream.js +8 -1
- package/lib/core/util/sync-access-handle-temp-stream.js +8 -1
- package/lib/core/web-worker-base.js +10 -2
- package/lib/core/web-worker-inline-native.js +1 -1
- package/lib/core/web-worker-inline-wasm.js +1 -1
- package/lib/core/zip-fs.js +2 -1
- package/lib/core/zip-reader.js +4 -4
- package/package.json +2 -1
- package/worker-message-property-names.js +1 -1
|
@@ -1901,6 +1901,8 @@ function getInt32(number) {
|
|
|
1901
1901
|
*/
|
|
1902
1902
|
|
|
1903
1903
|
|
|
1904
|
+
const HTTP_HEADER_CONTENT_TYPE = "Content-Type";
|
|
1905
|
+
|
|
1904
1906
|
function toCompatibleReadable(readable) {
|
|
1905
1907
|
if (readable instanceof ReadableStream) {
|
|
1906
1908
|
return readable;
|
|
@@ -1921,6 +1923,29 @@ function toCompatibleReadable(readable) {
|
|
|
1921
1923
|
});
|
|
1922
1924
|
}
|
|
1923
1925
|
|
|
1926
|
+
function streamToBlob(readable, contentType) {
|
|
1927
|
+
readable = toCompatibleReadable(readable);
|
|
1928
|
+
if (responseSupportsGlobalReadable()) {
|
|
1929
|
+
const options = {};
|
|
1930
|
+
if (contentType) {
|
|
1931
|
+
options.headers = [[HTTP_HEADER_CONTENT_TYPE, contentType]];
|
|
1932
|
+
}
|
|
1933
|
+
return new Response(readable, options).blob();
|
|
1934
|
+
}
|
|
1935
|
+
const chunks = [];
|
|
1936
|
+
return readable
|
|
1937
|
+
.pipeTo(new WritableStream({
|
|
1938
|
+
write(chunk) {
|
|
1939
|
+
chunks.push(chunk);
|
|
1940
|
+
}
|
|
1941
|
+
}))
|
|
1942
|
+
.then(() => new Blob(chunks, contentType ? { type: contentType } : {}));
|
|
1943
|
+
}
|
|
1944
|
+
|
|
1945
|
+
function responseSupportsGlobalReadable() {
|
|
1946
|
+
return typeof Blob.prototype.stream != FUNCTION_TYPE || new Blob([]).stream() instanceof ReadableStream;
|
|
1947
|
+
}
|
|
1948
|
+
|
|
1924
1949
|
function toCompatibleWritable(writable) {
|
|
1925
1950
|
if (writable instanceof WritableStream) {
|
|
1926
1951
|
return writable;
|
|
@@ -2685,14 +2710,16 @@ function createWebWorkerInterface(workerData, config) {
|
|
|
2685
2710
|
} else {
|
|
2686
2711
|
webWorkerSupported = false;
|
|
2687
2712
|
}
|
|
2688
|
-
|
|
2689
|
-
if (reader) {
|
|
2690
|
-
reader.releaseLock();
|
|
2691
|
-
}
|
|
2692
|
-
workerData.reader = null;
|
|
2693
|
-
workerData.writer = null;
|
|
2713
|
+
releaseWorkerStreams(workerData);
|
|
2694
2714
|
return runWorker$1(workerData, config);
|
|
2695
2715
|
}
|
|
2716
|
+
if (error && error.codecImportFailed) {
|
|
2717
|
+
if (workerData.reader) {
|
|
2718
|
+
releaseWorkerStreams(workerData);
|
|
2719
|
+
return runWorker$1(workerData, config);
|
|
2720
|
+
}
|
|
2721
|
+
workerData.onTaskFinished();
|
|
2722
|
+
}
|
|
2696
2723
|
throw error;
|
|
2697
2724
|
}
|
|
2698
2725
|
}
|
|
@@ -2829,6 +2856,15 @@ function watchClosedStream(writableSource) {
|
|
|
2829
2856
|
return { writable, closed, abortPipe: () => abortController.abort() };
|
|
2830
2857
|
}
|
|
2831
2858
|
|
|
2859
|
+
function releaseWorkerStreams(workerData) {
|
|
2860
|
+
const { reader } = workerData;
|
|
2861
|
+
if (reader) {
|
|
2862
|
+
reader.releaseLock();
|
|
2863
|
+
}
|
|
2864
|
+
workerData.reader = null;
|
|
2865
|
+
workerData.writer = null;
|
|
2866
|
+
}
|
|
2867
|
+
|
|
2832
2868
|
function terminateWorker$1(workerData) {
|
|
2833
2869
|
const { worker } = workerData;
|
|
2834
2870
|
if (worker) {
|
|
@@ -2896,7 +2932,7 @@ function getWebWorker(url, baseURI, workerData, isModuleType, useBlobURI = true)
|
|
|
2896
2932
|
try {
|
|
2897
2933
|
worker = new Worker(resolvedURI, resolvedOptions);
|
|
2898
2934
|
} catch (error) {
|
|
2899
|
-
if (
|
|
2935
|
+
if (isModuleType) {
|
|
2900
2936
|
return getWebWorker(url, baseURI, workerData, false, useBlobURI);
|
|
2901
2937
|
} else {
|
|
2902
2938
|
throw error;
|
|
@@ -3014,12 +3050,15 @@ async function onMessage({ data }, workerData) {
|
|
|
3014
3050
|
const stale = () => workerData.generation != generation;
|
|
3015
3051
|
try {
|
|
3016
3052
|
if (error) {
|
|
3017
|
-
const { message, stack, code, name, outputSize, cause } = error;
|
|
3053
|
+
const { message, stack, code, name, outputSize, cause, codecImportFailed } = error;
|
|
3018
3054
|
const responseError = new Error(message);
|
|
3019
3055
|
Object.assign(responseError, { stack, code, name, outputSize });
|
|
3020
3056
|
if (cause) {
|
|
3021
3057
|
responseError.cause = Object.assign(new Error(cause.message), { name: cause.name });
|
|
3022
3058
|
}
|
|
3059
|
+
if (codecImportFailed) {
|
|
3060
|
+
responseError.codecImportFailed = true;
|
|
3061
|
+
}
|
|
3023
3062
|
close(responseError);
|
|
3024
3063
|
} else {
|
|
3025
3064
|
if (type == MESSAGE_PULL) {
|
|
@@ -3058,7 +3097,9 @@ async function onMessage({ data }, workerData) {
|
|
|
3058
3097
|
if (writer) {
|
|
3059
3098
|
writer.releaseLock();
|
|
3060
3099
|
}
|
|
3061
|
-
|
|
3100
|
+
if (!(error && error.codecImportFailed)) {
|
|
3101
|
+
onTaskFinished();
|
|
3102
|
+
}
|
|
3062
3103
|
}
|
|
3063
3104
|
}
|
|
3064
3105
|
|
|
@@ -3108,7 +3149,7 @@ async function runWorker(stream, workerOptions) {
|
|
|
3108
3149
|
}
|
|
3109
3150
|
await ensureCodecStreams(format, options.codecURI);
|
|
3110
3151
|
}
|
|
3111
|
-
workerOptions.transferStreams = transferStreams || (transferStreams === UNDEFINED_VALUE && config.transferStreams);
|
|
3152
|
+
workerOptions.transferStreams = !format && (transferStreams || (transferStreams === UNDEFINED_VALUE && config.transferStreams));
|
|
3112
3153
|
const streamCopy = !compressed && !checkCrc32 && !computeCrc32 && !encrypted;
|
|
3113
3154
|
const workerSupported = format === UNDEFINED_VALUE || Boolean(options.codecURI);
|
|
3114
3155
|
workerOptions.useWebWorkers = !streamCopy && workerSupported && (useWebWorkers || (useWebWorkers === UNDEFINED_VALUE && config.useWebWorkers));
|
|
@@ -3264,7 +3305,6 @@ const HTTP_HEADER_CONTENT_ENCODING = "Content-Encoding";
|
|
|
3264
3305
|
const HTTP_HEADER_CONTENT_RANGE = "Content-Range";
|
|
3265
3306
|
const HTTP_HEADER_ACCEPT_RANGES = "Accept-Ranges";
|
|
3266
3307
|
const HTTP_HEADER_RANGE = "Range";
|
|
3267
|
-
const HTTP_HEADER_CONTENT_TYPE = "Content-Type";
|
|
3268
3308
|
const HTTP_HEADER_ETAG = "Etag";
|
|
3269
3309
|
const HTTP_HEADER_LAST_MODIFIED = "Last-Modified";
|
|
3270
3310
|
const HTTP_METHOD_HEAD = "HEAD";
|
|
@@ -3469,10 +3509,6 @@ class BlobReader extends Reader {
|
|
|
3469
3509
|
}
|
|
3470
3510
|
}
|
|
3471
3511
|
|
|
3472
|
-
function responseSupportsGlobalReadable() {
|
|
3473
|
-
return typeof Blob.prototype.stream != FUNCTION_TYPE || new Blob([]).stream() instanceof ReadableStream;
|
|
3474
|
-
}
|
|
3475
|
-
|
|
3476
3512
|
class BlobWriter extends Stream {
|
|
3477
3513
|
|
|
3478
3514
|
constructor(contentType) {
|
|
@@ -3484,22 +3520,7 @@ class BlobWriter extends Stream {
|
|
|
3484
3520
|
return transformStream.writable;
|
|
3485
3521
|
}
|
|
3486
3522
|
});
|
|
3487
|
-
|
|
3488
|
-
const headers = [];
|
|
3489
|
-
if (contentType) {
|
|
3490
|
-
headers.push([HTTP_HEADER_CONTENT_TYPE, contentType]);
|
|
3491
|
-
}
|
|
3492
|
-
writer.blob = new Response(transformStream.readable, { headers }).blob();
|
|
3493
|
-
} else {
|
|
3494
|
-
const chunks = [];
|
|
3495
|
-
writer.blob = transformStream.readable
|
|
3496
|
-
.pipeTo(new WritableStream({
|
|
3497
|
-
write(chunk) {
|
|
3498
|
-
chunks.push(chunk);
|
|
3499
|
-
}
|
|
3500
|
-
}))
|
|
3501
|
-
.then(() => new Blob(chunks, { type: contentType }));
|
|
3502
|
-
}
|
|
3523
|
+
writer.blob = streamToBlob(transformStream.readable, contentType);
|
|
3503
3524
|
writer.blob.catch(() => { });
|
|
3504
3525
|
}
|
|
3505
3526
|
|
|
@@ -4573,7 +4594,7 @@ class ZipReader {
|
|
|
4573
4594
|
const { config } = zipReader;
|
|
4574
4595
|
await initStream(reader);
|
|
4575
4596
|
if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
|
|
4576
|
-
reader = new BlobReader(await
|
|
4597
|
+
reader = new BlobReader(await streamToBlob(reader.readable));
|
|
4577
4598
|
await initStream(reader);
|
|
4578
4599
|
}
|
|
4579
4600
|
if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
|
|
@@ -4842,7 +4863,7 @@ class ZipReader {
|
|
|
4842
4863
|
entry.arrayBuffer = async options => {
|
|
4843
4864
|
const writer = new TransformStream();
|
|
4844
4865
|
const [arrayBuffer] = await Promise.all([
|
|
4845
|
-
|
|
4866
|
+
streamToBlob(writer.readable).then(blob => blob.arrayBuffer()),
|
|
4846
4867
|
fileEntry.getData(writer, entry, zipReader.readRanges, options)]);
|
|
4847
4868
|
return arrayBuffer;
|
|
4848
4869
|
};
|
|
@@ -7650,7 +7671,7 @@ function createOPFSTempStream(options = {}) {
|
|
|
7650
7671
|
|
|
7651
7672
|
async function spillToFile() {
|
|
7652
7673
|
const directoryHandle = await getTempDirectory();
|
|
7653
|
-
fileName =
|
|
7674
|
+
fileName = getRandomFileName$1();
|
|
7654
7675
|
fileHandle = await directoryHandle.getFileHandle(fileName, { create: true });
|
|
7655
7676
|
fileWriter = (await fileHandle.createWritable()).getWriter();
|
|
7656
7677
|
spilled = true;
|
|
@@ -7731,6 +7752,13 @@ function createOPFSTempStream(options = {}) {
|
|
|
7731
7752
|
};
|
|
7732
7753
|
}
|
|
7733
7754
|
|
|
7755
|
+
function getRandomFileName$1() {
|
|
7756
|
+
if (crypto.randomUUID) {
|
|
7757
|
+
return crypto.randomUUID();
|
|
7758
|
+
}
|
|
7759
|
+
return Array.from(crypto.getRandomValues(new Uint8Array(16)), byteValue => byteValue.toString(16).padStart(2, "0")).join("");
|
|
7760
|
+
}
|
|
7761
|
+
|
|
7734
7762
|
/*
|
|
7735
7763
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
7736
7764
|
|
|
@@ -7774,7 +7802,7 @@ function createBlobTempStream(options = {}) {
|
|
|
7774
7802
|
|
|
7775
7803
|
async function spillToBlob() {
|
|
7776
7804
|
const transformStream = new TransformStream();
|
|
7777
|
-
blobPromise =
|
|
7805
|
+
blobPromise = streamToBlob(transformStream.readable);
|
|
7778
7806
|
blobWriter = transformStream.writable.getWriter();
|
|
7779
7807
|
spilled = true;
|
|
7780
7808
|
for (const chunk of memoryChunks) {
|
|
@@ -7914,7 +7942,7 @@ function createSyncAccessHandleTempStream(options = {}) {
|
|
|
7914
7942
|
|
|
7915
7943
|
async function spillToFile() {
|
|
7916
7944
|
const directoryHandle = await getTempDirectory();
|
|
7917
|
-
fileName =
|
|
7945
|
+
fileName = getRandomFileName();
|
|
7918
7946
|
const fileHandle = await directoryHandle.getFileHandle(fileName, { create: true });
|
|
7919
7947
|
accessHandle = await fileHandle.createSyncAccessHandle();
|
|
7920
7948
|
spilled = true;
|
|
@@ -7994,6 +8022,13 @@ function createSyncAccessHandleTempStream(options = {}) {
|
|
|
7994
8022
|
};
|
|
7995
8023
|
}
|
|
7996
8024
|
|
|
8025
|
+
function getRandomFileName() {
|
|
8026
|
+
if (crypto.randomUUID) {
|
|
8027
|
+
return crypto.randomUUID();
|
|
8028
|
+
}
|
|
8029
|
+
return Array.from(crypto.getRandomValues(new Uint8Array(16)), byteValue => byteValue.toString(16).padStart(2, "0")).join("");
|
|
8030
|
+
}
|
|
8031
|
+
|
|
7997
8032
|
/*
|
|
7998
8033
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
7999
8034
|
|
|
@@ -8544,7 +8579,7 @@ class ZipFileEntry extends ZipEntry {
|
|
|
8544
8579
|
await Promise.all([initStream(reader), initStream(writer, uncompressedSize)]);
|
|
8545
8580
|
const { readable } = reader;
|
|
8546
8581
|
zipEntry.uncompressedSize = reader.size;
|
|
8547
|
-
await readable.pipeTo(writer.writable);
|
|
8582
|
+
await toCompatibleReadable(readable).pipeTo(toCompatibleWritable(writer.writable));
|
|
8548
8583
|
return writer.getData ? writer.getData() : writer.writable;
|
|
8549
8584
|
}
|
|
8550
8585
|
}
|