@loaders.gl/zip 4.1.0-alpha.9 → 4.1.1

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 (35) hide show
  1. package/dist/dist.dev.js +575 -24
  2. package/dist/hash-file-utility.d.ts +15 -2
  3. package/dist/hash-file-utility.d.ts.map +1 -1
  4. package/dist/hash-file-utility.js +16 -8
  5. package/dist/hash-file-utility.js.map +1 -1
  6. package/dist/index.cjs +260 -9
  7. package/dist/index.d.ts +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +1 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/parse-zip/end-of-central-directory.d.ts +17 -1
  12. package/dist/parse-zip/end-of-central-directory.d.ts.map +1 -1
  13. package/dist/parse-zip/end-of-central-directory.js +121 -2
  14. package/dist/parse-zip/end-of-central-directory.js.map +1 -1
  15. package/dist/parse-zip/zip-composition.d.ts +38 -0
  16. package/dist/parse-zip/zip-composition.d.ts.map +1 -0
  17. package/dist/parse-zip/zip-composition.js +114 -0
  18. package/dist/parse-zip/zip-composition.js.map +1 -0
  19. package/dist/parse-zip/zip64-info-generation.js +2 -2
  20. package/dist/parse-zip/zip64-info-generation.js.map +1 -1
  21. package/dist/zip-loader.js +1 -1
  22. package/dist/zip-loader.js.map +1 -1
  23. package/dist/zip-writer.js +1 -1
  24. package/dist/zip-writer.js.map +1 -1
  25. package/package.json +7 -7
  26. package/src/hash-file-utility.ts +44 -9
  27. package/src/index.ts +1 -1
  28. package/src/parse-zip/end-of-central-directory.ts +241 -3
  29. package/src/parse-zip/zip-composition.ts +234 -0
  30. package/src/parse-zip/zip64-info-generation.ts +3 -3
  31. package/dist/parse-zip/zip-compozition.d.ts +0 -8
  32. package/dist/parse-zip/zip-compozition.d.ts.map +0 -1
  33. package/dist/parse-zip/zip-compozition.js +0 -43
  34. package/dist/parse-zip/zip-compozition.js.map +0 -1
  35. package/src/parse-zip/zip-compozition.ts +0 -113
@@ -1,4 +1,4 @@
1
- import { compareArrayBuffers } from '@loaders.gl/loader-utils';
1
+ import { compareArrayBuffers, concatenateArrayBuffers } from '@loaders.gl/loader-utils';
2
2
  import { searchFromTheEnd } from "./search-from-the-end.js";
3
3
  import { setFieldToNumber } from "./zip64-info-generation.js";
4
4
  const eoCDSignature = new Uint8Array([0x50, 0x4b, 0x05, 0x06]);
@@ -8,11 +8,13 @@ const CD_RECORDS_NUMBER_OFFSET = 8n;
8
8
  const CD_RECORDS_NUMBER_ON_DISC_OFFSET = 10n;
9
9
  const CD_CD_BYTE_SIZE_OFFSET = 12n;
10
10
  const CD_START_OFFSET_OFFSET = 16n;
11
+ const CD_COMMENT_OFFSET = 22n;
11
12
  const ZIP64_EOCD_START_OFFSET_OFFSET = 8n;
12
13
  const ZIP64_CD_RECORDS_NUMBER_OFFSET = 24n;
13
14
  const ZIP64_CD_RECORDS_NUMBER_ON_DISC_OFFSET = 32n;
14
15
  const ZIP64_CD_CD_BYTE_SIZE_OFFSET = 40n;
15
16
  const ZIP64_CD_START_OFFSET_OFFSET = 48n;
17
+ const ZIP64_COMMENT_OFFSET = 56n;
16
18
  export const parseEoCDRecord = async file => {
17
19
  const zipEoCDOffset = await searchFromTheEnd(file, eoCDSignature);
18
20
  let cdRecordsNumber = BigInt(await file.getUint16(zipEoCDOffset + CD_RECORDS_NUMBER_OFFSET));
@@ -41,7 +43,7 @@ export const parseEoCDRecord = async file => {
41
43
  }
42
44
  };
43
45
  };
