@loaders.gl/zip 4.1.0-alpha.1 → 4.1.0-alpha.3
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 +115 -16
- 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.map +1 -1
- package/dist/hash-file-utility.js.map +1 -1
- package/dist/index.cjs +126 -9
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- 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.map +1 -1
- package/dist/parse-zip/cd-file-header.js +2 -2
- package/dist/parse-zip/cd-file-header.js.map +1 -1
- package/dist/parse-zip/end-of-central-directory.d.ts.map +1 -1
- 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/zip64-info-generation.d.ts +5 -8
- package/dist/parse-zip/zip64-info-generation.d.ts.map +1 -1
- package/dist/parse-zip/zip64-info-generation.js +6 -3
- package/dist/parse-zip/zip64-info-generation.js.map +1 -1
- 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 +5 -5
- package/src/filesystems/zip-filesystem.ts +2 -1
- package/src/hash-file-utility.ts +2 -1
- package/src/index.ts +4 -2
- 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 +5 -3
- package/src/parse-zip/end-of-central-directory.ts +2 -1
- 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/zip64-info-generation.ts +20 -4
- package/src/tar-builder.ts +2 -1
- package/src/zip-loader.ts +2 -1
- package/src/zip-writer.ts +24 -10
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loaders.gl/zip",
|
|
3
|
-
"version": "4.1.0-alpha.
|
|
3
|
+
"version": "4.1.0-alpha.3",
|
|
4
4
|
"description": "Zip Archive Loader",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -38,11 +38,11 @@
|
|
|
38
38
|
"build-bundle": "ocular-bundle ./src/index.ts"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@loaders.gl/compression": "4.1.0-alpha.
|
|
42
|
-
"@loaders.gl/crypto": "4.1.0-alpha.
|
|
43
|
-
"@loaders.gl/loader-utils": "4.1.0-alpha.
|
|
41
|
+
"@loaders.gl/compression": "4.1.0-alpha.3",
|
|
42
|
+
"@loaders.gl/crypto": "4.1.0-alpha.3",
|
|
43
|
+
"@loaders.gl/loader-utils": "4.1.0-alpha.3",
|
|
44
44
|
"jszip": "^3.1.5",
|
|
45
45
|
"md5": "^2.3.0"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "b78075a7cb8d4ecd4aac84805ce74b8ceb400cf7"
|
|
48
48
|
}
|
package/src/hash-file-utility.ts
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// loaders.gl
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
2
3
|
// Copyright (c) vis.gl contributors
|
|
3
4
|
|
|
4
5
|
export {ZipLoader} from './zip-loader';
|
|
@@ -13,7 +14,8 @@ export {
|
|
|
13
14
|
} from './parse-zip/cd-file-header';
|
|
14
15
|
export {
|
|
15
16
|
parseZipLocalFileHeader,
|
|
16
|
-
signature as localHeaderSignature
|
|
17
|
+
signature as localHeaderSignature,
|
|
18
|
+
generateLocalHeader
|
|
17
19
|
} from './parse-zip/local-file-header';
|
|
18
20
|
export {parseEoCDRecord} from './parse-zip/end-of-central-directory';
|
|
19
21
|
export {searchFromTheEnd} from './parse-zip/search-from-the-end';
|
package/src/lib/tar/header.ts
CHANGED
package/src/lib/tar/tar.ts
CHANGED
package/src/lib/tar/types.ts
CHANGED
package/src/lib/tar/utils.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
// loaders.gl
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
2
3
|
// Copyright (c) vis.gl contributors
|
|
3
4
|
|
|
4
5
|
import {FileProvider, compareArrayBuffers, concatenateArrayBuffers} from '@loaders.gl/loader-utils';
|
|
5
6
|
import {parseEoCDRecord} from './end-of-central-directory';
|
|
6
7
|
import {ZipSignature} from './search-from-the-end';
|
|
7
|
-
import {createZip64Info,
|
|
8
|
+
import {createZip64Info, setFieldToNumber} from './zip64-info-generation';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* zip central directory file header info
|
|
@@ -233,8 +234,9 @@ export function generateCDHeader(options: GenerateCDOptions): ArrayBuffer {
|
|
|
233
234
|
const header = new DataView(new ArrayBuffer(46));
|
|
234
235
|
|
|
235
236
|
for (const field of ZIP_HEADER_FIELDS) {
|
|
236
|
-
|
|
237
|
+
setFieldToNumber(
|
|
237
238
|
header,
|
|
239
|
+
field.size,
|
|
238
240
|
field.offset,
|
|
239
241
|
optionsToUse[field.name ?? ''] ?? field.default ?? 0
|
|
240
242
|
);
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
// loaders.gl
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
2
3
|
// Copyright (c) vis.gl contributors
|
|
3
4
|
|
|
4
|
-
import {FileProvider, compareArrayBuffers} from '@loaders.gl/loader-utils';
|
|
5
|
+
import {FileProvider, compareArrayBuffers, concatenateArrayBuffers} from '@loaders.gl/loader-utils';
|
|
5
6
|
import {ZipSignature} from './search-from-the-end';
|
|
7
|
+
import {createZip64Info, setFieldToNumber} from './zip64-info-generation';
|
|
6
8
|
|
|
7
9
|
/**
|
|
8
10
|
* zip local file header info
|
|
@@ -94,3 +96,127 @@ export const parseZipLocalFileHeader = async (
|
|
|
94
96
|
compressionMethod
|
|
95
97
|
};
|
|
96
98
|
};
|
|
99
|
+
|
|
100
|
+
/** info that can be placed into cd header */
|
|
101
|
+
type GenerateLocalOptions = {
|
|
102
|
+
/** CRC-32 of uncompressed data */
|
|
103
|
+
crc32: number;
|
|
104
|
+
/** File name */
|
|
105
|
+
fileName: string;
|
|
106
|
+
/** File size */
|
|
107
|
+
length: number;
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* generates local header for the file
|
|
112
|
+
* @param options info that can be placed into local header
|
|
113
|
+
* @returns buffer with header
|
|
114
|
+
*/
|
|
115
|
+
export function generateLocalHeader(options: GenerateLocalOptions): ArrayBuffer {
|
|
116
|
+
const optionsToUse = {
|
|
117
|
+
...options,
|
|
118
|
+
extraLength: 0,
|
|
119
|
+
fnlength: options.fileName.length
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
let zip64header: ArrayBuffer = new ArrayBuffer(0);
|
|
123
|
+
|
|
124
|
+
const optionsToZip64: any = {};
|
|
125
|
+
if (optionsToUse.length >= 0xffffffff) {
|
|
126
|
+
optionsToZip64.size = optionsToUse.length;
|
|
127
|
+
optionsToUse.length = 0xffffffff;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (Object.keys(optionsToZip64).length) {
|
|
131
|
+
zip64header = createZip64Info(optionsToZip64);
|
|
132
|
+
optionsToUse.extraLength = zip64header.byteLength;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// base length without file name and extra info is static
|
|
136
|
+
const header = new DataView(new ArrayBuffer(Number(FILE_NAME_OFFSET)));
|
|
137
|
+
|
|
138
|
+
for (const field of ZIP_HEADER_FIELDS) {
|
|
139
|
+
setFieldToNumber(
|
|
140
|
+
header,
|
|
141
|
+
field.size,
|
|
142
|
+
field.offset,
|
|
143
|
+
optionsToUse[field.name ?? ''] ?? field.default ?? 0
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const encodedName = new TextEncoder().encode(optionsToUse.fileName);
|
|
148
|
+
|
|
149
|
+
const resHeader = concatenateArrayBuffers(header.buffer, encodedName, zip64header);
|
|
150
|
+
|
|
151
|
+
return resHeader;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const ZIP_HEADER_FIELDS = [
|
|
155
|
+
// Local file header signature = 0x04034b50
|
|
156
|
+
{
|
|
157
|
+
offset: 0,
|
|
158
|
+
size: 4,
|
|
159
|
+
default: new DataView(signature.buffer).getUint32(0, true)
|
|
160
|
+
},
|
|
161
|
+
// Version needed to extract (minimum)
|
|
162
|
+
{
|
|
163
|
+
offset: 4,
|
|
164
|
+
size: 2,
|
|
165
|
+
default: 45
|
|
166
|
+
},
|
|
167
|
+
// General purpose bit flag
|
|
168
|
+
{
|
|
169
|
+
offset: 6,
|
|
170
|
+
size: 2,
|
|
171
|
+
default: 0
|
|
172
|
+
},
|
|
173
|
+
// Compression method
|
|
174
|
+
{
|
|
175
|
+
offset: 8,
|
|
176
|
+
size: 2,
|
|
177
|
+
default: 0
|
|
178
|
+
},
|
|
179
|
+
// File last modification time
|
|
180
|
+
{
|
|
181
|
+
offset: 10,
|
|
182
|
+
size: 2,
|
|
183
|
+
default: 0
|
|
184
|
+
},
|
|
185
|
+
// File last modification date
|
|
186
|
+
{
|
|
187
|
+
offset: 12,
|
|
188
|
+
size: 2,
|
|
189
|
+
default: 0
|
|
190
|
+
},
|
|
191
|
+
// CRC-32 of uncompressed data
|
|
192
|
+
{
|
|
193
|
+
offset: 14,
|
|
194
|
+
size: 4,
|
|
195
|
+
name: 'crc32'
|
|
196
|
+
},
|
|
197
|
+
// Compressed size (or 0xffffffff for ZIP64)
|
|
198
|
+
{
|
|
199
|
+
offset: 18,
|
|
200
|
+
size: 4,
|
|
201
|
+
name: 'length'
|
|
202
|
+
},
|
|
203
|
+
// Uncompressed size (or 0xffffffff for ZIP64)
|
|
204
|
+
{
|
|
205
|
+
offset: 22,
|
|
206
|
+
size: 4,
|
|
207
|
+
name: 'length'
|
|
208
|
+
},
|
|
209
|
+
// File name length (n)
|
|
210
|
+
{
|
|
211
|
+
offset: 26,
|
|
212
|
+
size: 2,
|
|
213
|
+
name: 'fnlength'
|
|
214
|
+
},
|
|
215
|
+
// Extra field length (m)
|
|
216
|
+
{
|
|
217
|
+
offset: 28,
|
|
218
|
+
size: 2,
|
|
219
|
+
default: 0,
|
|
220
|
+
name: 'extraLength'
|
|
221
|
+
}
|
|
222
|
+
];
|
|
@@ -41,15 +41,31 @@ export function createZip64Info(options: Zip64Options): ArrayBuffer {
|
|
|
41
41
|
* @param offset offset of the writing start
|
|
42
42
|
* @param value value to be written
|
|
43
43
|
*/
|
|
44
|
-
type NumberSetter = (header: DataView, offset: number, value: number) => void;
|
|
44
|
+
type NumberSetter = (header: DataView, offset: number, value: number | bigint) => void;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Writes values into buffer according to the bytes amount
|
|
48
|
+
* @param header header where to write the data
|
|
49
|
+
* @param fieldSize size of the field in bytes
|
|
50
|
+
* @param fieldOffset offset of the field
|
|
51
|
+
* @param value value to be written
|
|
52
|
+
*/
|
|
53
|
+
export function setFieldToNumber(
|
|
54
|
+
header: DataView,
|
|
55
|
+
fieldSize: number,
|
|
56
|
+
fieldOffset: number,
|
|
57
|
+
value: number | bigint
|
|
58
|
+
): void {
|
|
59
|
+
NUMBER_SETTERS[fieldSize](header, fieldOffset, value);
|
|
60
|
+
}
|
|
45
61
|
|
|
46
62
|
/** functions to write values into buffer according to the bytes amount */
|
|
47
|
-
|
|
63
|
+
const NUMBER_SETTERS: {[key: number]: NumberSetter} = {
|
|
48
64
|
2: (header, offset, value) => {
|
|
49
|
-
header.setUint16(offset, value, true);
|
|
65
|
+
header.setUint16(offset, Number(value), true);
|
|
50
66
|
},
|
|
51
67
|
4: (header, offset, value) => {
|
|
52
|
-
header.setUint32(offset, value, true);
|
|
68
|
+
header.setUint32(offset, Number(value), true);
|
|
53
69
|
},
|
|
54
70
|
8: (header, offset, value) => {
|
|
55
71
|
header.setBigUint64(offset, BigInt(value), true);
|
package/src/tar-builder.ts
CHANGED
package/src/zip-loader.ts
CHANGED
package/src/zip-writer.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
// loaders.gl
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
2
3
|
// Copyright (c) vis.gl contributors
|
|
3
4
|
|
|
4
|
-
import type {
|
|
5
|
+
import type {WriterWithEncoder, WriterOptions} from '@loaders.gl/loader-utils';
|
|
5
6
|
import JSZip, {JSZipGeneratorOptions} from 'jszip';
|
|
6
7
|
|
|
8
|
+
// @ts-ignore TS2304: Cannot find name '__VERSION__'.
|
|
9
|
+
const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
|
|
10
|
+
|
|
7
11
|
export type ZipWriterOptions = WriterOptions & {
|
|
8
12
|
zip?: {
|
|
9
13
|
onUpdate?: (metadata: {percent: number}) => void;
|
|
@@ -15,19 +19,27 @@ export type ZipWriterOptions = WriterOptions & {
|
|
|
15
19
|
/**
|
|
16
20
|
* Zip exporter
|
|
17
21
|
*/
|
|
18
|
-
export const ZipWriter:
|
|
22
|
+
export const ZipWriter: WriterWithEncoder<Record<string, ArrayBuffer>, never, ZipWriterOptions> = {
|
|
19
23
|
name: 'Zip Archive',
|
|
24
|
+
id: 'zip',
|
|
25
|
+
module: 'zip',
|
|
26
|
+
version: VERSION,
|
|
20
27
|
extensions: ['zip'],
|
|
21
28
|
category: 'archive',
|
|
22
29
|
mimeTypes: ['application/zip'],
|
|
23
|
-
|
|
30
|
+
options: {
|
|
31
|
+
zip: {
|
|
32
|
+
onUpdate: () => {}
|
|
33
|
+
},
|
|
34
|
+
jszip: {}
|
|
35
|
+
},
|
|
24
36
|
encode: encodeZipAsync
|
|
25
37
|
};
|
|
26
38
|
|
|
27
39
|
async function encodeZipAsync(
|
|
28
40
|
fileMap: Record<string, ArrayBuffer>,
|
|
29
41
|
options: ZipWriterOptions = {}
|
|
30
|
-
) {
|
|
42
|
+
): Promise<ArrayBuffer> {
|
|
31
43
|
const jsZip = new JSZip();
|
|
32
44
|
// add files to the zip
|
|
33
45
|
for (const subFileName in fileMap) {
|
|
@@ -38,14 +50,16 @@ async function encodeZipAsync(
|
|
|
38
50
|
jsZip.file(subFileName, subFileData, options?.jszip || {});
|
|
39
51
|
}
|
|
40
52
|
|
|
41
|
-
|
|
42
|
-
const jszipOptions: JSZipGeneratorOptions = {...options?.jszip,
|
|
43
|
-
const {onUpdate = () => {}} = options;
|
|
53
|
+
const zipOptions = {...ZipWriter.options.zip, ...options?.zip};
|
|
54
|
+
const jszipOptions: JSZipGeneratorOptions = {...ZipWriter.options?.jszip, ...options.jszip};
|
|
44
55
|
|
|
45
56
|
try {
|
|
46
|
-
return await jsZip.generateAsync(
|
|
57
|
+
return await jsZip.generateAsync(
|
|
58
|
+
{...jszipOptions, type: 'arraybuffer'}, // generate an arraybuffer
|
|
59
|
+
zipOptions.onUpdate
|
|
60
|
+
);
|
|
47
61
|
} catch (error) {
|
|
48
|
-
options.log.error(`Unable to
|
|
62
|
+
options.log.error(`Unable to encode zip archive: ${error}`);
|
|
49
63
|
throw error;
|
|
50
64
|
}
|
|
51
65
|
}
|