@lyleunderwood/streaming-zipper
Version:
Memory-efficient streaming ZIP creation with automatic backpressure control. Supports parallel reading + sequential writing for both Web Streams and Node.js streams with ZIP64 support.
185 lines • 5.62 kB
TypeScript
/**
* ZIP file format structures and constants
* Based on ZIP specification: https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
*/
export declare const ZIP_CONSTANTS: {
readonly LOCAL_FILE_HEADER_SIGNATURE: 67324752;
readonly CENTRAL_DIRECTORY_SIGNATURE: 33639248;
readonly END_OF_CENTRAL_DIRECTORY_SIGNATURE: 101010256;
readonly ZIP64_END_OF_CENTRAL_DIRECTORY_SIGNATURE: 101075792;
readonly ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_SIGNATURE: 117853008;
readonly DATA_DESCRIPTOR_SIGNATURE: 134695760;
readonly COMPRESSION_STORE: 0;
readonly COMPRESSION_DEFLATE: 8;
readonly FLAG_ENCRYPTED: 1;
readonly FLAG_DATA_DESCRIPTOR: 8;
readonly FLAG_UTF8: 2048;
readonly ZIP64_LIMIT: 4294967295;
readonly ZIP64_LIMIT_16: 65535;
readonly ZIP64_EXTRA_FIELD_TYPE: 1;
readonly VERSION_MADE_BY: 831;
readonly VERSION_NEEDED_EXTRACT: 20;
readonly VERSION_NEEDED_EXTRACT_ZIP64: 45;
};
export interface ZipEntry {
name: string;
data: ReadableStream<Uint8Array> | NodeJS.ReadableStream;
size?: number;
lastModified?: Date;
comment?: string;
permissions?: number;
crc32?: number;
compressedSize?: number;
uncompressedSize?: number;
preCompressed?: boolean;
}
/**
* Fast-path entry for STORE compression with pre-calculated CRC32
* Enables immediate streaming without buffering
*/
export interface FastPathStoreEntry extends ZipEntry {
crc32: number;
size: number;
preCompressed?: false;
}
/**
* Fast-path entry for pre-compressed DEFLATE data
* Enables immediate streaming of already-compressed data
*/
export interface FastPathDeflateEntry extends ZipEntry {
crc32: number;
compressedSize: number;
uncompressedSize: number;
preCompressed: true;
}
/**
* Type guard to check if entry is a fast-path STORE entry
*/
export declare function isFastPathStoreEntry(entry: ZipEntry): entry is FastPathStoreEntry;
/**
* Type guard to check if entry is a fast-path DEFLATE entry
*/
export declare function isFastPathDeflateEntry(entry: ZipEntry): entry is FastPathDeflateEntry;
/**
* Check if entry can use fast-path immediate streaming
*/
export declare function canUseFastPath(entry: ZipEntry, compressionMethod: 'store' | 'deflate'): boolean;
export interface LocalFileHeader {
signature: number;
versionNeeded: number;
flags: number;
compressionMethod: number;
lastModTime: number;
lastModDate: number;
crc32: number;
compressedSize: number;
uncompressedSize: number;
filenameLength: number;
extraFieldLength: number;
filename: Uint8Array;
extraField: Uint8Array;
}
export interface CentralDirectoryHeader {
signature: number;
versionMadeBy: number;
versionNeeded: number;
flags: number;
compressionMethod: number;
lastModTime: number;
lastModDate: number;
crc32: number;
compressedSize: number;
uncompressedSize: number;
filenameLength: number;
extraFieldLength: number;
commentLength: number;
diskNumber: number;
internalAttributes: number;
externalAttributes: number;
localHeaderOffset: number;
filename: Uint8Array;
extraField: Uint8Array;
comment: Uint8Array;
}
export interface EndOfCentralDirectory {
signature: number;
diskNumber: number;
centralDirDisk: number;
centralDirRecords: number;
totalRecords: number;
centralDirSize: number;
centralDirOffset: number;
commentLength: number;
comment: Uint8Array;
}
export interface Zip64EndOfCentralDirectory {
signature: number;
recordSize: bigint;
versionMadeBy: number;
versionNeeded: number;
diskNumber: number;
centralDirDisk: number;
centralDirRecords: bigint;
totalRecords: bigint;
centralDirSize: bigint;
centralDirOffset: bigint;
}
export interface Zip64EndOfCentralDirectoryLocator {
signature: number;
zip64EndDisk: number;
zip64EndOffset: bigint;
totalDisks: number;
}
export interface DataDescriptor {
signature?: number;
crc32: number;
compressedSize: number;
uncompressedSize: number;
}
export interface Zip64DataDescriptor {
signature?: number;
crc32: number;
compressedSize: bigint;
uncompressedSize: bigint;
}
export interface Zip64ExtraField {
type: number;
size: number;
uncompressedSize?: bigint;
compressedSize?: bigint;
localHeaderOffset?: bigint;
diskNumber?: number;
}
/**
* Converts a Date to DOS date/time format
*/
export declare function dateToDosDateTime(date: Date): {
date: number;
time: number;
};
/**
* Determines if ZIP64 format is needed based on sizes
*/
export declare function needsZip64(uncompressedSize: number | bigint, compressedSize: number | bigint, localHeaderOffset: number | bigint, centralDirSize: number | bigint, entryCount: number): boolean;
/**
* Creates a ZIP64 extra field
*/
export declare function createZip64ExtraField(uncompressedSize?: bigint, compressedSize?: bigint, localHeaderOffset?: bigint, diskNumber?: number): Uint8Array;
/**
* Constants for Unix file permissions and types
*/
export declare const UNIX_FILE_TYPES: {
readonly REGULAR_FILE: 32768;
readonly DIRECTORY: 16384;
readonly SYMBOLIC_LINK: 40960;
};
export declare const DEFAULT_PERMISSIONS: {
readonly FILE: 420;
readonly DIRECTORY: 493;
readonly EXECUTABLE: 493;
};
/**
* Creates external attributes for ZIP entry with Unix permissions
*/
export declare function createExternalAttributes(permissions?: number, isDirectory?: boolean): number;
//# sourceMappingURL=zip-format.d.ts.map