From f842cad5a75f352efd5c4098f25056406a1ffbd4 Mon Sep 17 00:00:00 2001 From: Kurt Thiemann Date: Fri, 23 Feb 2024 19:16:29 +0100 Subject: [PATCH] implement DataStream in EntryDataReader, remove incorrect exports in index-browser.js --- index-browser.js | 20 ------------- package-lock.json | 29 ++++++------------ package.json | 4 +-- src/Archive/Entry/ArchiveEntry.js | 3 +- src/Archive/Entry/EntryDataReader.js | 44 +++++++++++++++++++++++++--- 5 files changed, 53 insertions(+), 47 deletions(-) diff --git a/index-browser.js b/index-browser.js index 129e76a..48f2110 100644 --- a/index-browser.js +++ b/index-browser.js @@ -32,28 +32,8 @@ export { default as Zip64ExtendedInformation } from "./src/Archive/Structure/Ext export { default as ExtraField } from "./src/Archive/Structure/ExtraField/ExtraField.js"; export { default as UnicodeExtraField } from "./src/Archive/Structure/ExtraField/UnicodeExtraField.js"; -export { default as DataReader } from "./src/Reader/DataReader.js"; -export { default as BufferedDataReader } from "./src/Reader/BufferedDataReader.js"; -export { default as BrowserFileReader } from "./src/Reader/BrowserFileReader.js"; -export { default as ArrayBufferReader } from "./src/Reader/ArrayBufferReader.js"; - export { default as CP437 } from "./src/Util/CP437.js"; -export { default as CRC32 } from "./src/Util/CRC32.js"; export { default as MsDosTime } from "./src/Util/MsDosTime.js"; -export { default as BufferUtils } from "./src/Util/BufferUtils.js"; - -export { default as DataProcessor } from "./src/DataProcessor/DataProcessor.js"; -export { default as AbstractDataProcessor } from "./src/DataProcessor/AbstractDataProcessor.js"; -export { default as FflateInflateDataProcessor } from "./src/DataProcessor/Fflate/FflateInflateDataProcessor.js"; -export { default as PassThroughDataProcessor } from "./src/DataProcessor/PassThroughDataProcessor.js"; -export { default as FflateDeflateDataProcessor } from "./src/DataProcessor/Fflate/FflateDeflateDataProcessor.js"; -export { default as FflateDataProcessor } from "./src/DataProcessor/Fflate/FflateDataProcessor.js"; -export { default as NativeDeflateDataProcessor } from "./src/DataProcessor/Native/NativeDeflateDataProcessor.js"; -export { default as NativeInflateDataProcessor } from "./src/DataProcessor/Native/NativeInflateDataProcessor.js"; -export { default as NativeStreamDataProcessor } from "./src/DataProcessor/Native/NativeStreamDataProcessor.js"; -export { default as FallbackDataProcessor } from "./src/DataProcessor/FallbackDataProcessor.js"; -export { default as DefaultInflateDataProcessor } from "./src/DataProcessor/DefaultInflateDataProcessor.js"; -export { default as DefaultDeflateDataProcessor } from "./src/DataProcessor/DefaultDeflateDataProcessor.js"; export { default as Options } from "./src/Options/Options.js"; export { default as EntrySourceOptions } from "./src/Options/EntrySourceOptions.js"; diff --git a/package-lock.json b/package-lock.json index 820e1fd..2ae03d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,15 @@ { "name": "armarius", - "version": "1.14.2", + "version": "2.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "armarius", - "version": "1.14.2", + "version": "2.0.0", "license": "MIT", "dependencies": { - "armarius-io": "^1.0.1", - "fflate": "^0.7.3" + "armarius-io": "^1.2.0" }, "devDependencies": { "@jest/globals": "^29.7.0", @@ -2002,9 +2001,9 @@ "dev": true }, "node_modules/armarius-io": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/armarius-io/-/armarius-io-1.0.1.tgz", - "integrity": "sha512-aivy44rzMb7Cu65K/KDfr2zBl0jA4lxsxhB5sv+FPMxlZbhAiThKMNyzukUconiCM76rmXO3hzHjhl4rMFNgSg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/armarius-io/-/armarius-io-1.2.0.tgz", + "integrity": "sha512-nSMrSkgNfvH8G1HOaQzveGbDwaSJNuZO7PFmDQLRpWp/mBN/ENz/tb9IBSiLl3D/vkGb1BDCL/nom6CknQbhBg==", "dependencies": { "fflate": "^0.8.2" } @@ -3024,11 +3023,6 @@ "bser": "2.1.1" } }, - "node_modules/fflate": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.3.tgz", - "integrity": "sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw==" - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -7318,9 +7312,9 @@ "dev": true }, "armarius-io": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/armarius-io/-/armarius-io-1.0.1.tgz", - "integrity": "sha512-aivy44rzMb7Cu65K/KDfr2zBl0jA4lxsxhB5sv+FPMxlZbhAiThKMNyzukUconiCM76rmXO3hzHjhl4rMFNgSg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/armarius-io/-/armarius-io-1.2.0.tgz", + "integrity": "sha512-nSMrSkgNfvH8G1HOaQzveGbDwaSJNuZO7PFmDQLRpWp/mBN/ENz/tb9IBSiLl3D/vkGb1BDCL/nom6CknQbhBg==", "requires": { "fflate": "^0.8.2" }, @@ -8100,11 +8094,6 @@ "bser": "2.1.1" } }, - "fflate": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.3.tgz", - "integrity": "sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw==" - }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", diff --git a/package.json b/package.json index f75be6a..bd9dfb1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "armarius", - "version": "2.0.0", + "version": "2.1.0", "description": "A JavaScript library to read, write, and merge ZIP archives in web browsers.", "repository": "github:aternosorg/armarius", "type": "module", @@ -15,7 +15,7 @@ "author": "Kurt Thiemann ", "license": "MIT", "dependencies": { - "armarius-io": "^1.0.1" + "armarius-io": "^1.2.0" }, "devDependencies": { "@jest/globals": "^29.7.0", diff --git a/src/Archive/Entry/ArchiveEntry.js b/src/Archive/Entry/ArchiveEntry.js index 8e49083..c3d2343 100644 --- a/src/Archive/Entry/ArchiveEntry.js +++ b/src/Archive/Entry/ArchiveEntry.js @@ -239,7 +239,8 @@ export default class ArchiveEntry { await this.readLocalFileHeader(); return new EntryDataReader( await this.getDataProcessor(), - this.centralDirectoryFileHeader.crc32 + this.centralDirectoryFileHeader.crc32, + Number(this.getUncompressedSize()) ); } diff --git a/src/Archive/Entry/EntryDataReader.js b/src/Archive/Entry/EntryDataReader.js index 26f32d5..59d40d6 100644 --- a/src/Archive/Entry/EntryDataReader.js +++ b/src/Archive/Entry/EntryDataReader.js @@ -1,22 +1,33 @@ import ChecksumError from '../../Error/ChecksumError.js'; +import {DataStream} from 'armarius-io'; -export default class EntryDataReader { - /** @type {DataProcessor} */ dataProcessor; +export default class EntryDataReader extends DataStream { + /** @type {import("armarius-io").DataProcessor} */ dataProcessor; /** @type {import("armarius-io").CRC32} */ crc32; /** @type {number} */ expectedCrc32; + /** @type {number} */ expectedSize; + /** @type {number} */ offset = 0; /** - * @param {DataProcessor} dataProcessor + * @param {import("armarius-io").DataProcessor} dataProcessor * @param {number} expectedCrc32 + * @param {number} expectedSize */ - constructor(dataProcessor, expectedCrc32) { + constructor(dataProcessor, expectedCrc32, expectedSize) { + super(); this.dataProcessor = dataProcessor; this.expectedCrc32 = expectedCrc32; + this.expectedSize = expectedSize; } + /** + * @inheritDoc + */ async reset() { await this.dataProcessor.reset(); + this.offset = 0; this.eof = false; + return this; } /** @@ -27,6 +38,10 @@ export default class EntryDataReader { let uncompressed = await this.dataProcessor.read(length); let eof = uncompressed === null; + if (!eof) { + this.offset += uncompressed.byteLength; + } + if (this.dataProcessor.getPostCrc()) { if (eof && this.dataProcessor.getPostCrc().finish() !== this.expectedCrc32) { throw new ChecksumError('CRC32 checksum does not match expected value'); @@ -35,5 +50,26 @@ export default class EntryDataReader { return uncompressed; } + + /** + * @returns {number} + */ + getFinalLength() { + return this.expectedSize; + } + + /** + * @inheritDoc + */ + async pull(length) { + return await this.read(length); + } + + /** + * @inheritDoc + */ + getOffset() { + return this.offset; + } }