streams-to-zip
v1.0.0
Published
Создает ZIP-архив из массива потоков и пишет его в целевой WritableStream.
Downloads
175
Maintainers
Readme
streams-to-zip
Библиотека для создания ZIP-архивов.
Особенности
- Используется Web Streams API, что позволяет обрабатывать большие объемы данных
- Сжатие реализовано с использованием Compression Streams API
- Настройки сжатия индивидуальны для каждого входящего потока данных
- Нет зависимостей от сторонних библиотек
- Применимо во frontend и backend проектах на JavaScript и TypeScript
API
Тип ZipEntry
Используется для описания одного файла внутри ZIP-архива.
export type ZipEntry = {
inputStream: ReadableStream<Uint8Array<ArrayBuffer>>, // поток исходных данных файла
path: string, // путь внутри архива, например "xl/theme/theme1.xml",
compress?: boolean // флаг необходимости сжатия: true - сжимать поток, false - нет
};Функция streamsToZip(...)
export declare function streamsToZip(entries: ZipEntry[], outputStream: WritableStream<Uint8Array>): Promise<void>;Создает ZIP-архив из массива потоков entries и пишет его в целевой outputStream.
Подходит для больших файлов благодаря потоковой обработке.
import { streamsToZip } from "streams-to-zip";
// ...
await streamsToZip(entries, outputStream)Пример использования в Node.js
import { createWriteStream } from 'node:fs';
import { Writable } from "node:stream";
import { streamsToZip } from "streams-to-zip";
/**
* Поток положительных целых чисел
* @param {number} n запрашиваемое количество чисел
* @returns {ReadableStream<number>}
*/
function positiveNumbers(n) {
let i = 0
return new ReadableStream({
pull(controller) {
if (i >= n) {
controller.close();
} else {
controller.enqueue(++ i);
}
}
})
}
/**
* Поток чисел Фибоначчи
* @param {number} n запрашиваемое количество чисел
* @returns {ReadableStream<number>}
*/
function fibonacciNumbers(n) {
let i = 0, a = 0, b = 1
return new ReadableStream({
pull(controller) {
if (i >= n) {
controller.close();
} else if (i === 0) {
controller.enqueue(a);
} else if (i === 1) {
controller.enqueue(b);
} else {
const x = a + b;
a = b;
b = x;
controller.enqueue(x);
}
i ++;
}
})
}
/**
* Создать преобразователь потока чисел в поток строк
*/
function toLines() {
return new TransformStream({
transform(chunk, controller) {
controller.enqueue(chunk.toString() + "\n")
}
})
}
(async () => {
const fileName = 'example.zip'
// Создать новый файл и использовать его как `WritableStream`
const outputStream = Writable.toWeb(createWriteStream(fileName, { flags: 'w' }));
// Список файлов внутри ZIP-архива
const entries = [
{
path: 'numbers/positive-20',
inputStream: positiveNumbers(20)
.pipeThrough(toLines())
.pipeThrough(new TextEncoderStream()),
},
{
path: 'numbers/fibonacci-20',
inputStream: fibonacciNumbers(20)
.pipeThrough(toLines())
.pipeThrough(new TextEncoderStream()),
compress: true
},
// ...
]
// Записать ZIP-архив в целевой поток `WritableStream`
await streamsToZip(entries, outputStream);
})()
.catch(console.error);Лицензия
MIT