44
- export async function updateEoCD(eocdBody, oldEoCDOffsets, newCDStartOffset, eocdStartOffset, newCDRecordsNumber) {
46
+ export function updateEoCD(eocdBody, oldEoCDOffsets, newCDStartOffset, eocdStartOffset, newCDRecordsNumber) {
45
47
  const eocd = new DataView(eocdBody);
46
48
  const classicEoCDOffset = oldEoCDOffsets.zip64EoCDOffset ? oldEoCDOffsets.zipEoCDOffset - oldEoCDOffsets.zip64EoCDOffset : 0n;
47
49
  if (Number(newCDRecordsNumber) <= 0xffff) {
@@ -64,4 +66,121 @@ export async function updateEoCD(eocdBody, oldEoCDOffsets, newCDStartOffset, eoc
64
66
  }
65
67
  return new Uint8Array(eocd.buffer);
66
68
  }
69
+ export function generateEoCD(options) {
70
+ const header = new DataView(new ArrayBuffer(Number(CD_COMMENT_OFFSET)));
71
+ for (const field of EOCD_FIELDS) {
72
+ var _ref, _options, _field$name;
73
+ setFieldToNumber(header, field.size, field.offset, (_ref = (_options = options[(_field$name = field.name) !== null && _field$name !== void 0 ? _field$name : '']) !== null && _options !== void 0 ? _options : field.default) !== null && _ref !== void 0 ? _ref : 0);
74
+ }
75
+ const locator = generateZip64InfoLocator(options);
76
+ const zip64Record = generateZip64Info(options);
77
+ return concatenateArrayBuffers(zip64Record, locator, header.buffer);
78
+ }
79
+ const EOCD_FIELDS = [{
80
+ offset: 0,
81
+ size: 4,
82
+ default: new DataView(eoCDSignature.buffer).getUint32(0, true)
83
+ }, {
84
+ offset: 4,
85
+ size: 2,
86
+ default: 0
87
+ }, {
88
+ offset: 6,
89
+ size: 2,
90
+ default: 0
91
+ }, {
92
+ offset: 8,
93
+ size: 2,
94
+ name: 'recordsNumber'
95
+ }, {
96
+ offset: 10,
97
+ size: 2,
98
+ name: 'recordsNumber'
99
+ }, {
100
+ offset: 12,
101
+ size: 4,
102
+ name: 'cdSize'
103
+ }, {
104
+ offset: 16,
105
+ size: 4,
106
+ name: 'cdOffset'
107
+ }, {
108
+ offset: 20,
109
+ size: 2,
110
+ default: 0
111
+ }];
112
+ function generateZip64Info(options) {
113
+ const record = new DataView(new ArrayBuffer(Number(ZIP64_COMMENT_OFFSET)));
114
+ for (const field of ZIP64_EOCD_FIELDS) {
115
+ var _ref2, _options2, _field$name2;
116
+ setFieldToNumber(record, field.size, field.offset, (_ref2 = (_options2 = options[(_field$name2 = field.name) !== null && _field$name2 !== void 0 ? _field$name2 : '']) !== null && _options2 !== void 0 ? _options2 : field.default) !== null && _ref2 !== void 0 ? _ref2 : 0);
117
+ }
118
+ return record.buffer;
119
+ }
120
+ function generateZip64InfoLocator(options) {
121
+ const locator = new DataView(new ArrayBuffer(Number(20)));
122
+ for (const field of ZIP64_EOCD_LOCATOR_FIELDS) {
123
+ var _ref3, _options3, _field$name3;
124
+ setFieldToNumber(locator, field.size, field.offset, (_ref3 = (_options3 = options[(_field$name3 = field.name) !== null && _field$name3 !== void 0 ? _field$name3 : '']) !== null && _options3 !== void 0 ? _options3 : field.default) !== null && _ref3 !== void 0 ? _ref3 : 0);
125
+ }
126
+ return locator.buffer;
127
+ }
128
+ const ZIP64_EOCD_LOCATOR_FIELDS = [{
129
+ offset: 0,
130
+ size: 4,
131
+ default: new DataView(zip64EoCDLocatorSignature.buffer).getUint32(0, true)
132
+ }, {
133
+ offset: 4,
134
+ size: 4,
135
+ default: 0
136
+ }, {
137
+ offset: 8,
138
+ size: 8,
139
+ name: 'eoCDStart'
140
+ }, {
141
+ offset: 16,
142
+ size: 4,
143
+ default: 1
144
+ }];
145
+ const ZIP64_EOCD_FIELDS = [{
146
+ offset: 0,
147
+ size: 4,
148
+ default: new DataView(zip64EoCDSignature.buffer).getUint32(0, true)
149
+ }, {
150
+ offset: 4,
151
+ size: 8,
152
+ default: 44
153
+ }, {
154
+ offset: 12,
155
+ size: 2,
156
+ default: 45
157
+ }, {
158
+ offset: 14,
159
+ size: 2,
160
+ default: 45
161
+ }, {
162
+ offset: 16,
163
+ size: 4,
164
+ default: 0
165
+ }, {
166
+ offset: 20,
167
+ size: 4,
168
+ default: 0
169
+ }, {
170
+ offset: 24,
171
+ size: 8,
172
+ name: 'recordsNumber'
173
+ }, {
174
+ offset: 32,
175
+ size: 8,
176
+ name: 'recordsNumber'
177
+ }, {
178
+ offset: 40,
179
+ size: 8,
180
+ name: 'cdSize'
181
+ }, {
182
+ offset: 48,
183
+ size: 8,
184
+ name: 'cdOffset'
185
+ }];
67
186
  //# sourceMappingURL=end-of-central-directory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"end-of-central-directory.js","names":["compareArrayBuffers","searchFromTheEnd","setFieldToNumber","eoCDSignature","Uint8Array","zip64EoCDLocatorSignature","zip64EoCDSignature","CD_RECORDS_NUMBER_OFFSET","CD_RECORDS_NUMBER_ON_DISC_OFFSET","CD_CD_BYTE_SIZE_OFFSET","CD_START_OFFSET_OFFSET","ZIP64_EOCD_START_OFFSET_OFFSET","ZIP64_CD_RECORDS_NUMBER_OFFSET","ZIP64_CD_RECORDS_NUMBER_ON_DISC_OFFSET","ZIP64_CD_CD_BYTE_SIZE_OFFSET","ZIP64_CD_START_OFFSET_OFFSET","parseEoCDRecord","file","zipEoCDOffset","cdRecordsNumber","BigInt","getUint16","cdStartOffset","getUint32","zip64EoCDLocatorOffset","zip64EoCDOffset","magicBytes","slice","getBigUint64","endOfCDMagicBytes","buffer","Error","offsets","updateEoCD","eocdBody","oldEoCDOffsets","newCDStartOffset","eocdStartOffset","newCDRecordsNumber","eocd","DataView","classicEoCDOffset","Number","locatorOffset"],"sources":["../../src/parse-zip/end-of-central-directory.ts"],"sourcesContent":["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {FileProvider, compareArrayBuffers} from '@loaders.gl/loader-utils';\nimport {ZipSignature, searchFromTheEnd} from './search-from-the-end';\nimport {setFieldToNumber} from './zip64-info-generation';\n\n/**\n * End of central directory info\n * according to https://en.wikipedia.org/wiki/ZIP_(file_format)\n */\nexport type ZipEoCDRecord = {\n /** Relative offset of local file header */\n cdStartOffset: bigint;\n /** Relative offset of local file header */\n cdRecordsNumber: bigint;\n offsets: ZipEoCDRecordOffsets;\n};\n\n/**\n * End of central directory offsets\n * according to https://en.wikipedia.org/wiki/ZIP_(file_format)\n */\nexport type ZipEoCDRecordOffsets = {\n zipEoCDOffset: bigint;\n\n zip64EoCDOffset?: bigint;\n zip64EoCDLocatorOffset?: bigint;\n};\n\nconst eoCDSignature: ZipSignature = new Uint8Array([0x50, 0x4b, 0x05, 0x06]);\nconst zip64EoCDLocatorSignature = new Uint8Array([0x50, 0x4b, 0x06, 0x07]);\nconst zip64EoCDSignature = new Uint8Array([0x50, 0x4b, 0x06, 0x06]);\n\n// offsets accroding to https://en.wikipedia.org/wiki/ZIP_(file_format)\nconst CD_RECORDS_NUMBER_OFFSET = 8n;\nconst CD_RECORDS_NUMBER_ON_DISC_OFFSET = 10n;\nconst CD_CD_BYTE_SIZE_OFFSET = 12n;\nconst CD_START_OFFSET_OFFSET = 16n;\nconst ZIP64_EOCD_START_OFFSET_OFFSET = 8n;\nconst ZIP64_CD_RECORDS_NUMBER_OFFSET = 24n;\nconst ZIP64_CD_RECORDS_NUMBER_ON_DISC_OFFSET = 32n;\nconst ZIP64_CD_CD_BYTE_SIZE_OFFSET = 40n;\nconst ZIP64_CD_START_OFFSET_OFFSET = 48n;\n\n/**\n * Parses end of central directory record of zip file\n * @param file - FileProvider instance\n * @returns Info from the header\n */\nexport const parseEoCDRecord = async (file: FileProvider): Promise<ZipEoCDRecord> => {\n const zipEoCDOffset = await searchFromTheEnd(file, eoCDSignature);\n\n let cdRecordsNumber = BigInt(await file.getUint16(zipEoCDOffset + CD_RECORDS_NUMBER_OFFSET));\n let cdStartOffset = BigInt(await file.getUint32(zipEoCDOffset + CD_START_OFFSET_OFFSET));\n\n let zip64EoCDLocatorOffset = zipEoCDOffset - 20n;\n let zip64EoCDOffset = 0n;\n\n const magicBytes = await file.slice(zip64EoCDLocatorOffset, zip64EoCDLocatorOffset + 4n);\n if (compareArrayBuffers(magicBytes, zip64EoCDLocatorSignature)) {\n zip64EoCDOffset = await file.getBigUint64(\n zip64EoCDLocatorOffset + ZIP64_EOCD_START_OFFSET_OFFSET\n );\n\n const endOfCDMagicBytes = await file.slice(zip64EoCDOffset, zip64EoCDOffset + 4n);\n if (!compareArrayBuffers(endOfCDMagicBytes, zip64EoCDSignature.buffer)) {\n throw new Error('zip64 EoCD not found');\n }\n\n cdRecordsNumber = await file.getBigUint64(zip64EoCDOffset + ZIP64_CD_RECORDS_NUMBER_OFFSET);\n cdStartOffset = await file.getBigUint64(zip64EoCDOffset + ZIP64_CD_START_OFFSET_OFFSET);\n } else {\n zip64EoCDLocatorOffset = 0n;\n }\n\n return {\n cdRecordsNumber,\n cdStartOffset,\n offsets: {\n zip64EoCDOffset,\n zip64EoCDLocatorOffset,\n zipEoCDOffset\n }\n };\n};\n\n/**\n * updates EoCD record to add more files to the archieve\n * @param eocdBody buffer containing header\n * @param oldEoCDOffsets info read from EoCD record befor updating\n * @param newCDStartOffset CD start offset to be updated\n * @param eocdStartOffset EoCD start offset to be updated\n * @returns new EoCD header\n */\nexport async function updateEoCD(\n eocdBody: ArrayBuffer,\n oldEoCDOffsets: ZipEoCDRecordOffsets,\n newCDStartOffset: bigint,\n eocdStartOffset: bigint,\n newCDRecordsNumber: bigint\n): Promise<Uint8Array> {\n const eocd = new DataView(eocdBody);\n\n const classicEoCDOffset = oldEoCDOffsets.zip64EoCDOffset\n ? oldEoCDOffsets.zipEoCDOffset - oldEoCDOffsets.zip64EoCDOffset\n : 0n;\n\n // updating classic EoCD record with new CD records number in general and on disc\n if (Number(newCDRecordsNumber) <= 0xffff) {\n setFieldToNumber(eocd, 2, classicEoCDOffset + CD_RECORDS_NUMBER_OFFSET, newCDRecordsNumber);\n setFieldToNumber(\n eocd,\n 2,\n classicEoCDOffset + CD_RECORDS_NUMBER_ON_DISC_OFFSET,\n newCDRecordsNumber\n );\n }\n\n // updating zip64 EoCD record with new size of CD\n if (eocdStartOffset - newCDStartOffset <= 0xffffffff) {\n setFieldToNumber(\n eocd,\n 4,\n classicEoCDOffset + CD_CD_BYTE_SIZE_OFFSET,\n eocdStartOffset - newCDStartOffset\n );\n }\n\n // updating classic EoCD record with new CD start offset\n if (newCDStartOffset < 0xffffffff) {\n setFieldToNumber(eocd, 4, classicEoCDOffset + CD_START_OFFSET_OFFSET, newCDStartOffset);\n }\n\n // updating zip64 EoCD locator and record with new EoCD record start offset and cd records number\n if (oldEoCDOffsets.zip64EoCDLocatorOffset && oldEoCDOffsets.zip64EoCDOffset) {\n // updating zip64 EoCD locator with new EoCD record start offset\n const locatorOffset = oldEoCDOffsets.zip64EoCDLocatorOffset - oldEoCDOffsets.zip64EoCDOffset;\n setFieldToNumber(eocd, 8, locatorOffset + ZIP64_EOCD_START_OFFSET_OFFSET, eocdStartOffset);\n\n // updating zip64 EoCD record with new cd start offset\n setFieldToNumber(eocd, 8, ZIP64_CD_START_OFFSET_OFFSET, newCDStartOffset);\n\n // updating zip64 EoCD record with new cd records number\n setFieldToNumber(eocd, 8, ZIP64_CD_RECORDS_NUMBER_OFFSET, newCDRecordsNumber);\n setFieldToNumber(eocd, 8, ZIP64_CD_RECORDS_NUMBER_ON_DISC_OFFSET, newCDRecordsNumber);\n\n // updating zip64 EoCD record with new size of CD\n setFieldToNumber(eocd, 8, ZIP64_CD_CD_BYTE_SIZE_OFFSET, eocdStartOffset - newCDStartOffset);\n }\n\n return new Uint8Array(eocd.buffer);\n}\n"],"mappings":"AAIA,SAAsBA,mBAAmB,QAAO,0BAA0B;AAAC,SACrDC,gBAAgB;AAAA,SAC9BC,gBAAgB;AAyBxB,MAAMC,aAA2B,GAAG,IAAIC,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC5E,MAAMC,yBAAyB,GAAG,IAAID,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC1E,MAAME,kBAAkB,GAAG,IAAIF,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAGnE,MAAMG,wBAAwB,GAAG,EAAE;AACnC,MAAMC,gCAAgC,GAAG,GAAG;AAC5C,MAAMC,sBAAsB,GAAG,GAAG;AAClC,MAAMC,sBAAsB,GAAG,GAAG;AAClC,MAAMC,8BAA8B,GAAG,EAAE;AACzC,MAAMC,8BAA8B,GAAG,GAAG;AAC1C,MAAMC,sCAAsC,GAAG,GAAG;AAClD,MAAMC,4BAA4B,GAAG,GAAG;AACxC,MAAMC,4BAA4B,GAAG,GAAG;AAOxC,OAAO,MAAMC,eAAe,GAAG,MAAOC,IAAkB,IAA6B;EACnF,MAAMC,aAAa,GAAG,MAAMjB,gBAAgB,CAACgB,IAAI,EAAEd,aAAa,CAAC;EAEjE,IAAIgB,eAAe,GAAGC,MAAM,CAAC,MAAMH,IAAI,CAACI,SAAS,CAACH,aAAa,GAAGX,wBAAwB,CAAC,CAAC;EAC5F,IAAIe,aAAa,GAAGF,MAAM,CAAC,MAAMH,IAAI,CAACM,SAAS,CAACL,aAAa,GAAGR,sBAAsB,CAAC,CAAC;EAExF,IAAIc,sBAAsB,GAAGN,aAAa,GAAG,GAAG;EAChD,IAAIO,eAAe,GAAG,EAAE;EAExB,MAAMC,UAAU,GAAG,MAAMT,IAAI,CAACU,KAAK,CAACH,sBAAsB,EAAEA,sBAAsB,GAAG,EAAE,CAAC;EACxF,IAAIxB,mBAAmB,CAAC0B,UAAU,EAAErB,yBAAyB,CAAC,EAAE;IAC9DoB,eAAe,GAAG,MAAMR,IAAI,CAACW,YAAY,CACvCJ,sBAAsB,GAAGb,8BAC3B,CAAC;IAED,MAAMkB,iBAAiB,GAAG,MAAMZ,IAAI,CAACU,KAAK,CAACF,eAAe,EAAEA,eAAe,GAAG,EAAE,CAAC;IACjF,IAAI,CAACzB,mBAAmB,CAAC6B,iBAAiB,EAAEvB,kBAAkB,CAACwB,MAAM,CAAC,EAAE;MACtE,MAAM,IAAIC,KAAK,CAAC,sBAAsB,CAAC;IACzC;IAEAZ,eAAe,GAAG,MAAMF,IAAI,CAACW,YAAY,CAACH,eAAe,GAAGb,8BAA8B,CAAC;IAC3FU,aAAa,GAAG,MAAML,IAAI,CAACW,YAAY,CAACH,eAAe,GAAGV,4BAA4B,CAAC;EACzF,CAAC,MAAM;IACLS,sBAAsB,GAAG,EAAE;EAC7B;EAEA,OAAO;IACLL,eAAe;IACfG,aAAa;IACbU,OAAO,EAAE;MACPP,eAAe;MACfD,sBAAsB;MACtBN;IACF;EACF,CAAC;AACH,CAAC;AAUD,OAAO,eAAee,UAAUA,CAC9BC,QAAqB,EACrBC,cAAoC,EACpCC,gBAAwB,EACxBC,eAAuB,EACvBC,kBAA0B,EACL;EACrB,MAAMC,IAAI,GAAG,IAAIC,QAAQ,CAACN,QAAQ,CAAC;EAEnC,MAAMO,iBAAiB,GAAGN,cAAc,CAACV,eAAe,GACpDU,cAAc,CAACjB,aAAa,GAAGiB,cAAc,CAACV,eAAe,GAC7D,EAAE;EAGN,IAAIiB,MAAM,CAACJ,kBAAkB,CAAC,IAAI,MAAM,EAAE;IACxCpC,gBAAgB,CAACqC,IAAI,EAAE,CAAC,EAAEE,iBAAiB,GAAGlC,wBAAwB,EAAE+B,kBAAkB,CAAC;IAC3FpC,gBAAgB,CACdqC,IAAI,EACJ,CAAC,EACDE,iBAAiB,GAAGjC,gCAAgC,EACpD8B,kBACF,CAAC;EACH;EAGA,IAAID,eAAe,GAAGD,gBAAgB,IAAI,UAAU,EAAE;IACpDlC,gBAAgB,CACdqC,IAAI,EACJ,CAAC,EACDE,iBAAiB,GAAGhC,sBAAsB,EAC1C4B,eAAe,GAAGD,gBACpB,CAAC;EACH;EAGA,IAAIA,gBAAgB,GAAG,UAAU,EAAE;IACjClC,gBAAgB,CAACqC,IAAI,EAAE,CAAC,EAAEE,iBAAiB,GAAG/B,sBAAsB,EAAE0B,gBAAgB,CAAC;EACzF;EAGA,IAAID,cAAc,CAACX,sBAAsB,IAAIW,cAAc,CAACV,eAAe,EAAE;IAE3E,MAAMkB,aAAa,GAAGR,cAAc,CAACX,sBAAsB,GAAGW,cAAc,CAACV,eAAe;IAC5FvB,gBAAgB,CAACqC,IAAI,EAAE,CAAC,EAAEI,aAAa,GAAGhC,8BAA8B,EAAE0B,eAAe,CAAC;IAG1FnC,gBAAgB,CAACqC,IAAI,EAAE,CAAC,EAAExB,4BAA4B,EAAEqB,gBAAgB,CAAC;IAGzElC,gBAAgB,CAACqC,IAAI,EAAE,CAAC,EAAE3B,8BAA8B,EAAE0B,kBAAkB,CAAC;IAC7EpC,gBAAgB,CAACqC,IAAI,EAAE,CAAC,EAAE1B,sCAAsC,EAAEyB,kBAAkB,CAAC;IAGrFpC,gBAAgB,CAACqC,IAAI,EAAE,CAAC,EAAEzB,4BAA4B,EAAEuB,eAAe,GAAGD,gBAAgB,CAAC;EAC7F;EAEA,OAAO,IAAIhC,UAAU,CAACmC,IAAI,CAACT,MAAM,CAAC;AACpC"}
1
+ {"version":3,"file":"end-of-central-directory.js","names":["compareArrayBuffers","concatenateArrayBuffers","searchFromTheEnd","setFieldToNumber","eoCDSignature","Uint8Array","zip64EoCDLocatorSignature","zip64EoCDSignature","CD_RECORDS_NUMBER_OFFSET","CD_RECORDS_NUMBER_ON_DISC_OFFSET","CD_CD_BYTE_SIZE_OFFSET","CD_START_OFFSET_OFFSET","CD_COMMENT_OFFSET","ZIP64_EOCD_START_OFFSET_OFFSET","ZIP64_CD_RECORDS_NUMBER_OFFSET","ZIP64_CD_RECORDS_NUMBER_ON_DISC_OFFSET","ZIP64_CD_CD_BYTE_SIZE_OFFSET","ZIP64_CD_START_OFFSET_OFFSET","ZIP64_COMMENT_OFFSET","parseEoCDRecord","file","zipEoCDOffset","cdRecordsNumber","BigInt","getUint16","cdStartOffset","getUint32","zip64EoCDLocatorOffset","zip64EoCDOffset","magicBytes","slice","getBigUint64","endOfCDMagicBytes","buffer","Error","offsets","updateEoCD","eocdBody","oldEoCDOffsets","newCDStartOffset","eocdStartOffset","newCDRecordsNumber","eocd","DataView","classicEoCDOffset","Number","locatorOffset","generateEoCD","options","header","ArrayBuffer","field","EOCD_FIELDS","_ref","_options","_field$name","size","offset","name","default","locator","generateZip64InfoLocator","zip64Record","generateZip64Info","record","ZIP64_EOCD_FIELDS","_ref2","_options2","_field$name2","ZIP64_EOCD_LOCATOR_FIELDS","_ref3","_options3","_field$name3"],"sources":["../../src/parse-zip/end-of-central-directory.ts"],"sourcesContent":["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {FileProvider, compareArrayBuffers, concatenateArrayBuffers} from '@loaders.gl/loader-utils';\nimport {ZipSignature, searchFromTheEnd} from './search-from-the-end';\nimport {setFieldToNumber} from './zip64-info-generation';\n\n/**\n * End of central directory info\n * according to https://en.wikipedia.org/wiki/ZIP_(file_format)\n */\nexport type ZipEoCDRecord = {\n /** Relative offset of local file header */\n cdStartOffset: bigint;\n /** Relative offset of local file header */\n cdRecordsNumber: bigint;\n offsets: ZipEoCDRecordOffsets;\n};\n\n/**\n * End of central directory offsets\n * according to https://en.wikipedia.org/wiki/ZIP_(file_format)\n */\nexport type ZipEoCDRecordOffsets = {\n zipEoCDOffset: bigint;\n\n zip64EoCDOffset?: bigint;\n zip64EoCDLocatorOffset?: bigint;\n};\n\n/**\n * Data to generate End of central directory record\n * according to https://en.wikipedia.org/wiki/ZIP_(file_format)\n */\nexport type ZipEoCDGenerationOptions = {\n recordsNumber: number;\n cdSize: number;\n cdOffset: bigint;\n eoCDStart: bigint;\n};\n\nconst eoCDSignature: ZipSignature = new Uint8Array([0x50, 0x4b, 0x05, 0x06]);\nconst zip64EoCDLocatorSignature = new Uint8Array([0x50, 0x4b, 0x06, 0x07]);\nconst zip64EoCDSignature = new Uint8Array([0x50, 0x4b, 0x06, 0x06]);\n\n// offsets accroding to https://en.wikipedia.org/wiki/ZIP_(file_format)\nconst CD_RECORDS_NUMBER_OFFSET = 8n;\nconst CD_RECORDS_NUMBER_ON_DISC_OFFSET = 10n;\nconst CD_CD_BYTE_SIZE_OFFSET = 12n;\nconst CD_START_OFFSET_OFFSET = 16n;\nconst CD_COMMENT_OFFSET = 22n;\nconst ZIP64_EOCD_START_OFFSET_OFFSET = 8n;\nconst ZIP64_CD_RECORDS_NUMBER_OFFSET = 24n;\nconst ZIP64_CD_RECORDS_NUMBER_ON_DISC_OFFSET = 32n;\nconst ZIP64_CD_CD_BYTE_SIZE_OFFSET = 40n;\nconst ZIP64_CD_START_OFFSET_OFFSET = 48n;\nconst ZIP64_COMMENT_OFFSET = 56n;\n\n/**\n * Parses end of central directory record of zip file\n * @param file - FileProvider instance\n * @returns Info from the header\n */\nexport const parseEoCDRecord = async (file: FileProvider): Promise<ZipEoCDRecord> => {\n const zipEoCDOffset = await searchFromTheEnd(file, eoCDSignature);\n\n let cdRecordsNumber = BigInt(await file.getUint16(zipEoCDOffset + CD_RECORDS_NUMBER_OFFSET));\n let cdStartOffset = BigInt(await file.getUint32(zipEoCDOffset + CD_START_OFFSET_OFFSET));\n\n let zip64EoCDLocatorOffset = zipEoCDOffset - 20n;\n let zip64EoCDOffset = 0n;\n\n const magicBytes = await file.slice(zip64EoCDLocatorOffset, zip64EoCDLocatorOffset + 4n);\n if (compareArrayBuffers(magicBytes, zip64EoCDLocatorSignature)) {\n zip64EoCDOffset = await file.getBigUint64(\n zip64EoCDLocatorOffset + ZIP64_EOCD_START_OFFSET_OFFSET\n );\n\n const endOfCDMagicBytes = await file.slice(zip64EoCDOffset, zip64EoCDOffset + 4n);\n if (!compareArrayBuffers(endOfCDMagicBytes, zip64EoCDSignature.buffer)) {\n throw new Error('zip64 EoCD not found');\n }\n\n cdRecordsNumber = await file.getBigUint64(zip64EoCDOffset + ZIP64_CD_RECORDS_NUMBER_OFFSET);\n cdStartOffset = await file.getBigUint64(zip64EoCDOffset + ZIP64_CD_START_OFFSET_OFFSET);\n } else {\n zip64EoCDLocatorOffset = 0n;\n }\n\n return {\n cdRecordsNumber,\n cdStartOffset,\n offsets: {\n zip64EoCDOffset,\n zip64EoCDLocatorOffset,\n zipEoCDOffset\n }\n };\n};\n\n/**\n * updates EoCD record to add more files to the archieve\n * @param eocdBody buffer containing header\n * @param oldEoCDOffsets info read from EoCD record befor updating\n * @param newCDStartOffset CD start offset to be updated\n * @param eocdStartOffset EoCD start offset to be updated\n * @returns new EoCD header\n */\nexport function updateEoCD(\n eocdBody: ArrayBuffer,\n oldEoCDOffsets: ZipEoCDRecordOffsets,\n newCDStartOffset: bigint,\n eocdStartOffset: bigint,\n newCDRecordsNumber: bigint\n): Uint8Array {\n const eocd = new DataView(eocdBody);\n\n const classicEoCDOffset = oldEoCDOffsets.zip64EoCDOffset\n ? oldEoCDOffsets.zipEoCDOffset - oldEoCDOffsets.zip64EoCDOffset\n : 0n;\n\n // updating classic EoCD record with new CD records number in general and on disc\n if (Number(newCDRecordsNumber) <= 0xffff) {\n setFieldToNumber(eocd, 2, classicEoCDOffset + CD_RECORDS_NUMBER_OFFSET, newCDRecordsNumber);\n setFieldToNumber(\n eocd,\n 2,\n classicEoCDOffset + CD_RECORDS_NUMBER_ON_DISC_OFFSET,\n newCDRecordsNumber\n );\n }\n\n // updating zip64 EoCD record with new size of CD\n if (eocdStartOffset - newCDStartOffset <= 0xffffffff) {\n setFieldToNumber(\n eocd,\n 4,\n classicEoCDOffset + CD_CD_BYTE_SIZE_OFFSET,\n eocdStartOffset - newCDStartOffset\n );\n }\n\n // updating classic EoCD record with new CD start offset\n if (newCDStartOffset < 0xffffffff) {\n setFieldToNumber(eocd, 4, classicEoCDOffset + CD_START_OFFSET_OFFSET, newCDStartOffset);\n }\n\n // updating zip64 EoCD locator and record with new EoCD record start offset and cd records number\n if (oldEoCDOffsets.zip64EoCDLocatorOffset && oldEoCDOffsets.zip64EoCDOffset) {\n // updating zip64 EoCD locator with new EoCD record start offset\n const locatorOffset = oldEoCDOffsets.zip64EoCDLocatorOffset - oldEoCDOffsets.zip64EoCDOffset;\n setFieldToNumber(eocd, 8, locatorOffset + ZIP64_EOCD_START_OFFSET_OFFSET, eocdStartOffset);\n\n // updating zip64 EoCD record with new cd start offset\n setFieldToNumber(eocd, 8, ZIP64_CD_START_OFFSET_OFFSET, newCDStartOffset);\n\n // updating zip64 EoCD record with new cd records number\n setFieldToNumber(eocd, 8, ZIP64_CD_RECORDS_NUMBER_OFFSET, newCDRecordsNumber);\n setFieldToNumber(eocd, 8, ZIP64_CD_RECORDS_NUMBER_ON_DISC_OFFSET, newCDRecordsNumber);\n\n // updating zip64 EoCD record with new size of CD\n setFieldToNumber(eocd, 8, ZIP64_CD_CD_BYTE_SIZE_OFFSET, eocdStartOffset - newCDStartOffset);\n }\n\n return new Uint8Array(eocd.buffer);\n}\n\n/**\n * generates EoCD record\n * @param options data to generate EoCD record\n * @returns ArrayBuffer with EoCD record\n */\nexport function generateEoCD(options: ZipEoCDGenerationOptions): ArrayBuffer {\n const header = new DataView(new ArrayBuffer(Number(CD_COMMENT_OFFSET)));\n\n for (const field of EOCD_FIELDS) {\n setFieldToNumber(\n header,\n field.size,\n field.offset,\n options[field.name ?? ''] ?? field.default ?? 0\n );\n }\n const locator = generateZip64InfoLocator(options);\n\n const zip64Record = generateZip64Info(options);\n\n return concatenateArrayBuffers(zip64Record, locator, header.buffer);\n}\n\n/** standart EoCD fields */\nconst EOCD_FIELDS = [\n // End of central directory signature = 0x06054b50\n {\n offset: 0,\n size: 4,\n default: new DataView(eoCDSignature.buffer).getUint32(0, true)\n },\n\n // Number of this disk (or 0xffff for ZIP64)\n {\n offset: 4,\n size: 2,\n default: 0\n },\n\n // Disk where central directory starts (or 0xffff for ZIP64)\n {\n offset: 6,\n size: 2,\n default: 0\n },\n\n // Number of central directory records on this disk (or 0xffff for ZIP64)\n {\n offset: 8,\n size: 2,\n name: 'recordsNumber'\n },\n\n // Total number of central directory records (or 0xffff for ZIP64)\n {\n offset: 10,\n size: 2,\n name: 'recordsNumber'\n },\n\n // Size of central directory (bytes) (or 0xffffffff for ZIP64)\n {\n offset: 12,\n size: 4,\n name: 'cdSize'\n },\n\n // Offset of start of central directory, relative to start of archive (or 0xffffffff for ZIP64)\n {\n offset: 16,\n size: 4,\n name: 'cdOffset'\n },\n\n // Comment length (n)\n {\n offset: 20,\n size: 2,\n default: 0\n }\n];\n\n/**\n * generates eocd zip64 record\n * @param options data to generate eocd zip64 record\n * @returns buffer with eocd zip64 record\n */\nfunction generateZip64Info(options: ZipEoCDGenerationOptions): ArrayBuffer {\n const record = new DataView(new ArrayBuffer(Number(ZIP64_COMMENT_OFFSET)));\n for (const field of ZIP64_EOCD_FIELDS) {\n setFieldToNumber(\n record,\n field.size,\n field.offset,\n options[field.name ?? ''] ?? field.default ?? 0\n );\n }\n\n return record.buffer;\n}\n\n/**\n * generates eocd zip64 record locator\n * @param options data to generate eocd zip64 record\n * @returns buffer with eocd zip64 record\n */\nfunction generateZip64InfoLocator(options: ZipEoCDGenerationOptions): ArrayBuffer {\n const locator = new DataView(new ArrayBuffer(Number(20)));\n\n for (const field of ZIP64_EOCD_LOCATOR_FIELDS) {\n setFieldToNumber(\n locator,\n field.size,\n field.offset,\n options[field.name ?? ''] ?? field.default ?? 0\n );\n }\n\n return locator.buffer;\n}\n\n/** zip64 EoCD record locater fields */\nconst ZIP64_EOCD_LOCATOR_FIELDS = [\n // zip64 end of central dir locator signature\n {\n offset: 0,\n size: 4,\n default: new DataView(zip64EoCDLocatorSignature.buffer).getUint32(0, true)\n },\n\n // number of the disk with the start of the zip64 end of\n {\n offset: 4,\n size: 4,\n default: 0\n },\n\n // start of the zip64 end of central directory\n {\n offset: 8,\n size: 8,\n name: 'eoCDStart'\n },\n\n // total number of disks\n {\n offset: 16,\n size: 4,\n default: 1\n }\n];\n\n/** zip64 EoCD recodrd fields */\nconst ZIP64_EOCD_FIELDS = [\n // End of central directory signature = 0x06064b50\n {\n offset: 0,\n size: 4,\n default: new DataView(zip64EoCDSignature.buffer).getUint32(0, true)\n },\n\n // Size of the EOCD64 minus 12\n {\n offset: 4,\n size: 8,\n default: 44\n },\n\n // Version made by\n {\n offset: 12,\n size: 2,\n default: 45\n },\n\n // Version needed to extract (minimum)\n {\n offset: 14,\n size: 2,\n default: 45\n },\n\n // Number of this disk\n {\n offset: 16,\n size: 4,\n default: 0\n },\n\n // Disk where central directory starts\n {\n offset: 20,\n size: 4,\n default: 0\n },\n\n // Number of central directory records on this disk\n {\n offset: 24,\n size: 8,\n name: 'recordsNumber'\n },\n\n // Total number of central directory records\n {\n offset: 32,\n size: 8,\n name: 'recordsNumber'\n },\n\n // Size of central directory (bytes)\n {\n offset: 40,\n size: 8,\n name: 'cdSize'\n },\n\n // Offset of start of central directory, relative to start of archive\n {\n offset: 48,\n size: 8,\n name: 'cdOffset'\n }\n];\n"],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { NodeFilesystem } from '@loaders.gl/loader-utils';
2
+ /**
3
+ * adds one file in the end of the archieve
4
+ * @param zipUrl path to the file
5
+ * @param fileToAdd new file body
6
+ * @param fileName new file name
7
+ */
8
+ export declare function addOneFile(zipUrl: string, fileToAdd: ArrayBuffer, fileName: string): Promise<void>;
9
+ /**
10
+ * creates zip archive with no compression
11
+ * @note This is a node specific function that works on files
12
+ * @param inputPath path where files for the achive are stored
13
+ * @param outputPath path where zip archive will be placed
14
+ */
15
+ export declare function createZip(inputPath: string, outputPath: string, createAdditionalData?: (fileList: {
16
+ fileName: string;
17
+ localHeaderOffset: bigint;
18
+ }[]) => Promise<{
19
+ path: string;
20
+ file: ArrayBuffer;
21
+ }>): Promise<void>;
22
+ /**
23
+ * creates iterator providing buffer with file content and path to every file in the input folder
24
+ * @param inputPath path to the input folder
25
+ * @returns iterator
26
+ */
27
+ export declare function getFileIterator(inputPath: string): AsyncIterable<{
28
+ path: string;
29
+ file: ArrayBuffer;
30
+ }>;
31
+ /**
32
+ * creates a list of relative paths to all files in the provided folder
33
+ * @param basePath path of the root folder
34
+ * @param subfolder relative path from the root folder.
35
+ * @returns list of paths
36
+ */
37
+ export declare function getAllFiles(basePath: string, subfolder?: string, fsPassed?: NodeFilesystem): Promise<string[]>;
38
+ //# sourceMappingURL=zip-composition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip-composition.d.ts","sourceRoot":"","sources":["../../src/parse-zip/zip-composition.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,cAAc,EAEf,MAAM,0BAA0B,CAAC;AAwElC;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,iBAmCxF;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,oBAAoB,CAAC,EAAE,CACrB,QAAQ,EAAE;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAC,EAAE,KACtD,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAC,CAAC,iBAwBhD;AAsBD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,GAChB,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAC,CAAC,CASlD;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,MAAW,EACtB,QAAQ,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB"}
@@ -0,0 +1,114 @@
1
+ import { FileHandleFile, concatenateArrayBuffers, path, NodeFilesystem, NodeFile } from '@loaders.gl/loader-utils';
2
+ import { generateEoCD, parseEoCDRecord, updateEoCD } from "./end-of-central-directory.js";
3
+ import { CRC32Hash } from '@loaders.gl/crypto';
4
+ import { generateLocalHeader } from "./local-file-header.js";
5
+ import { generateCDHeader } from "./cd-file-header.js";
6
+ import { fetchFile } from '@loaders.gl/core';
7
+ async function cutTheTailOff(provider) {
8
+ const oldEoCDinfo = await parseEoCDRecord(provider);
9
+ const oldCDStartOffset = oldEoCDinfo.cdStartOffset;
10
+ const oldCDLength = Number(oldEoCDinfo.offsets.zip64EoCDOffset ? oldEoCDinfo.offsets.zip64EoCDOffset - oldCDStartOffset : oldEoCDinfo.offsets.zipEoCDOffset - oldCDStartOffset);
11
+ const zipEnding = await provider.slice(oldCDStartOffset, provider.length);
12
+ await provider.truncate(Number(oldCDStartOffset));
13
+ const oldCDBody = zipEnding.slice(0, oldCDLength);
14
+ const eocdBody = zipEnding.slice(oldCDLength, zipEnding.byteLength);
15
+ return [oldCDBody, eocdBody, oldEoCDinfo];
16
+ }
17
+ async function generateFileHeaders(fileName, fileToAdd, localFileHeaderOffset) {
18
+ const newFileCRC322 = parseInt(await new CRC32Hash().hash(fileToAdd, 'hex'), 16);
19
+ const newFileLocalHeader = generateLocalHeader({
20
+ crc32: newFileCRC322,
21
+ fileName,
22
+ length: fileToAdd.byteLength
23
+ });
24
+ const newFileCDHeader = generateCDHeader({
25
+ crc32: newFileCRC322,
26
+ fileName,
27
+ offset: localFileHeaderOffset,
28
+ length: fileToAdd.byteLength
29
+ });
30
+ return [new Uint8Array(concatenateArrayBuffers(newFileLocalHeader, fileToAdd)), new Uint8Array(newFileCDHeader)];
31
+ }
32
+ export async function addOneFile(zipUrl, fileToAdd, fileName) {
33
+ const provider = new FileHandleFile(zipUrl, true);
34
+ const [oldCDBody, eocdBody, oldEoCDinfo] = await cutTheTailOff(provider);
35
+ const newFileOffset = provider.length;
36
+ const [localPart, cdHeaderPart] = await generateFileHeaders(fileName, fileToAdd, newFileOffset);
37
+ await provider.append(localPart);
38
+ const newCDBody = concatenateArrayBuffers(oldCDBody, cdHeaderPart);
39
+ const newCDStartOffset = provider.length;
40
+ await provider.append(new Uint8Array(newCDBody));
41
+ const eocdOffset = provider.length;
42
+ await provider.append(updateEoCD(eocdBody, oldEoCDinfo.offsets, newCDStartOffset, eocdOffset, oldEoCDinfo.cdRecordsNumber + 1n));
43
+ }
44
+ export async function createZip(inputPath, outputPath, createAdditionalData) {
45
+ const fileIterator = getFileIterator(inputPath);
46
+ const resFile = new NodeFile(outputPath, 'w');
47
+ const fileList = [];
48
+ const cdArray = [];
49
+ for await (const file of fileIterator) {
50
+ await addFile(file, resFile, cdArray, fileList);
51
+ }
52
+ if (createAdditionalData) {
53
+ const additionaldata = await createAdditionalData(fileList);
54
+ await addFile(additionaldata, resFile, cdArray);
55
+ }
56
+ const cdOffset = (await resFile.stat()).bigsize;
57
+ const cd = concatenateArrayBuffers(...cdArray);
58
+ await resFile.append(new Uint8Array(cd));
59
+ const eoCDStart = (await resFile.stat()).bigsize;
60
+ await resFile.append(new Uint8Array(generateEoCD({
61
+ recordsNumber: cdArray.length,
62
+ cdSize: cd.byteLength,
63
+ cdOffset,
64
+ eoCDStart
65
+ })));
66
+ }
67
+ async function addFile(file, resFile, cdArray, fileList) {
68
+ const size = (await resFile.stat()).bigsize;
69
+ fileList === null || fileList === void 0 ? void 0 : fileList.push({
70
+ fileName: file.path,
71
+ localHeaderOffset: size
72
+ });
73
+ const [localPart, cdHeaderPart] = await generateFileHeaders(file.path, file.file, size);
74
+ await resFile.append(localPart);
75
+ cdArray.push(cdHeaderPart);
76
+ }
77
+ export function getFileIterator(inputPath) {
78
+ async function* iterable() {
79
+ const fileList = await getAllFiles(inputPath);
80
+ for (const filePath of fileList) {
81
+ const file = await (await fetchFile(path.join(inputPath, filePath))).arrayBuffer();
82
+ yield {
83
+ path: filePath,
84
+ file
85
+ };
86
+ }
87
+ }
88
+ return iterable();
89
+ }
90
+ export async function getAllFiles(basePath) {
91
+ let subfolder = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
92
+ let fsPassed = arguments.length > 2 ? arguments[2] : undefined;
93
+ const fs = fsPassed ? fsPassed : new NodeFilesystem({});
94
+ const files = await fs.readdir(pathJoin(basePath, subfolder));
95
+ const arrayOfFiles = [];
96
+ for (const file of files) {
97
+ const fullPath = pathJoin(basePath, subfolder, file);
98
+ if ((await fs.stat(fullPath)).isDirectory) {
99
+ const files = await getAllFiles(basePath, pathJoin(subfolder, file));
100
+ arrayOfFiles.push(...files);
101
+ } else {
102
+ arrayOfFiles.push(pathJoin(subfolder, file));
103
+ }
104
+ }
105
+ return arrayOfFiles;
106
+ }
107
+ function pathJoin() {
108
+ for (var _len = arguments.length, paths = new Array(_len), _key = 0; _key < _len; _key++) {
109
+ paths[_key] = arguments[_key];
110
+ }
111
+ const resPaths = paths.filter(val => val.length);
112
+ return path.join(...resPaths);
113
+ }
114
+ //# sourceMappingURL=zip-composition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip-composition.js","names":["FileHandleFile","concatenateArrayBuffers","path","NodeFilesystem","NodeFile","generateEoCD","parseEoCDRecord","updateEoCD","CRC32Hash","generateLocalHeader","generateCDHeader","fetchFile","cutTheTailOff","provider","oldEoCDinfo","oldCDStartOffset","cdStartOffset","oldCDLength","Number","offsets","zip64EoCDOffset","zipEoCDOffset","zipEnding","slice","length","truncate","oldCDBody","eocdBody","byteLength","generateFileHeaders","fileName","fileToAdd","localFileHeaderOffset","newFileCRC322","parseInt","hash","newFileLocalHeader","crc32","newFileCDHeader","offset","Uint8Array","addOneFile","zipUrl","newFileOffset","localPart","cdHeaderPart","append","newCDBody","newCDStartOffset","eocdOffset","cdRecordsNumber","createZip","inputPath","outputPath","createAdditionalData","fileIterator","getFileIterator","resFile","fileList","cdArray","file","addFile","additionaldata","cdOffset","stat","bigsize","cd","eoCDStart","recordsNumber","cdSize","size","push","localHeaderOffset","iterable","getAllFiles","filePath","join","arrayBuffer","basePath","subfolder","arguments","undefined","fsPassed","fs","files","readdir","pathJoin","arrayOfFiles","fullPath","isDirectory","_len","paths","Array","_key","resPaths","filter","val"],"sources":["../../src/parse-zip/zip-composition.ts"],"sourcesContent":["import {\n FileHandleFile,\n concatenateArrayBuffers,\n path,\n NodeFilesystem,\n NodeFile\n} from '@loaders.gl/loader-utils';\nimport {ZipEoCDRecord, generateEoCD, parseEoCDRecord, updateEoCD} from './end-of-central-directory';\nimport {CRC32Hash} from '@loaders.gl/crypto';\nimport {generateLocalHeader} from './local-file-header';\nimport {generateCDHeader} from './cd-file-header';\nimport {fetchFile} from '@loaders.gl/core';\n\n/**\n * cut off CD and EoCD records from zip file\n * @param provider zip file\n * @returns tuple with three values: CD, EoCD record, EoCD information\n */\nasync function cutTheTailOff(\n provider: FileHandleFile\n): Promise<[ArrayBuffer, ArrayBuffer, ZipEoCDRecord]> {\n // define where the body ends\n const oldEoCDinfo = await parseEoCDRecord(provider);\n const oldCDStartOffset = oldEoCDinfo.cdStartOffset;\n\n // define cd length\n const oldCDLength = Number(\n oldEoCDinfo.offsets.zip64EoCDOffset\n ? oldEoCDinfo.offsets.zip64EoCDOffset - oldCDStartOffset\n : oldEoCDinfo.offsets.zipEoCDOffset - oldCDStartOffset\n );\n\n // cut off everything except of archieve body\n const zipEnding = await provider.slice(oldCDStartOffset, provider.length);\n await provider.truncate(Number(oldCDStartOffset));\n\n // divide cd body and eocd record\n const oldCDBody = zipEnding.slice(0, oldCDLength);\n const eocdBody = zipEnding.slice(oldCDLength, zipEnding.byteLength);\n\n return [oldCDBody, eocdBody, oldEoCDinfo];\n}\n\n/**\n * generates CD and local headers for the file\n * @param fileName name of the file\n * @param fileToAdd buffer with the file\n * @param localFileHeaderOffset offset of the file local header\n * @returns tuple with two values: local header and file body, cd header\n */\nasync function generateFileHeaders(\n fileName: string,\n fileToAdd: ArrayBuffer,\n localFileHeaderOffset: bigint\n): Promise<[Uint8Array, Uint8Array]> {\n // generating CRC32 of the content\n const newFileCRC322 = parseInt(await new CRC32Hash().hash(fileToAdd, 'hex'), 16);\n\n // generate local header for the file\n const newFileLocalHeader = generateLocalHeader({\n crc32: newFileCRC322,\n fileName,\n length: fileToAdd.byteLength\n });\n\n // generate hash file cd header\n const newFileCDHeader = generateCDHeader({\n crc32: newFileCRC322,\n fileName,\n offset: localFileHeaderOffset,\n length: fileToAdd.byteLength\n });\n return [\n new Uint8Array(concatenateArrayBuffers(newFileLocalHeader, fileToAdd)),\n new Uint8Array(newFileCDHeader)\n ];\n}\n\n/**\n * adds one file in the end of the archieve\n * @param zipUrl path to the file\n * @param fileToAdd new file body\n * @param fileName new file name\n */\nexport async function addOneFile(zipUrl: string, fileToAdd: ArrayBuffer, fileName: string) {\n // init file handler\n const provider = new FileHandleFile(zipUrl, true);\n\n const [oldCDBody, eocdBody, oldEoCDinfo] = await cutTheTailOff(provider);\n\n // remember the new file local header start offset\n const newFileOffset = provider.length;\n\n const [localPart, cdHeaderPart] = await generateFileHeaders(fileName, fileToAdd, newFileOffset);\n\n // write down the file local header\n await provider.append(localPart);\n\n // add the file CD header to the CD\n const newCDBody = concatenateArrayBuffers(oldCDBody, cdHeaderPart);\n\n // remember the CD start offset\n const newCDStartOffset = provider.length;\n\n // write down new CD\n await provider.append(new Uint8Array(newCDBody));\n\n // remember where eocd starts\n const eocdOffset = provider.length;\n\n await provider.append(\n updateEoCD(\n eocdBody,\n oldEoCDinfo.offsets,\n newCDStartOffset,\n eocdOffset,\n oldEoCDinfo.cdRecordsNumber + 1n\n )\n );\n}\n\n/**\n * creates zip archive with no compression\n * @note This is a node specific function that works on files\n * @param inputPath path where files for the achive are stored\n * @param outputPath path where zip archive will be placed\n */\nexport async function createZip(\n inputPath: string,\n outputPath: string,\n createAdditionalData?: (\n fileList: {fileName: string; localHeaderOffset: bigint}[]\n ) => Promise<{path: string; file: ArrayBuffer}>\n) {\n const fileIterator = getFileIterator(inputPath);\n\n const resFile = new NodeFile(outputPath, 'w');\n const fileList: {fileName: string; localHeaderOffset: bigint}[] = [];\n\n const cdArray: ArrayBuffer[] = [];\n for await (const file of fileIterator) {\n await addFile(file, resFile, cdArray, fileList);\n }\n if (createAdditionalData) {\n const additionaldata = await createAdditionalData(fileList);\n await addFile(additionaldata, resFile, cdArray);\n }\n const cdOffset = (await resFile.stat()).bigsize;\n const cd = concatenateArrayBuffers(...cdArray);\n await resFile.append(new Uint8Array(cd));\n const eoCDStart = (await resFile.stat()).bigsize;\n await resFile.append(\n new Uint8Array(\n generateEoCD({recordsNumber: cdArray.length, cdSize: cd.byteLength, cdOffset, eoCDStart})\n )\n );\n}\n\n/**\n * Adds file to zip parts\n * @param file file to add\n * @param resFile zip file body\n * @param cdArray zip file central directory\n * @param fileList list of file offsets\n */\nasync function addFile(\n file: {path: string; file: ArrayBuffer},\n resFile: NodeFile,\n cdArray: ArrayBuffer[],\n fileList?: {fileName: string; localHeaderOffset: bigint}[]\n) {\n const size = (await resFile.stat()).bigsize;\n fileList?.push({fileName: file.path, localHeaderOffset: size});\n const [localPart, cdHeaderPart] = await generateFileHeaders(file.path, file.file, size);\n await resFile.append(localPart);\n cdArray.push(cdHeaderPart);\n}\n\n/**\n * creates iterator providing buffer with file content and path to every file in the input folder\n * @param inputPath path to the input folder\n * @returns iterator\n */\nexport function getFileIterator(\n inputPath: string\n): AsyncIterable<{path: string; file: ArrayBuffer}> {\n async function* iterable() {\n const fileList = await getAllFiles(inputPath);\n for (const filePath of fileList) {\n const file = await (await fetchFile(path.join(inputPath, filePath))).arrayBuffer();\n yield {path: filePath, file};\n }\n }\n return iterable();\n}\n\n/**\n * creates a list of relative paths to all files in the provided folder\n * @param basePath path of the root folder\n * @param subfolder relative path from the root folder.\n * @returns list of paths\n */\nexport async function getAllFiles(\n basePath: string,\n subfolder: string = '',\n fsPassed?: NodeFilesystem\n): Promise<string[]> {\n const fs = fsPassed ? fsPassed : new NodeFilesystem({});\n const files = await fs.readdir(pathJoin(basePath, subfolder));\n\n const arrayOfFiles: string[] = [];\n\n for (const file of files) {\n const fullPath = pathJoin(basePath, subfolder, file);\n if ((await fs.stat(fullPath)).isDirectory) {\n const files = await getAllFiles(basePath, pathJoin(subfolder, file));\n arrayOfFiles.push(...files);\n } else {\n arrayOfFiles.push(pathJoin(subfolder, file));\n }\n }\n\n return arrayOfFiles;\n}\n\n/**\n * removes empty parts from path array and joins it\n * @param paths paths to join\n * @returns joined path\n */\nfunction pathJoin(...paths: string[]): string {\n const resPaths: string[] = paths.filter((val) => val.length);\n return path.join(...resPaths);\n}\n"],"mappings":"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"}
@@ -22,10 +22,10 @@ export function setFieldToNumber(header, fieldSize, fieldOffset, value) {
22
22
  }
23
23
  const NUMBER_SETTERS = {
24
24
  2: (header, offset, value) => {
25
- header.setUint16(offset, Number(value), true);
25
+ header.setUint16(offset, Number(value > 0xffff ? 0xffff : value), true);
26
26
  },
27
27
  4: (header, offset, value) => {
28
- header.setUint32(offset, Number(value), true);
28
+ header.setUint32(offset, Number(value > 0xffffffff ? 0xffffffff : value), true);
29
29
  },
30
30
  8: (header, offset, value) => {
31
31
  header.setBigUint64(offset, BigInt(value), true);
@@ -1 +1 @@
1
- {"version":3,"file":"zip64-info-generation.js","names":["concatenateArrayBuffers","signature","Uint8Array","createZip64Info","options","optionsToUse","zip64Length","offset","size","arraysToConcat","field","ZIP64_FIELDS","_field$name","_optionsToUse","_field$name2","name","default","newValue","DataView","ArrayBuffer","NUMBER_SETTERS","push","buffer","setFieldToNumber","header","fieldSize","fieldOffset","value","Number","setUint16","setUint32","setBigUint64","BigInt","getUint16"],"sources":["../../src/parse-zip/zip64-info-generation.ts"],"sourcesContent":["import {concatenateArrayBuffers} from '@loaders.gl/loader-utils';\n\nexport const signature = new Uint8Array([0x01, 0x00]);\n\n/** info that can be placed into zip64 field, doc: https://en.wikipedia.org/wiki/ZIP_(file_format)#ZIP64 */\ntype Zip64Options = {\n /** Original uncompressed file size and Size of compressed data */\n size?: number;\n /** Offset of local header record */\n offset?: number;\n};\n\n/**\n * creates zip64 extra field\n * @param options info that can be placed into zip64 field\n * @returns buffer with field\n */\nexport function createZip64Info(options: Zip64Options): ArrayBuffer {\n const optionsToUse = {\n ...options,\n zip64Length: (options.offset ? 1 : 0) * 8 + (options.size ? 1 : 0) * 16\n };\n\n const arraysToConcat: ArrayBuffer[] = [];\n\n for (const field of ZIP64_FIELDS) {\n if (!optionsToUse[field.name ?? ''] && !field.default) {\n continue;\n }\n const newValue = new DataView(new ArrayBuffer(field.size));\n NUMBER_SETTERS[field.size](newValue, 0, optionsToUse[field.name ?? ''] ?? field.default);\n arraysToConcat.push(newValue.buffer);\n }\n\n return concatenateArrayBuffers(...arraysToConcat);\n}\n\n/**\n * Function to write values into buffer\n * @param header buffer where to write a value\n * @param offset offset of the writing start\n * @param value value to be written\n */\ntype NumberSetter = (header: DataView, offset: number, value: number | bigint) => void;\n\n/**\n * Writes values into buffer according to the bytes amount\n * @param header header where to write the data\n * @param fieldSize size of the field in bytes\n * @param fieldOffset offset of the field\n * @param value value to be written\n */\nexport function setFieldToNumber(\n header: DataView,\n fieldSize: number,\n fieldOffset: number | bigint,\n value: number | bigint\n): void {\n NUMBER_SETTERS[fieldSize](header, Number(fieldOffset), value);\n}\n\n/** functions to write values into buffer according to the bytes amount */\nconst NUMBER_SETTERS: {[key: number]: NumberSetter} = {\n 2: (header, offset, value) => {\n header.setUint16(offset, Number(value), true);\n },\n 4: (header, offset, value) => {\n header.setUint32(offset, Number(value), true);\n },\n 8: (header, offset, value) => {\n header.setBigUint64(offset, BigInt(value), true);\n }\n};\n\n/** zip64 info fields description, we need it as a pattern to build a zip64 info */\nconst ZIP64_FIELDS = [\n // Header ID 0x0001\n {\n size: 2,\n default: new DataView(signature.buffer).getUint16(0, true)\n },\n\n // Size of the extra field chunk (8, 16, 24 or 28)\n {\n size: 2,\n name: 'zip64Length'\n },\n\n // Original uncompressed file size\n {\n size: 8,\n name: 'size'\n },\n\n // Size of compressed data\n {\n size: 8,\n name: 'size'\n },\n\n // Offset of local header record\n {\n size: 8,\n name: 'offset'\n }\n];\n"],"mappings":"AAAA,SAAQA,uBAAuB,QAAO,0BAA0B;AAEhE,OAAO,MAAMC,SAAS,GAAG,IAAIC,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAerD,OAAO,SAASC,eAAeA,CAACC,OAAqB,EAAe;EAClE,MAAMC,YAAY,GAAG;IACnB,GAAGD,OAAO;IACVE,WAAW,EAAE,CAACF,OAAO,CAACG,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAACH,OAAO,CAACI,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI;EACvE,CAAC;EAED,MAAMC,cAA6B,GAAG,EAAE;EAExC,KAAK,MAAMC,KAAK,IAAIC,YAAY,EAAE;IAAA,IAAAC,WAAA,EAAAC,aAAA,EAAAC,YAAA;IAChC,IAAI,CAACT,YAAY,EAAAO,WAAA,GAACF,KAAK,CAACK,IAAI,cAAAH,WAAA,cAAAA,WAAA,GAAI,EAAE,CAAC,IAAI,CAACF,KAAK,CAACM,OAAO,EAAE;MACrD;IACF;IACA,MAAMC,QAAQ,GAAG,IAAIC,QAAQ,CAAC,IAAIC,WAAW,CAACT,KAAK,CAACF,IAAI,CAAC,CAAC;IAC1DY,cAAc,CAACV,KAAK,CAACF,IAAI,CAAC,CAACS,QAAQ,EAAE,CAAC,GAAAJ,aAAA,GAAER,YAAY,EAAAS,YAAA,GAACJ,KAAK,CAACK,IAAI,cAAAD,YAAA,cAAAA,YAAA,GAAI,EAAE,CAAC,cAAAD,aAAA,cAAAA,aAAA,GAAIH,KAAK,CAACM,OAAO,CAAC;IACxFP,cAAc,CAACY,IAAI,CAACJ,QAAQ,CAACK,MAAM,CAAC;EACtC;EAEA,OAAOtB,uBAAuB,CAAC,GAAGS,cAAc,CAAC;AACnD;AAiBA,OAAO,SAASc,gBAAgBA,CAC9BC,MAAgB,EAChBC,SAAiB,EACjBC,WAA4B,EAC5BC,KAAsB,EAChB;EACNP,cAAc,CAACK,SAAS,CAAC,CAACD,MAAM,EAAEI,MAAM,CAACF,WAAW,CAAC,EAAEC,KAAK,CAAC;AAC/D;AAGA,MAAMP,cAA6C,GAAG;EACpD,CAAC,EAAE,CAACI,MAAM,EAAEjB,MAAM,EAAEoB,KAAK,KAAK;IAC5BH,MAAM,CAACK,SAAS,CAACtB,MAAM,EAAEqB,MAAM,CAACD,KAAK,CAAC,EAAE,IAAI,CAAC;EAC/C,CAAC;EACD,CAAC,EAAE,CAACH,MAAM,EAAEjB,MAAM,EAAEoB,KAAK,KAAK;IAC5BH,MAAM,CAACM,SAAS,CAACvB,MAAM,EAAEqB,MAAM,CAACD,KAAK,CAAC,EAAE,IAAI,CAAC;EAC/C,CAAC;EACD,CAAC,EAAE,CAACH,MAAM,EAAEjB,MAAM,EAAEoB,KAAK,KAAK;IAC5BH,MAAM,CAACO,YAAY,CAACxB,MAAM,EAAEyB,MAAM,CAACL,KAAK,CAAC,EAAE,IAAI,CAAC;EAClD;AACF,CAAC;AAGD,MAAMhB,YAAY,GAAG,CAEnB;EACEH,IAAI,EAAE,CAAC;EACPQ,OAAO,EAAE,IAAIE,QAAQ,CAACjB,SAAS,CAACqB,MAAM,CAAC,CAACW,SAAS,CAAC,CAAC,EAAE,IAAI;AAC3D,CAAC,EAGD;EACEzB,IAAI,EAAE,CAAC;EACPO,IAAI,EAAE;AACR,CAAC,EAGD;EACEP,IAAI,EAAE,CAAC;EACPO,IAAI,EAAE;AACR,CAAC,EAGD;EACEP,IAAI,EAAE,CAAC;EACPO,IAAI,EAAE;AACR,CAAC,EAGD;EACEP,IAAI,EAAE,CAAC;EACPO,IAAI,EAAE;AACR,CAAC,CACF"}
1
+ {"version":3,"file":"zip64-info-generation.js","names":["concatenateArrayBuffers","signature","Uint8Array","createZip64Info","options","optionsToUse","zip64Length","offset","size","arraysToConcat","field","ZIP64_FIELDS","_field$name","_optionsToUse","_field$name2","name","default","newValue","DataView","ArrayBuffer","NUMBER_SETTERS","push","buffer","setFieldToNumber","header","fieldSize","fieldOffset","value","Number","setUint16","setUint32","setBigUint64","BigInt","getUint16"],"sources":["../../src/parse-zip/zip64-info-generation.ts"],"sourcesContent":["import {concatenateArrayBuffers} from '@loaders.gl/loader-utils';\n\nexport const signature = new Uint8Array([0x01, 0x00]);\n\n/** info that can be placed into zip64 field, doc: https://en.wikipedia.org/wiki/ZIP_(file_format)#ZIP64 */\ntype Zip64Options = {\n /** Original uncompressed file size and Size of compressed data */\n size?: number;\n /** Offset of local header record */\n offset?: number;\n};\n\n/**\n * creates zip64 extra field\n * @param options info that can be placed into zip64 field\n * @returns buffer with field\n */\nexport function createZip64Info(options: Zip64Options): ArrayBuffer {\n const optionsToUse = {\n ...options,\n zip64Length: (options.offset ? 1 : 0) * 8 + (options.size ? 1 : 0) * 16\n };\n\n const arraysToConcat: ArrayBuffer[] = [];\n\n for (const field of ZIP64_FIELDS) {\n if (!optionsToUse[field.name ?? ''] && !field.default) {\n continue; // eslint-disable-line no-continue\n }\n const newValue = new DataView(new ArrayBuffer(field.size));\n NUMBER_SETTERS[field.size](newValue, 0, optionsToUse[field.name ?? ''] ?? field.default);\n arraysToConcat.push(newValue.buffer);\n }\n\n return concatenateArrayBuffers(...arraysToConcat);\n}\n\n/**\n * Function to write values into buffer\n * @param header buffer where to write a value\n * @param offset offset of the writing start\n * @param value value to be written\n */\ntype NumberSetter = (header: DataView, offset: number, value: number | bigint) => void;\n\n/**\n * Writes values into buffer according to the bytes amount\n * @param header header where to write the data\n * @param fieldSize size of the field in bytes\n * @param fieldOffset offset of the field\n * @param value value to be written\n */\nexport function setFieldToNumber(\n header: DataView,\n fieldSize: number,\n fieldOffset: number | bigint,\n value: number | bigint\n): void {\n NUMBER_SETTERS[fieldSize](header, Number(fieldOffset), value);\n}\n\n/** functions to write values into buffer according to the bytes amount */\nconst NUMBER_SETTERS: {[key: number]: NumberSetter} = {\n 2: (header, offset, value) => {\n header.setUint16(offset, Number(value > 0xffff ? 0xffff : value), true);\n },\n 4: (header, offset, value) => {\n header.setUint32(offset, Number(value > 0xffffffff ? 0xffffffff : value), true);\n },\n 8: (header, offset, value) => {\n header.setBigUint64(offset, BigInt(value), true);\n }\n};\n\n/** zip64 info fields description, we need it as a pattern to build a zip64 info */\nconst ZIP64_FIELDS = [\n // Header ID 0x0001\n {\n size: 2,\n default: new DataView(signature.buffer).getUint16(0, true)\n },\n\n // Size of the extra field chunk (8, 16, 24 or 28)\n {\n size: 2,\n name: 'zip64Length'\n },\n\n // Original uncompressed file size\n {\n size: 8,\n name: 'size'\n },\n\n // Size of compressed data\n {\n size: 8,\n name: 'size'\n },\n\n // Offset of local header record\n {\n size: 8,\n name: 'offset'\n }\n];\n"],"mappings":"AAAA,SAAQA,uBAAuB,QAAO,0BAA0B;AAEhE,OAAO,MAAMC,SAAS,GAAG,IAAIC,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAerD,OAAO,SAASC,eAAeA,CAACC,OAAqB,EAAe;EAClE,MAAMC,YAAY,GAAG;IACnB,GAAGD,OAAO;IACVE,WAAW,EAAE,CAACF,OAAO,CAACG,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAACH,OAAO,CAACI,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI;EACvE,CAAC;EAED,MAAMC,cAA6B,GAAG,EAAE;EAExC,KAAK,MAAMC,KAAK,IAAIC,YAAY,EAAE;IAAA,IAAAC,WAAA,EAAAC,aAAA,EAAAC,YAAA;IAChC,IAAI,CAACT,YAAY,EAAAO,WAAA,GAACF,KAAK,CAACK,IAAI,cAAAH,WAAA,cAAAA,WAAA,GAAI,EAAE,CAAC,IAAI,CAACF,KAAK,CAACM,OAAO,EAAE;MACrD;IACF;IACA,MAAMC,QAAQ,GAAG,IAAIC,QAAQ,CAAC,IAAIC,WAAW,CAACT,KAAK,CAACF,IAAI,CAAC,CAAC;IAC1DY,cAAc,CAACV,KAAK,CAACF,IAAI,CAAC,CAACS,QAAQ,EAAE,CAAC,GAAAJ,aAAA,GAAER,YAAY,EAAAS,YAAA,GAACJ,KAAK,CAACK,IAAI,cAAAD,YAAA,cAAAA,YAAA,GAAI,EAAE,CAAC,cAAAD,aAAA,cAAAA,aAAA,GAAIH,KAAK,CAACM,OAAO,CAAC;IACxFP,cAAc,CAACY,IAAI,CAACJ,QAAQ,CAACK,MAAM,CAAC;EACtC;EAEA,OAAOtB,uBAAuB,CAAC,GAAGS,cAAc,CAAC;AACnD;AAiBA,OAAO,SAASc,gBAAgBA,CAC9BC,MAAgB,EAChBC,SAAiB,EACjBC,WAA4B,EAC5BC,KAAsB,EAChB;EACNP,cAAc,CAACK,SAAS,CAAC,CAACD,MAAM,EAAEI,MAAM,CAACF,WAAW,CAAC,EAAEC,KAAK,CAAC;AAC/D;AAGA,MAAMP,cAA6C,GAAG;EACpD,CAAC,EAAE,CAACI,MAAM,EAAEjB,MAAM,EAAEoB,KAAK,KAAK;IAC5BH,MAAM,CAACK,SAAS,CAACtB,MAAM,EAAEqB,MAAM,CAACD,KAAK,GAAG,MAAM,GAAG,MAAM,GAAGA,KAAK,CAAC,EAAE,IAAI,CAAC;EACzE,CAAC;EACD,CAAC,EAAE,CAACH,MAAM,EAAEjB,MAAM,EAAEoB,KAAK,KAAK;IAC5BH,MAAM,CAACM,SAAS,CAACvB,MAAM,EAAEqB,MAAM,CAACD,KAAK,GAAG,UAAU,GAAG,UAAU,GAAGA,KAAK,CAAC,EAAE,IAAI,CAAC;EACjF,CAAC;EACD,CAAC,EAAE,CAACH,MAAM,EAAEjB,MAAM,EAAEoB,KAAK,KAAK;IAC5BH,MAAM,CAACO,YAAY,CAACxB,MAAM,EAAEyB,MAAM,CAACL,KAAK,CAAC,EAAE,IAAI,CAAC;EAClD;AACF,CAAC;AAGD,MAAMhB,YAAY,GAAG,CAEnB;EACEH,IAAI,EAAE,CAAC;EACPQ,OAAO,EAAE,IAAIE,QAAQ,CAACjB,SAAS,CAACqB,MAAM,CAAC,CAACW,SAAS,CAAC,CAAC,EAAE,IAAI;AAC3D,CAAC,EAGD;EACEzB,IAAI,EAAE,CAAC;EACPO,IAAI,EAAE;AACR,CAAC,EAGD;EACEP,IAAI,EAAE,CAAC;EACPO,IAAI,EAAE;AACR,CAAC,EAGD;EACEP,IAAI,EAAE,CAAC;EACPO,IAAI,EAAE;AACR,CAAC,EAGD;EACEP,IAAI,EAAE,CAAC;EACPO,IAAI,EAAE;AACR,CAAC,CACF"}
@@ -1,5 +1,5 @@
1
1
  import JSZip from 'jszip';
2
- const VERSION = typeof "4.1.0-alpha.9" !== 'undefined' ? "4.1.0-alpha.9" : 'latest';
2
+ const VERSION = typeof "4.1.1" !== 'undefined' ? "4.1.1" : 'latest';
3
3
  export const ZipLoader = {
4
4
  id: 'zip',
5
5
  module: 'zip',
@@ -1 +1 @@
1
- {"version":3,"file":"zip-loader.js","names":["JSZip","VERSION","ZipLoader","id","module","name","version","extensions","mimeTypes","category","tests","options","parse","parseZipAsync","data","arguments","length","undefined","promises","fileMap","jsZip","zip","loadAsync","forEach","relativePath","zipEntry","subFilename","promise","loadZipEntry","then","arrayBufferOrError","push","Promise","all","error","log","arrayBuffer","file","async","dataType"],"sources":["../src/zip-loader.ts"],"sourcesContent":["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport JSZip from 'jszip';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\ntype FileMap = Record<string, ArrayBuffer>;\n\nexport const ZipLoader: LoaderWithParser<FileMap, never, LoaderOptions> = {\n id: 'zip',\n module: 'zip',\n name: 'Zip Archive',\n version: VERSION,\n extensions: ['zip'],\n mimeTypes: ['application/zip'],\n category: 'archive',\n tests: ['PK'],\n options: {},\n parse: parseZipAsync\n};\n\n// TODO - Could return a map of promises, perhaps as an option...\nasync function parseZipAsync(data: any, options = {}): Promise<FileMap> {\n const promises: Promise<any>[] = [];\n const fileMap: Record<string, ArrayBuffer> = {};\n\n try {\n const jsZip = new JSZip();\n\n const zip = await jsZip.loadAsync(data, options);\n\n // start to load each file in this zip\n zip.forEach((relativePath, zipEntry) => {\n const subFilename = zipEntry.name;\n\n const promise = loadZipEntry(jsZip, subFilename, options).then((arrayBufferOrError) => {\n fileMap[relativePath] = arrayBufferOrError;\n });\n\n // Ensure Promise.all doesn't ignore rejected promises.\n promises.push(promise);\n });\n\n await Promise.all(promises);\n return fileMap;\n } catch (error) {\n // @ts-ignore\n options.log.error(`Unable to read zip archive: ${error}`);\n throw error;\n }\n}\n\nasync function loadZipEntry(jsZip: any, subFilename: string, options: any = {}) {\n // jszip supports both arraybuffer and text, the main loaders.gl types\n // https://stuk.github.io/jszip/documentation/api_zipobject/async.html\n try {\n const arrayBuffer = await jsZip.file(subFilename).async(options.dataType || 'arraybuffer');\n return arrayBuffer;\n } catch (error) {\n options.log.error(`Unable to read ${subFilename} from zip archive: ${error}`);\n // Store error in place of data in map\n return error;\n }\n}\n"],"mappings":"AAKA,OAAOA,KAAK,MAAM,OAAO;AAIzB,MAAMC,OAAO,GAAG,sBAAkB,KAAK,WAAW,qBAAiB,QAAQ;AAI3E,OAAO,MAAMC,SAA0D,GAAG;EACxEC,EAAE,EAAE,KAAK;EACTC,MAAM,EAAE,KAAK;EACbC,IAAI,EAAE,aAAa;EACnBC,OAAO,EAAEL,OAAO;EAChBM,UAAU,EAAE,CAAC,KAAK,CAAC;EACnBC,SAAS,EAAE,CAAC,iBAAiB,CAAC;EAC9BC,QAAQ,EAAE,SAAS;EACnBC,KAAK,EAAE,CAAC,IAAI,CAAC;EACbC,OAAO,EAAE,CAAC,CAAC;EACXC,KAAK,EAAEC;AACT,CAAC;AAGD,eAAeA,aAAaA,CAACC,IAAS,EAAkC;EAAA,IAAhCH,OAAO,GAAAI,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EAClD,MAAMG,QAAwB,GAAG,EAAE;EACnC,MAAMC,OAAoC,GAAG,CAAC,CAAC;EAE/C,IAAI;IACF,MAAMC,KAAK,GAAG,IAAIpB,KAAK,CAAC,CAAC;IAEzB,MAAMqB,GAAG,GAAG,MAAMD,KAAK,CAACE,SAAS,CAACR,IAAI,EAAEH,OAAO,CAAC;IAGhDU,GAAG,CAACE,OAAO,CAAC,CAACC,YAAY,EAAEC,QAAQ,KAAK;MACtC,MAAMC,WAAW,GAAGD,QAAQ,CAACpB,IAAI;MAEjC,MAAMsB,OAAO,GAAGC,YAAY,CAACR,KAAK,EAAEM,WAAW,EAAEf,OAAO,CAAC,CAACkB,IAAI,CAAEC,kBAAkB,IAAK;QACrFX,OAAO,CAACK,YAAY,CAAC,GAAGM,kBAAkB;MAC5C,CAAC,CAAC;MAGFZ,QAAQ,CAACa,IAAI,CAACJ,OAAO,CAAC;IACxB,CAAC,CAAC;IAEF,MAAMK,OAAO,CAACC,GAAG,CAACf,QAAQ,CAAC;IAC3B,OAAOC,OAAO;EAChB,CAAC,CAAC,OAAOe,KAAK,EAAE;IAEdvB,OAAO,CAACwB,GAAG,CAACD,KAAK,CAAE,+BAA8BA,KAAM,EAAC,CAAC;IACzD,MAAMA,KAAK;EACb;AACF;AAEA,eAAeN,YAAYA,CAACR,KAAU,EAAEM,WAAmB,EAAqB;EAAA,IAAnBf,OAAY,GAAAI,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EAG5E,IAAI;IACF,MAAMqB,WAAW,GAAG,MAAMhB,KAAK,CAACiB,IAAI,CAACX,WAAW,CAAC,CAACY,KAAK,CAAC3B,OAAO,CAAC4B,QAAQ,IAAI,aAAa,CAAC;IAC1F,OAAOH,WAAW;EACpB,CAAC,CAAC,OAAOF,KAAK,EAAE;IACdvB,OAAO,CAACwB,GAAG,CAACD,KAAK,CAAE,kBAAiBR,WAAY,sBAAqBQ,KAAM,EAAC,CAAC;IAE7E,OAAOA,KAAK;EACd;AACF"}
1
+ {"version":3,"file":"zip-loader.js","names":["JSZip","VERSION","ZipLoader","id","module","name","version","extensions","mimeTypes","category","tests","options","parse","parseZipAsync","data","arguments","length","undefined","promises","fileMap","jsZip","zip","loadAsync","forEach","relativePath","zipEntry","subFilename","promise","loadZipEntry","then","arrayBufferOrError","push","Promise","all","error","log","arrayBuffer","file","async","dataType"],"sources":["../src/zip-loader.ts"],"sourcesContent":["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport JSZip from 'jszip';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\ntype FileMap = Record<string, ArrayBuffer>;\n\nexport const ZipLoader: LoaderWithParser<FileMap, never, LoaderOptions> = {\n id: 'zip',\n module: 'zip',\n name: 'Zip Archive',\n version: VERSION,\n extensions: ['zip'],\n mimeTypes: ['application/zip'],\n category: 'archive',\n tests: ['PK'],\n options: {},\n parse: parseZipAsync\n};\n\n// TODO - Could return a map of promises, perhaps as an option...\nasync function parseZipAsync(data: any, options = {}): Promise<FileMap> {\n const promises: Promise<any>[] = [];\n const fileMap: Record<string, ArrayBuffer> = {};\n\n try {\n const jsZip = new JSZip();\n\n const zip = await jsZip.loadAsync(data, options);\n\n // start to load each file in this zip\n zip.forEach((relativePath, zipEntry) => {\n const subFilename = zipEntry.name;\n\n const promise = loadZipEntry(jsZip, subFilename, options).then((arrayBufferOrError) => {\n fileMap[relativePath] = arrayBufferOrError;\n });\n\n // Ensure Promise.all doesn't ignore rejected promises.\n promises.push(promise);\n });\n\n await Promise.all(promises);\n return fileMap;\n } catch (error) {\n // @ts-ignore\n options.log.error(`Unable to read zip archive: ${error}`);\n throw error;\n }\n}\n\nasync function loadZipEntry(jsZip: any, subFilename: string, options: any = {}) {\n // jszip supports both arraybuffer and text, the main loaders.gl types\n // https://stuk.github.io/jszip/documentation/api_zipobject/async.html\n try {\n const arrayBuffer = await jsZip.file(subFilename).async(options.dataType || 'arraybuffer');\n return arrayBuffer;\n } catch (error) {\n options.log.error(`Unable to read ${subFilename} from zip archive: ${error}`);\n // Store error in place of data in map\n return error;\n }\n}\n"],"mappings":"AAKA,OAAOA,KAAK,MAAM,OAAO;AAIzB,MAAMC,OAAO,GAAG,cAAkB,KAAK,WAAW,aAAiB,QAAQ;AAI3E,OAAO,MAAMC,SAA0D,GAAG;EACxEC,EAAE,EAAE,KAAK;EACTC,MAAM,EAAE,KAAK;EACbC,IAAI,EAAE,aAAa;EACnBC,OAAO,EAAEL,OAAO;EAChBM,UAAU,EAAE,CAAC,KAAK,CAAC;EACnBC,SAAS,EAAE,CAAC,iBAAiB,CAAC;EAC9BC,QAAQ,EAAE,SAAS;EACnBC,KAAK,EAAE,CAAC,IAAI,CAAC;EACbC,OAAO,EAAE,CAAC,CAAC;EACXC,KAAK,EAAEC;AACT,CAAC;AAGD,eAAeA,aAAaA,CAACC,IAAS,EAAkC;EAAA,IAAhCH,OAAO,GAAAI,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EAClD,MAAMG,QAAwB,GAAG,EAAE;EACnC,MAAMC,OAAoC,GAAG,CAAC,CAAC;EAE/C,IAAI;IACF,MAAMC,KAAK,GAAG,IAAIpB,KAAK,CAAC,CAAC;IAEzB,MAAMqB,GAAG,GAAG,MAAMD,KAAK,CAACE,SAAS,CAACR,IAAI,EAAEH,OAAO,CAAC;IAGhDU,GAAG,CAACE,OAAO,CAAC,CAACC,YAAY,EAAEC,QAAQ,KAAK;MACtC,MAAMC,WAAW,GAAGD,QAAQ,CAACpB,IAAI;MAEjC,MAAMsB,OAAO,GAAGC,YAAY,CAACR,KAAK,EAAEM,WAAW,EAAEf,OAAO,CAAC,CAACkB,IAAI,CAAEC,kBAAkB,IAAK;QACrFX,OAAO,CAACK,YAAY,CAAC,GAAGM,kBAAkB;MAC5C,CAAC,CAAC;MAGFZ,QAAQ,CAACa,IAAI,CAACJ,OAAO,CAAC;IACxB,CAAC,CAAC;IAEF,MAAMK,OAAO,CAACC,GAAG,CAACf,QAAQ,CAAC;IAC3B,OAAOC,OAAO;EAChB,CAAC,CAAC,OAAOe,KAAK,EAAE;IAEdvB,OAAO,CAACwB,GAAG,CAACD,KAAK,CAAE,+BAA8BA,KAAM,EAAC,CAAC;IACzD,MAAMA,KAAK;EACb;AACF;AAEA,eAAeN,YAAYA,CAACR,KAAU,EAAEM,WAAmB,EAAqB;EAAA,IAAnBf,OAAY,GAAAI,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EAG5E,IAAI;IACF,MAAMqB,WAAW,GAAG,MAAMhB,KAAK,CAACiB,IAAI,CAACX,WAAW,CAAC,CAACY,KAAK,CAAC3B,OAAO,CAAC4B,QAAQ,IAAI,aAAa,CAAC;IAC1F,OAAOH,WAAW;EACpB,CAAC,CAAC,OAAOF,KAAK,EAAE;IACdvB,OAAO,CAACwB,GAAG,CAACD,KAAK,CAAE,kBAAiBR,WAAY,sBAAqBQ,KAAM,EAAC,CAAC;IAE7E,OAAOA,KAAK;EACd;AACF"}
@@ -1,5 +1,5 @@
1
1
  import JSZip from 'jszip';
2
- const VERSION = typeof "4.1.0-alpha.9" !== 'undefined' ? "4.1.0-alpha.9" : 'latest';
2
+ const VERSION = typeof "4.1.1" !== 'undefined' ? "4.1.1" : 'latest';
3
3
  export const ZipWriter = {
4
4
  name: 'Zip Archive',
5
5
  id: 'zip',
@@ -1 +1 @@
1
- {"version":3,"file":"zip-writer.js","names":["JSZip","VERSION","ZipWriter","name","id","module","version","extensions","category","mimeTypes","options","zip","onUpdate","jszip","encode","encodeZipAsync","fileMap","_ZipWriter$options","arguments","length","undefined","jsZip","subFileName","subFileData","file","zipOptions","jszipOptions","generateAsync","type","error","log"],"sources":["../src/zip-writer.ts"],"sourcesContent":["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {WriterWithEncoder, WriterOptions} from '@loaders.gl/loader-utils';\nimport JSZip, {JSZipGeneratorOptions} from 'jszip';\n\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport type ZipWriterOptions = WriterOptions & {\n zip?: {\n onUpdate?: (metadata: {percent: number}) => void;\n };\n /** Passthrough options to jszip */\n jszip?: JSZipGeneratorOptions;\n};\n\n/**\n * Zip exporter\n */\nexport const ZipWriter: WriterWithEncoder<Record<string, ArrayBuffer>, never, ZipWriterOptions> = {\n name: 'Zip Archive',\n id: 'zip',\n module: 'zip',\n version: VERSION,\n extensions: ['zip'],\n category: 'archive',\n mimeTypes: ['application/zip'],\n options: {\n zip: {\n onUpdate: () => {}\n },\n jszip: {}\n },\n encode: encodeZipAsync\n};\n\nasync function encodeZipAsync(\n fileMap: Record<string, ArrayBuffer>,\n options: ZipWriterOptions = {}\n): Promise<ArrayBuffer> {\n const jsZip = new JSZip();\n // add files to the zip\n for (const subFileName in fileMap) {\n const subFileData = fileMap[subFileName];\n\n // jszip supports both arraybuffer and string data (the main loaders.gl types)\n // https://stuk.github.io/jszip/documentation/api_zipobject/async.html\n jsZip.file(subFileName, subFileData, options?.jszip || {});\n }\n\n const zipOptions = {...ZipWriter.options.zip, ...options?.zip};\n const jszipOptions: JSZipGeneratorOptions = {...ZipWriter.options?.jszip, ...options.jszip};\n\n try {\n return await jsZip.generateAsync(\n {...jszipOptions, type: 'arraybuffer'}, // generate an arraybuffer\n zipOptions.onUpdate\n );\n } catch (error) {\n options.log.error(`Unable to encode zip archive: ${error}`);\n throw error;\n }\n}\n"],"mappings":"AAKA,OAAOA,KAAK,MAA+B,OAAO;AAGlD,MAAMC,OAAO,GAAG,sBAAkB,KAAK,WAAW,qBAAiB,QAAQ;AAa3E,OAAO,MAAMC,SAAkF,GAAG;EAChGC,IAAI,EAAE,aAAa;EACnBC,EAAE,EAAE,KAAK;EACTC,MAAM,EAAE,KAAK;EACbC,OAAO,EAAEL,OAAO;EAChBM,UAAU,EAAE,CAAC,KAAK,CAAC;EACnBC,QAAQ,EAAE,SAAS;EACnBC,SAAS,EAAE,CAAC,iBAAiB,CAAC;EAC9BC,OAAO,EAAE;IACPC,GAAG,EAAE;MACHC,QAAQ,EAAEA,CAAA,KAAM,CAAC;IACnB,CAAC;IACDC,KAAK,EAAE,CAAC;EACV,CAAC;EACDC,MAAM,EAAEC;AACV,CAAC;AAED,eAAeA,cAAcA,CAC3BC,OAAoC,EAEd;EAAA,IAAAC,kBAAA;EAAA,IADtBP,OAAyB,GAAAQ,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EAE9B,MAAMG,KAAK,GAAG,IAAIrB,KAAK,CAAC,CAAC;EAEzB,KAAK,MAAMsB,WAAW,IAAIN,OAAO,EAAE;IACjC,MAAMO,WAAW,GAAGP,OAAO,CAACM,WAAW,CAAC;IAIxCD,KAAK,CAACG,IAAI,CAACF,WAAW,EAAEC,WAAW,EAAE,CAAAb,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEG,KAAK,KAAI,CAAC,CAAC,CAAC;EAC5D;EAEA,MAAMY,UAAU,GAAG;IAAC,GAAGvB,SAAS,CAACQ,OAAO,CAACC,GAAG;IAAE,IAAGD,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEC,GAAG;EAAA,CAAC;EAC9D,MAAMe,YAAmC,GAAG;IAAC,KAAAT,kBAAA,GAAGf,SAAS,CAACQ,OAAO,cAAAO,kBAAA,uBAAjBA,kBAAA,CAAmBJ,KAAK;IAAE,GAAGH,OAAO,CAACG;EAAK,CAAC;EAE3F,IAAI;IACF,OAAO,MAAMQ,KAAK,CAACM,aAAa,CAC9B;MAAC,GAAGD,YAAY;MAAEE,IAAI,EAAE;IAAa,CAAC,EACtCH,UAAU,CAACb,QACb,CAAC;EACH,CAAC,CAAC,OAAOiB,KAAK,EAAE;IACdnB,OAAO,CAACoB,GAAG,CAACD,KAAK,CAAE,iCAAgCA,KAAM,EAAC,CAAC;IAC3D,MAAMA,KAAK;EACb;AACF"}
1
+ {"version":3,"file":"zip-writer.js","names":["JSZip","VERSION","ZipWriter","name","id","module","version","extensions","category","mimeTypes","options","zip","onUpdate","jszip","encode","encodeZipAsync","fileMap","_ZipWriter$options","arguments","length","undefined","jsZip","subFileName","subFileData","file","zipOptions","jszipOptions","generateAsync","type","error","log"],"sources":["../src/zip-writer.ts"],"sourcesContent":["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {WriterWithEncoder, WriterOptions} from '@loaders.gl/loader-utils';\nimport JSZip, {JSZipGeneratorOptions} from 'jszip';\n\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport type ZipWriterOptions = WriterOptions & {\n zip?: {\n onUpdate?: (metadata: {percent: number}) => void;\n };\n /** Passthrough options to jszip */\n jszip?: JSZipGeneratorOptions;\n};\n\n/**\n * Zip exporter\n */\nexport const ZipWriter: WriterWithEncoder<Record<string, ArrayBuffer>, never, ZipWriterOptions> = {\n name: 'Zip Archive',\n id: 'zip',\n module: 'zip',\n version: VERSION,\n extensions: ['zip'],\n category: 'archive',\n mimeTypes: ['application/zip'],\n options: {\n zip: {\n onUpdate: () => {}\n },\n jszip: {}\n },\n encode: encodeZipAsync\n};\n\nasync function encodeZipAsync(\n fileMap: Record<string, ArrayBuffer>,\n options: ZipWriterOptions = {}\n): Promise<ArrayBuffer> {\n const jsZip = new JSZip();\n // add files to the zip\n for (const subFileName in fileMap) {\n const subFileData = fileMap[subFileName];\n\n // jszip supports both arraybuffer and string data (the main loaders.gl types)\n // https://stuk.github.io/jszip/documentation/api_zipobject/async.html\n jsZip.file(subFileName, subFileData, options?.jszip || {});\n }\n\n const zipOptions = {...ZipWriter.options.zip, ...options?.zip};\n const jszipOptions: JSZipGeneratorOptions = {...ZipWriter.options?.jszip, ...options.jszip};\n\n try {\n return await jsZip.generateAsync(\n {...jszipOptions, type: 'arraybuffer'}, // generate an arraybuffer\n zipOptions.onUpdate\n );\n } catch (error) {\n options.log.error(`Unable to encode zip archive: ${error}`);\n throw error;\n }\n}\n"],"mappings":"AAKA,OAAOA,KAAK,MAA+B,OAAO;AAGlD,MAAMC,OAAO,GAAG,cAAkB,KAAK,WAAW,aAAiB,QAAQ;AAa3E,OAAO,MAAMC,SAAkF,GAAG;EAChGC,IAAI,EAAE,aAAa;EACnBC,EAAE,EAAE,KAAK;EACTC,MAAM,EAAE,KAAK;EACbC,OAAO,EAAEL,OAAO;EAChBM,UAAU,EAAE,CAAC,KAAK,CAAC;EACnBC,QAAQ,EAAE,SAAS;EACnBC,SAAS,EAAE,CAAC,iBAAiB,CAAC;EAC9BC,OAAO,EAAE;IACPC,GAAG,EAAE;MACHC,QAAQ,EAAEA,CAAA,KAAM,CAAC;IACnB,CAAC;IACDC,KAAK,EAAE,CAAC;EACV,CAAC;EACDC,MAAM,EAAEC;AACV,CAAC;AAED,eAAeA,cAAcA,CAC3BC,OAAoC,EAEd;EAAA,IAAAC,kBAAA;EAAA,IADtBP,OAAyB,GAAAQ,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EAE9B,MAAMG,KAAK,GAAG,IAAIrB,KAAK,CAAC,CAAC;EAEzB,KAAK,MAAMsB,WAAW,IAAIN,OAAO,EAAE;IACjC,MAAMO,WAAW,GAAGP,OAAO,CAACM,WAAW,CAAC;IAIxCD,KAAK,CAACG,IAAI,CAACF,WAAW,EAAEC,WAAW,EAAE,CAAAb,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEG,KAAK,KAAI,CAAC,CAAC,CAAC;EAC5D;EAEA,MAAMY,UAAU,GAAG;IAAC,GAAGvB,SAAS,CAACQ,OAAO,CAACC,GAAG;IAAE,IAAGD,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEC,GAAG;EAAA,CAAC;EAC9D,MAAMe,YAAmC,GAAG;IAAC,KAAAT,kBAAA,GAAGf,SAAS,CAACQ,OAAO,cAAAO,kBAAA,uBAAjBA,kBAAA,CAAmBJ,KAAK;IAAE,GAAGH,OAAO,CAACG;EAAK,CAAC;EAE3F,IAAI;IACF,OAAO,MAAMQ,KAAK,CAACM,aAAa,CAC9B;MAAC,GAAGD,YAAY;MAAEE,IAAI,EAAE;IAAa,CAAC,EACtCH,UAAU,CAACb,QACb,CAAC;EACH,CAAC,CAAC,OAAOiB,KAAK,EAAE;IACdnB,OAAO,CAACoB,GAAG,CAACD,KAAK,CAAE,iCAAgCA,KAAM,EAAC,CAAC;IAC3D,MAAMA,KAAK;EACb;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/zip",
3
- "version": "4.1.0-alpha.9",
3
+ "version": "4.1.1",
4
4
  "description": "Zip Archive Loader",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -22,9 +22,9 @@
22
22
  "module": "dist/index.js",
23
23
  "exports": {
24
24
  ".": {
25
+ "types": "./dist/index.d.ts",
25
26
  "import": "./dist/index.js",
26
- "require": "./dist/index.cjs",
27
- "types": "./dist/index.d.ts"
27
+ "require": "./dist/index.cjs"
28
28
  }
29
29
  },
30
30
  "sideEffects": false,
@@ -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.9",
42
- "@loaders.gl/crypto": "4.1.0-alpha.9",
43
- "@loaders.gl/loader-utils": "4.1.0-alpha.9",
41
+ "@loaders.gl/compression": "4.1.1",
42
+ "@loaders.gl/crypto": "4.1.1",
43
+ "@loaders.gl/loader-utils": "4.1.1",
44
44
  "jszip": "^3.1.5",
45
45
  "md5": "^2.3.0"
46
46
  },
47
- "gitHead": "0291d4d78d71202385d0368942f84778d6aafa82"
47
+ "gitHead": "b4a8cb4e5c2b67ac0e1afaa21ae45b3a45a91db0"
48
48
  }
@@ -3,8 +3,12 @@
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
5
  import {MD5Hash} from '@loaders.gl/crypto';
6
- import {FileProvider, concatenateArrayBuffers} from '@loaders.gl/loader-utils';
7
- import {makeZipCDHeaderIterator} from './parse-zip/cd-file-header';
6
+ import {
7
+ FileProvider,
8
+ concatenateArrayBuffers,
9
+ concatenateArrayBuffersFromArray
10
+ } from '@loaders.gl/loader-utils';
11
+ import {ZipCDFileHeader, makeZipCDHeaderIterator} from './parse-zip/cd-file-header';
8
12
 
9
13
  /**
10
14
  * Reads hash file from buffer and returns it in ready-to-use form
@@ -41,6 +45,17 @@ export async function makeHashTableFromZipHeaders(
41
45
  fileProvider: FileProvider
42
46
  ): Promise<Record<string, bigint>> {
43
47
  const zipCDIterator = makeZipCDHeaderIterator(fileProvider);
48
+ return getHashTable(zipCDIterator);
49
+ }
50
+
51
+ /**
52
+ * creates hash table from file offset iterator
53
+ * @param zipCDIterator iterator to use
54
+ * @returns hash table
55
+ */
56
+ export async function getHashTable(
57
+ zipCDIterator: AsyncIterable<ZipCDFileHeader>
58
+ ): Promise<Record<string, bigint>> {
44
59
  const md5Hash = new MD5Hash();
45
60
  const textEncoder = new TextEncoder();
46
61
 
@@ -56,17 +71,37 @@ export async function makeHashTableFromZipHeaders(
56
71
  return hashTable;
57
72
  }
58
73
 
74
+ /** item of the file offset list */
75
+ type FileListItem = {
76
+ fileName: string;
77
+ localHeaderOffset: bigint;
78
+ };
79
+
59
80
  /**
60
81
  * creates hash file that later can be added to the SLPK archive
61
- * @param fileProvider SLPK archive where we need to add hash file
82
+ * @param zipCDIterator iterator to use
62
83
  * @returns ArrayBuffer containing hash file
63
84
  */
64
- export async function composeHashFile(fileProvider: FileProvider): Promise<ArrayBuffer> {
65
- const hashArray = await makeHashTableFromZipHeaders(fileProvider);
66
- const bufferArray = Object.entries(hashArray)
67
- .map(([key, value]) => concatenateArrayBuffers(hexStringToBuffer(key), bigintToBuffer(value)))
68
- .sort(compareHashes);
69
- return concatenateArrayBuffers(...bufferArray);
85
+ export async function composeHashFile(
86
+ zipCDIterator: AsyncIterable<FileListItem> | Iterable<FileListItem>
87
+ ): Promise<ArrayBuffer> {
88
+ const md5Hash = new MD5Hash();
89
+ const textEncoder = new TextEncoder();
90
+
91
+ const hashArray: ArrayBuffer[] = [];
92
+
93
+ for await (const cdHeader of zipCDIterator) {
94
+ const filename = cdHeader.fileName.split('\\').join('/').toLocaleLowerCase();
95
+ const arrayBuffer = textEncoder.encode(filename).buffer;
96
+ const md5 = await md5Hash.hash(arrayBuffer, 'hex');
97
+ hashArray.push(
98
+ concatenateArrayBuffers(hexStringToBuffer(md5), bigintToBuffer(cdHeader.localHeaderOffset))
99
+ );
100
+ }
101
+
102
+ const bufferArray = hashArray.sort(compareHashes);
103
+
104
+ return concatenateArrayBuffersFromArray(bufferArray);
70
105
  }
71
106
 
72
107
  /**