simple-zstd 1.4.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +46 -0
- package/.github/workflows/release.yml +45 -0
- package/.prettierignore +5 -0
- package/.prettierrc +8 -0
- package/.release-it.json +28 -0
- package/CHANGELOG.md +26 -0
- package/README.md +690 -47
- package/dist/src/buffer-writable.d.ts +12 -0
- package/dist/src/buffer-writable.js +41 -0
- package/dist/src/index.d.ts +49 -0
- package/dist/src/index.js +430 -0
- package/dist/src/peek-transform.d.ts +16 -0
- package/dist/src/peek-transform.js +145 -0
- package/dist/src/process-duplex.d.ts +11 -0
- package/dist/src/process-duplex.js +157 -0
- package/dist/src/process-queue.d.ts +8 -0
- package/dist/src/process-queue.js +94 -0
- package/dist/src/types.d.ts +34 -0
- package/dist/src/types.js +3 -0
- package/eslint.config.js +49 -0
- package/package.json +32 -16
- package/src/buffer-writable.ts +30 -0
- package/src/index.ts +472 -0
- package/src/is-zst.d.ts +5 -0
- package/src/peek-transform.ts +153 -0
- package/src/process-duplex.ts +164 -0
- package/src/process-queue.ts +97 -0
- package/src/types.ts +35 -0
- package/tsconfig.json +110 -0
- package/.eslintrc.js +0 -18
- package/.nyc_output/4b36a1ef-a01d-4de7-a4be-e966f315cbd7.json +0 -1
- package/.nyc_output/5d73987b-f188-488b-8441-66c67bb19076.json +0 -1
- package/.nyc_output/processinfo/4b36a1ef-a01d-4de7-a4be-e966f315cbd7.json +0 -1
- package/.nyc_output/processinfo/5d73987b-f188-488b-8441-66c67bb19076.json +0 -1
- package/.nyc_output/processinfo/index.json +0 -1
- package/.travis.yml +0 -9
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/buffer-writable.js.html +0 -154
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -146
- package/coverage/index.js.html +0 -841
- package/coverage/oven.js.html +0 -235
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -196
- package/index.js +0 -68
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Writable, WritableOptions } from 'node:stream';
|
|
2
|
+
export default class BufferWritable extends Writable {
|
|
3
|
+
#private;
|
|
4
|
+
constructor(options: WritableOptions);
|
|
5
|
+
_write(chunk: Buffer, encoding: string, callback?: () => void): void;
|
|
6
|
+
_writev(chunks: Array<{
|
|
7
|
+
chunk: Buffer;
|
|
8
|
+
encoding: string;
|
|
9
|
+
}>, callback?: () => void): void;
|
|
10
|
+
_final(callback?: () => void): void;
|
|
11
|
+
getBuffer(): Buffer;
|
|
12
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var _BufferWritable_buf;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const node_stream_1 = require("node:stream");
|
|
16
|
+
class BufferWritable extends node_stream_1.Writable {
|
|
17
|
+
constructor(options) {
|
|
18
|
+
super(options);
|
|
19
|
+
_BufferWritable_buf.set(this, void 0);
|
|
20
|
+
__classPrivateFieldSet(this, _BufferWritable_buf, [], "f");
|
|
21
|
+
}
|
|
22
|
+
_write(chunk, encoding, callback = () => null) {
|
|
23
|
+
__classPrivateFieldGet(this, _BufferWritable_buf, "f").push(chunk);
|
|
24
|
+
callback();
|
|
25
|
+
}
|
|
26
|
+
_writev(chunks, callback = () => null) {
|
|
27
|
+
for (const { chunk } of chunks) {
|
|
28
|
+
__classPrivateFieldGet(this, _BufferWritable_buf, "f").push(chunk);
|
|
29
|
+
}
|
|
30
|
+
callback();
|
|
31
|
+
}
|
|
32
|
+
_final(callback = () => null) {
|
|
33
|
+
callback();
|
|
34
|
+
}
|
|
35
|
+
getBuffer() {
|
|
36
|
+
return Buffer.concat(__classPrivateFieldGet(this, _BufferWritable_buf, "f")) || Buffer.alloc(0);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
_BufferWritable_buf = new WeakMap();
|
|
40
|
+
exports.default = BufferWritable;
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVmZmVyLXdyaXRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1ZmZlci13cml0YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUF3RDtBQUV4RCxNQUFxQixjQUFlLFNBQVEsc0JBQVE7SUFHbEQsWUFBWSxPQUF3QjtRQUNsQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFIakIsc0NBQW9CO1FBSWxCLHVCQUFBLElBQUksdUJBQVEsRUFBRSxNQUFBLENBQUM7SUFDakIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFhLEVBQUUsUUFBZ0IsRUFBRSxXQUF1QixHQUFHLEVBQUUsQ0FBQyxJQUFJO1FBQ3ZFLHVCQUFBLElBQUksMkJBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsUUFBUSxFQUFFLENBQUM7SUFDYixDQUFDO0lBRUQsT0FBTyxDQUFDLE1BQWtELEVBQUUsV0FBdUIsR0FBRyxFQUFFLENBQUMsSUFBSTtRQUMzRixLQUFLLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMvQix1QkFBQSxJQUFJLDJCQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLENBQUM7UUFDRCxRQUFRLEVBQUUsQ0FBQztJQUNiLENBQUM7SUFFRCxNQUFNLENBQUMsV0FBdUIsR0FBRyxFQUFFLENBQUMsSUFBSTtRQUN0QyxRQUFRLEVBQUUsQ0FBQztJQUNiLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLHVCQUFBLElBQUksMkJBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztDQUNGOztrQkEzQm9CLGNBQWMifQ==
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Duplex } from 'node:stream';
|
|
2
|
+
import { ZSTDOpts, PoolOpts } from './types';
|
|
3
|
+
export type { ZSTDOpts, PoolOpts, CompressOpts, DecompressOpts, DictionaryObject } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* Clear the dictionary cache and cleanup all temporary files
|
|
6
|
+
* This is useful for testing or manual cache management
|
|
7
|
+
* @returns Promise that resolves when all cleanups are complete
|
|
8
|
+
*/
|
|
9
|
+
export declare function clearDictionaryCache(): Promise<void>;
|
|
10
|
+
export declare function compress(compLevel: number, opts?: ZSTDOpts): Promise<Duplex>;
|
|
11
|
+
export declare function compressBuffer(buffer: Buffer, compLevel: number, opts?: ZSTDOpts): Promise<Buffer>;
|
|
12
|
+
export declare function decompress(opts?: ZSTDOpts): Promise<Duplex>;
|
|
13
|
+
export declare function decompressBuffer(buffer: Buffer, opts?: ZSTDOpts): Promise<Buffer>;
|
|
14
|
+
export declare class SimpleZSTD {
|
|
15
|
+
#private;
|
|
16
|
+
private constructor();
|
|
17
|
+
/**
|
|
18
|
+
* Create a new SimpleZSTD instance with process pooling
|
|
19
|
+
* @param poolOptions - Configuration for compression and decompression process pools
|
|
20
|
+
* @returns Promise resolving to initialized SimpleZSTD instance
|
|
21
|
+
*/
|
|
22
|
+
static create(poolOptions?: PoolOpts): Promise<SimpleZSTD>;
|
|
23
|
+
get queueStats(): {
|
|
24
|
+
compress: {
|
|
25
|
+
hits: number;
|
|
26
|
+
misses: number;
|
|
27
|
+
};
|
|
28
|
+
decompress: {
|
|
29
|
+
hits: number;
|
|
30
|
+
misses: number;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
destroy(): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Get a compression stream from the pool, or create a one-off stream with custom compression level
|
|
36
|
+
* @param compLevel - Optional compression level (1-22). If provided, creates a new stream instead of using the pool
|
|
37
|
+
* @returns Promise resolving to a Duplex compression stream
|
|
38
|
+
*/
|
|
39
|
+
compress(compLevel?: number): Promise<Duplex>;
|
|
40
|
+
/**
|
|
41
|
+
* Compress a buffer using the pool, or with a custom compression level
|
|
42
|
+
* @param buffer - Buffer to compress
|
|
43
|
+
* @param compLevel - Optional compression level (1-22). If provided, uses this level instead of pool default
|
|
44
|
+
* @returns Promise resolving to compressed buffer
|
|
45
|
+
*/
|
|
46
|
+
compressBuffer(buffer: Buffer, compLevel?: number): Promise<Buffer>;
|
|
47
|
+
decompress(): Promise<Duplex>;
|
|
48
|
+
decompressBuffer(buffer: Buffer): Promise<Buffer>;
|
|
49
|
+
}
|
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
var _SimpleZSTD_compressQueue, _SimpleZSTD_decompressQueue, _SimpleZSTD_compressDictCleanup, _SimpleZSTD_decompressDictCleanup, _SimpleZSTD_ready, _SimpleZSTD_poolOptions;
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.SimpleZSTD = void 0;
|
|
19
|
+
exports.clearDictionaryCache = clearDictionaryCache;
|
|
20
|
+
exports.compress = compress;
|
|
21
|
+
exports.compressBuffer = compressBuffer;
|
|
22
|
+
exports.decompress = decompress;
|
|
23
|
+
exports.decompressBuffer = decompressBuffer;
|
|
24
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
25
|
+
const promises_1 = require("node:fs/promises");
|
|
26
|
+
const node_crypto_1 = require("node:crypto");
|
|
27
|
+
const node_stream_1 = require("node:stream");
|
|
28
|
+
const promises_2 = require("node:stream/promises");
|
|
29
|
+
const node_child_process_1 = require("node:child_process");
|
|
30
|
+
const is_zst_1 = __importDefault(require("is-zst"));
|
|
31
|
+
const tmp_promise_1 = require("tmp-promise");
|
|
32
|
+
const debug_1 = __importDefault(require("debug"));
|
|
33
|
+
const debug = (0, debug_1.default)('SimpleZSTD');
|
|
34
|
+
const process_queue_1 = __importDefault(require("./process-queue"));
|
|
35
|
+
const buffer_writable_1 = __importDefault(require("./buffer-writable"));
|
|
36
|
+
const process_duplex_1 = __importDefault(require("./process-duplex"));
|
|
37
|
+
const peek_transform_1 = __importDefault(require("./peek-transform"));
|
|
38
|
+
// Dictionary cache to avoid recreating temp files for the same dictionary buffer
|
|
39
|
+
// Map: hash -> { path: string, cleanup: () => void, refCount: number }
|
|
40
|
+
const dictionaryCache = new Map();
|
|
41
|
+
function hashBuffer(buffer) {
|
|
42
|
+
return (0, node_crypto_1.createHash)('sha256').update(buffer).digest('hex');
|
|
43
|
+
}
|
|
44
|
+
async function getCachedDictionaryPath(dictionary) {
|
|
45
|
+
const hash = hashBuffer(dictionary);
|
|
46
|
+
let cached = dictionaryCache.get(hash);
|
|
47
|
+
if (cached) {
|
|
48
|
+
cached.refCount++;
|
|
49
|
+
debug(`Dictionary cache hit: ${hash.slice(0, 8)}... (refCount: ${cached.refCount})`);
|
|
50
|
+
return {
|
|
51
|
+
path: cached.path,
|
|
52
|
+
cleanup: () => {
|
|
53
|
+
cached.refCount--;
|
|
54
|
+
debug(`Dictionary refCount decreased: ${hash.slice(0, 8)}... (refCount: ${cached.refCount})`);
|
|
55
|
+
// Don't call async cleanup here - it will be handled by clearDictionaryCache()
|
|
56
|
+
// or when all references are released
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
debug(`Dictionary cache miss: ${hash.slice(0, 8)}... - creating temp file`);
|
|
61
|
+
const { path, cleanup: tmpCleanup } = await (0, tmp_promise_1.file)({ prefix: 'zstd-dict-' });
|
|
62
|
+
await (0, promises_1.writeFile)(path, dictionary);
|
|
63
|
+
dictionaryCache.set(hash, {
|
|
64
|
+
path,
|
|
65
|
+
cleanup: tmpCleanup,
|
|
66
|
+
refCount: 1,
|
|
67
|
+
});
|
|
68
|
+
return {
|
|
69
|
+
path,
|
|
70
|
+
cleanup: () => {
|
|
71
|
+
const cached = dictionaryCache.get(hash);
|
|
72
|
+
if (cached) {
|
|
73
|
+
cached.refCount--;
|
|
74
|
+
debug(`Dictionary refCount decreased: ${hash.slice(0, 8)}... (refCount: ${cached.refCount})`);
|
|
75
|
+
// Don't call async cleanup here - it will be handled by clearDictionaryCache()
|
|
76
|
+
// or when all references are released
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Clear the dictionary cache and cleanup all temporary files
|
|
83
|
+
* This is useful for testing or manual cache management
|
|
84
|
+
* @returns Promise that resolves when all cleanups are complete
|
|
85
|
+
*/
|
|
86
|
+
async function clearDictionaryCache() {
|
|
87
|
+
debug('Clearing dictionary cache');
|
|
88
|
+
const cleanupPromises = [];
|
|
89
|
+
for (const [hash, cached] of dictionaryCache.entries()) {
|
|
90
|
+
debug(`Cleaning up cached dictionary: ${hash.slice(0, 8)}...`);
|
|
91
|
+
// tmp-promise cleanup() returns a Promise
|
|
92
|
+
cleanupPromises.push(Promise.resolve(cached.cleanup()));
|
|
93
|
+
}
|
|
94
|
+
await Promise.all(cleanupPromises);
|
|
95
|
+
dictionaryCache.clear();
|
|
96
|
+
}
|
|
97
|
+
const find = process.platform === 'win32' ? 'where zstd.exe' : 'which zstd';
|
|
98
|
+
let bin;
|
|
99
|
+
try {
|
|
100
|
+
bin = (0, node_child_process_1.execSync)(find, { env: process.env }).toString().replace(/\n$/, '').replace(/\r$/, '');
|
|
101
|
+
debug(bin);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
throw new Error('Can not access zstd! Is it installed?');
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
node_fs_1.default.accessSync(bin, node_fs_1.default.constants.X_OK);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
throw new Error('zstd is not executable');
|
|
111
|
+
}
|
|
112
|
+
async function CreateCompressStream(compLevel, opts) {
|
|
113
|
+
let lvl = compLevel;
|
|
114
|
+
let zo = opts.zstdOptions || [];
|
|
115
|
+
let path = null;
|
|
116
|
+
let cleanup = () => null;
|
|
117
|
+
if (!lvl)
|
|
118
|
+
lvl = 3;
|
|
119
|
+
if (lvl < 1 || lvl > 22)
|
|
120
|
+
lvl = 3;
|
|
121
|
+
// Dictionary
|
|
122
|
+
if (opts.dictionary && 'path' in opts.dictionary) {
|
|
123
|
+
zo = [...zo, '-D', `${opts.dictionary.path}`];
|
|
124
|
+
}
|
|
125
|
+
else if (Buffer.isBuffer(opts.dictionary)) {
|
|
126
|
+
// Use cached dictionary to avoid recreating temp files
|
|
127
|
+
({ path, cleanup } = await getCachedDictionaryPath(opts.dictionary));
|
|
128
|
+
zo = [...zo, '-D', `${path}`];
|
|
129
|
+
}
|
|
130
|
+
let c;
|
|
131
|
+
try {
|
|
132
|
+
debug(bin, ['-zc', `-${lvl}`, ...zo], opts.spawnOptions, opts.streamOptions);
|
|
133
|
+
c = new process_duplex_1.default(bin, ['-zc', `-${lvl}`, ...zo], opts.spawnOptions, opts.streamOptions);
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
// cleanup if error;
|
|
137
|
+
cleanup();
|
|
138
|
+
throw err;
|
|
139
|
+
}
|
|
140
|
+
c.on('exit', (code, signal) => {
|
|
141
|
+
debug('c exit', code, signal);
|
|
142
|
+
if (code !== 0) {
|
|
143
|
+
setImmediate(() => {
|
|
144
|
+
c.destroy(new Error(`zstd exited non zero. code: ${code} signal: ${signal}`));
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
cleanup();
|
|
148
|
+
});
|
|
149
|
+
return c;
|
|
150
|
+
}
|
|
151
|
+
function CompressBuffer(buffer, c) {
|
|
152
|
+
return new Promise((resolve, reject) => {
|
|
153
|
+
const w = new buffer_writable_1.default({});
|
|
154
|
+
c.once('close', () => {
|
|
155
|
+
setImmediate(() => {
|
|
156
|
+
const result = w.getBuffer();
|
|
157
|
+
if (result) {
|
|
158
|
+
resolve(result);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
reject(new Error('Compression failed'));
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
(0, promises_2.pipeline)(node_stream_1.Readable.from(buffer), c, w)
|
|
166
|
+
.then(() => {
|
|
167
|
+
c.destroy();
|
|
168
|
+
})
|
|
169
|
+
.catch((err) => {
|
|
170
|
+
reject(err);
|
|
171
|
+
c.destroy();
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
async function CreateDecompressStream(opts) {
|
|
176
|
+
// Dictionary
|
|
177
|
+
let zo = opts.zstdOptions || [];
|
|
178
|
+
let path = null;
|
|
179
|
+
let cleanup = () => null;
|
|
180
|
+
let terminate = false;
|
|
181
|
+
if (opts.dictionary && 'path' in opts.dictionary) {
|
|
182
|
+
zo = [...zo, '-D', `${opts.dictionary.path}`];
|
|
183
|
+
}
|
|
184
|
+
else if (Buffer.isBuffer(opts.dictionary)) {
|
|
185
|
+
// Use cached dictionary to avoid recreating temp files
|
|
186
|
+
({ path, cleanup } = await getCachedDictionaryPath(opts.dictionary));
|
|
187
|
+
zo = [...zo, '-D', `${path}`];
|
|
188
|
+
}
|
|
189
|
+
let d;
|
|
190
|
+
try {
|
|
191
|
+
debug(bin, ['-dc', ...zo], opts.spawnOptions, opts.streamOptions);
|
|
192
|
+
d = new process_duplex_1.default(bin, ['-dc', ...zo], opts.spawnOptions, opts.streamOptions);
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
// cleanup if error
|
|
196
|
+
cleanup();
|
|
197
|
+
throw err;
|
|
198
|
+
}
|
|
199
|
+
d.on('exit', (code, signal) => {
|
|
200
|
+
debug('d exit', code, signal);
|
|
201
|
+
if (code !== 0 && !terminate) {
|
|
202
|
+
setImmediate(() => {
|
|
203
|
+
d.destroy(new Error(`zstd exited non zero. code: ${code} signal: ${signal}`));
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
cleanup();
|
|
207
|
+
});
|
|
208
|
+
const wrapper = new peek_transform_1.default({ maxBuffer: 10 }, (data, swap) => {
|
|
209
|
+
if ((0, is_zst_1.default)(data)) {
|
|
210
|
+
swap(null, d);
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
debug('not zstd');
|
|
214
|
+
terminate = true;
|
|
215
|
+
d.end();
|
|
216
|
+
swap(null, new node_stream_1.PassThrough());
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
// CRITICAL: Wrap _destroy to ensure ProcessDuplex is always destroyed
|
|
220
|
+
const originalDestroy = wrapper._destroy.bind(wrapper);
|
|
221
|
+
wrapper._destroy = function (error, callback) {
|
|
222
|
+
if (!d.destroyed) {
|
|
223
|
+
d.destroy();
|
|
224
|
+
}
|
|
225
|
+
originalDestroy(error, callback);
|
|
226
|
+
};
|
|
227
|
+
return wrapper;
|
|
228
|
+
}
|
|
229
|
+
function DecompressBuffer(buffer, d) {
|
|
230
|
+
return new Promise((resolve, reject) => {
|
|
231
|
+
const w = new buffer_writable_1.default({});
|
|
232
|
+
d.once('close', () => {
|
|
233
|
+
setImmediate(() => {
|
|
234
|
+
resolve(w.getBuffer() || Buffer.alloc(0));
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
(0, promises_2.pipeline)(node_stream_1.Readable.from(buffer), d, w)
|
|
238
|
+
.then(() => {
|
|
239
|
+
d.destroy();
|
|
240
|
+
})
|
|
241
|
+
.catch((err) => {
|
|
242
|
+
reject(err);
|
|
243
|
+
d.destroy();
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
// Standalone Functions
|
|
248
|
+
function compress(compLevel, opts = {}) {
|
|
249
|
+
return CreateCompressStream(compLevel, opts);
|
|
250
|
+
}
|
|
251
|
+
async function compressBuffer(buffer, compLevel, opts = {}) {
|
|
252
|
+
const c = await CreateCompressStream(compLevel, opts);
|
|
253
|
+
return CompressBuffer(buffer, c);
|
|
254
|
+
}
|
|
255
|
+
function decompress(opts = {}) {
|
|
256
|
+
return CreateDecompressStream(opts);
|
|
257
|
+
}
|
|
258
|
+
async function decompressBuffer(buffer, opts = {}) {
|
|
259
|
+
const d = await CreateDecompressStream(opts);
|
|
260
|
+
return DecompressBuffer(buffer, d);
|
|
261
|
+
}
|
|
262
|
+
// SimpleZSTD Class
|
|
263
|
+
class SimpleZSTD {
|
|
264
|
+
constructor(poolOptions) {
|
|
265
|
+
_SimpleZSTD_compressQueue.set(this, void 0);
|
|
266
|
+
_SimpleZSTD_decompressQueue.set(this, void 0);
|
|
267
|
+
_SimpleZSTD_compressDictCleanup.set(this, () => null);
|
|
268
|
+
_SimpleZSTD_decompressDictCleanup.set(this, () => null);
|
|
269
|
+
_SimpleZSTD_ready.set(this, void 0);
|
|
270
|
+
_SimpleZSTD_poolOptions.set(this, void 0);
|
|
271
|
+
debug('constructor', poolOptions);
|
|
272
|
+
__classPrivateFieldSet(this, _SimpleZSTD_poolOptions, poolOptions, "f");
|
|
273
|
+
__classPrivateFieldSet(this, _SimpleZSTD_compressDictCleanup, () => null, "f");
|
|
274
|
+
__classPrivateFieldSet(this, _SimpleZSTD_decompressDictCleanup, () => null, "f");
|
|
275
|
+
__classPrivateFieldSet(this, _SimpleZSTD_ready, new Promise((resolve, reject) => {
|
|
276
|
+
(async () => {
|
|
277
|
+
try {
|
|
278
|
+
// Handle compress queue dictionary
|
|
279
|
+
let compressDictPath = undefined;
|
|
280
|
+
const compressDict = poolOptions?.compressQueue?.dictionary;
|
|
281
|
+
if (compressDict && 'path' in compressDict) {
|
|
282
|
+
compressDictPath = compressDict.path;
|
|
283
|
+
}
|
|
284
|
+
else if (compressDict && Buffer.isBuffer(compressDict)) {
|
|
285
|
+
const { path, cleanup } = await (0, tmp_promise_1.file)({ prefix: 'zstd-dict-' });
|
|
286
|
+
__classPrivateFieldSet(this, _SimpleZSTD_compressDictCleanup, cleanup, "f");
|
|
287
|
+
await (0, promises_1.writeFile)(path, compressDict);
|
|
288
|
+
compressDictPath = path;
|
|
289
|
+
}
|
|
290
|
+
// Handle decompress queue dictionary
|
|
291
|
+
let decompressDictPath = undefined;
|
|
292
|
+
const decompressDict = poolOptions?.decompressQueue?.dictionary;
|
|
293
|
+
if (decompressDict && 'path' in decompressDict) {
|
|
294
|
+
decompressDictPath = decompressDict.path;
|
|
295
|
+
}
|
|
296
|
+
else if (decompressDict && Buffer.isBuffer(decompressDict)) {
|
|
297
|
+
const { path, cleanup } = await (0, tmp_promise_1.file)({ prefix: 'zstd-dict-' });
|
|
298
|
+
__classPrivateFieldSet(this, _SimpleZSTD_decompressDictCleanup, cleanup, "f");
|
|
299
|
+
await (0, promises_1.writeFile)(path, decompressDict);
|
|
300
|
+
decompressDictPath = path;
|
|
301
|
+
}
|
|
302
|
+
__classPrivateFieldSet(this, _SimpleZSTD_compressQueue, new process_queue_1.default(poolOptions?.compressQueueSize || 0, () => {
|
|
303
|
+
debug('compress factory');
|
|
304
|
+
return CreateCompressStream(poolOptions?.compressQueue?.compLevel || 3, {
|
|
305
|
+
...poolOptions?.compressQueue,
|
|
306
|
+
dictionary: compressDictPath ? { path: compressDictPath } : undefined,
|
|
307
|
+
});
|
|
308
|
+
}, async (p) => {
|
|
309
|
+
debug('compress cleanup');
|
|
310
|
+
const stream = await p;
|
|
311
|
+
await new Promise((resolve) => {
|
|
312
|
+
if (stream.destroyed) {
|
|
313
|
+
resolve();
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
stream.once('close', () => resolve());
|
|
317
|
+
stream.destroy();
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
}), "f");
|
|
321
|
+
__classPrivateFieldSet(this, _SimpleZSTD_decompressQueue, new process_queue_1.default(poolOptions?.decompressQueueSize || 0, () => {
|
|
322
|
+
debug('decompress factory');
|
|
323
|
+
return CreateDecompressStream({
|
|
324
|
+
...poolOptions?.decompressQueue,
|
|
325
|
+
dictionary: decompressDictPath ? { path: decompressDictPath } : undefined,
|
|
326
|
+
});
|
|
327
|
+
}, async (p) => {
|
|
328
|
+
debug('decompress cleanup');
|
|
329
|
+
const stream = await p;
|
|
330
|
+
await new Promise((resolve) => {
|
|
331
|
+
if (stream.destroyed) {
|
|
332
|
+
resolve();
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
stream.once('close', () => resolve());
|
|
336
|
+
stream.destroy();
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
}), "f");
|
|
340
|
+
debug('READY');
|
|
341
|
+
resolve(null);
|
|
342
|
+
}
|
|
343
|
+
catch (err) {
|
|
344
|
+
reject(err);
|
|
345
|
+
}
|
|
346
|
+
})();
|
|
347
|
+
}).catch((err) => {
|
|
348
|
+
debug('ready error', err);
|
|
349
|
+
__classPrivateFieldGet(this, _SimpleZSTD_compressDictCleanup, "f").call(this);
|
|
350
|
+
__classPrivateFieldGet(this, _SimpleZSTD_decompressDictCleanup, "f").call(this);
|
|
351
|
+
__classPrivateFieldSet(this, _SimpleZSTD_compressDictCleanup, () => null, "f");
|
|
352
|
+
__classPrivateFieldSet(this, _SimpleZSTD_decompressDictCleanup, () => null, "f");
|
|
353
|
+
}), "f");
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Create a new SimpleZSTD instance with process pooling
|
|
357
|
+
* @param poolOptions - Configuration for compression and decompression process pools
|
|
358
|
+
* @returns Promise resolving to initialized SimpleZSTD instance
|
|
359
|
+
*/
|
|
360
|
+
static async create(poolOptions) {
|
|
361
|
+
const instance = new SimpleZSTD(poolOptions);
|
|
362
|
+
await __classPrivateFieldGet(instance, _SimpleZSTD_ready, "f");
|
|
363
|
+
return instance;
|
|
364
|
+
}
|
|
365
|
+
get queueStats() {
|
|
366
|
+
return {
|
|
367
|
+
compress: {
|
|
368
|
+
hits: __classPrivateFieldGet(this, _SimpleZSTD_compressQueue, "f").hits,
|
|
369
|
+
misses: __classPrivateFieldGet(this, _SimpleZSTD_compressQueue, "f").misses,
|
|
370
|
+
},
|
|
371
|
+
decompress: {
|
|
372
|
+
hits: __classPrivateFieldGet(this, _SimpleZSTD_decompressQueue, "f").hits,
|
|
373
|
+
misses: __classPrivateFieldGet(this, _SimpleZSTD_decompressQueue, "f").misses,
|
|
374
|
+
},
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
async destroy() {
|
|
378
|
+
await Promise.all([__classPrivateFieldGet(this, _SimpleZSTD_compressQueue, "f").destroy(), __classPrivateFieldGet(this, _SimpleZSTD_decompressQueue, "f").destroy()]);
|
|
379
|
+
__classPrivateFieldGet(this, _SimpleZSTD_compressDictCleanup, "f").call(this);
|
|
380
|
+
__classPrivateFieldGet(this, _SimpleZSTD_decompressDictCleanup, "f").call(this);
|
|
381
|
+
__classPrivateFieldSet(this, _SimpleZSTD_compressDictCleanup, () => null, "f");
|
|
382
|
+
__classPrivateFieldSet(this, _SimpleZSTD_decompressDictCleanup, () => null, "f");
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Get a compression stream from the pool, or create a one-off stream with custom compression level
|
|
386
|
+
* @param compLevel - Optional compression level (1-22). If provided, creates a new stream instead of using the pool
|
|
387
|
+
* @returns Promise resolving to a Duplex compression stream
|
|
388
|
+
*/
|
|
389
|
+
async compress(compLevel) {
|
|
390
|
+
await __classPrivateFieldGet(this, _SimpleZSTD_ready, "f");
|
|
391
|
+
// If custom compression level is provided, create a one-off stream
|
|
392
|
+
if (compLevel !== undefined) {
|
|
393
|
+
return CreateCompressStream(compLevel, {
|
|
394
|
+
...__classPrivateFieldGet(this, _SimpleZSTD_poolOptions, "f")?.compressQueue,
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
// Otherwise, acquire from pool
|
|
398
|
+
return __classPrivateFieldGet(this, _SimpleZSTD_compressQueue, "f").acquire();
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Compress a buffer using the pool, or with a custom compression level
|
|
402
|
+
* @param buffer - Buffer to compress
|
|
403
|
+
* @param compLevel - Optional compression level (1-22). If provided, uses this level instead of pool default
|
|
404
|
+
* @returns Promise resolving to compressed buffer
|
|
405
|
+
*/
|
|
406
|
+
async compressBuffer(buffer, compLevel) {
|
|
407
|
+
await __classPrivateFieldGet(this, _SimpleZSTD_ready, "f");
|
|
408
|
+
const c = await this.compress(compLevel);
|
|
409
|
+
return CompressBuffer(buffer, c);
|
|
410
|
+
}
|
|
411
|
+
async decompress() {
|
|
412
|
+
await __classPrivateFieldGet(this, _SimpleZSTD_ready, "f");
|
|
413
|
+
return __classPrivateFieldGet(this, _SimpleZSTD_decompressQueue, "f").acquire();
|
|
414
|
+
}
|
|
415
|
+
async decompressBuffer(buffer) {
|
|
416
|
+
await __classPrivateFieldGet(this, _SimpleZSTD_ready, "f");
|
|
417
|
+
const d = await __classPrivateFieldGet(this, _SimpleZSTD_decompressQueue, "f").acquire();
|
|
418
|
+
return DecompressBuffer(buffer, d);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
exports.SimpleZSTD = SimpleZSTD;
|
|
422
|
+
_SimpleZSTD_compressQueue = new WeakMap(), _SimpleZSTD_decompressQueue = new WeakMap(), _SimpleZSTD_compressDictCleanup = new WeakMap(), _SimpleZSTD_decompressDictCleanup = new WeakMap(), _SimpleZSTD_ready = new WeakMap(), _SimpleZSTD_poolOptions = new WeakMap();
|
|
423
|
+
// module.exports = {
|
|
424
|
+
// SimpleZSTD,
|
|
425
|
+
// compress,
|
|
426
|
+
// compressBuffer,
|
|
427
|
+
// decompress,
|
|
428
|
+
// decompressBuffer,
|
|
429
|
+
// };
|
|
430
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUZBLG9EQVlDO0FBMEtELDRCQUVDO0FBRUQsd0NBT0M7QUFFRCxnQ0FFQztBQUVELDRDQUdDO0FBN1JELHNEQUF5QjtBQUN6QiwrQ0FBNkM7QUFDN0MsNkNBQXlDO0FBQ3pDLDZDQUE0RDtBQUM1RCxtREFBZ0Q7QUFDaEQsMkRBQThDO0FBRTlDLG9EQUEyQjtBQUMzQiw2Q0FBbUM7QUFDbkMsa0RBQTBCO0FBRTFCLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBSyxFQUFDLFlBQVksQ0FBQyxDQUFDO0FBRWxDLG9FQUEyQztBQUMzQyx3RUFBK0M7QUFDL0Msc0VBQTZDO0FBQzdDLHNFQUErQztBQU0vQyxpRkFBaUY7QUFDakYsdUVBQXVFO0FBQ3ZFLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxFQUFtRSxDQUFDO0FBRW5HLFNBQVMsVUFBVSxDQUFDLE1BQWM7SUFDaEMsT0FBTyxJQUFBLHdCQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsS0FBSyxVQUFVLHVCQUF1QixDQUNwQyxVQUFrQjtJQUVsQixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFcEMsSUFBSSxNQUFNLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xCLEtBQUssQ0FBQyx5QkFBeUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQixNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNyRixPQUFPO1lB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
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Duplex } from 'node:stream';
|
|
2
|
+
import type { DuplexOptions } from 'node:stream';
|
|
3
|
+
type SwapCallback = (err: Error | null, stream: Duplex | null) => void;
|
|
4
|
+
type PeekCallback = (data: Buffer, swap: SwapCallback) => void;
|
|
5
|
+
interface PeekOptions extends DuplexOptions {
|
|
6
|
+
maxBuffer?: number;
|
|
7
|
+
}
|
|
8
|
+
export default class PeekPassThrough extends Duplex {
|
|
9
|
+
#private;
|
|
10
|
+
constructor(options: PeekOptions, peekCallback: PeekCallback);
|
|
11
|
+
_write(chunk: Buffer, encoding: BufferEncoding, callback: (error?: Error | null) => void): void;
|
|
12
|
+
_final(callback: (error?: Error | null) => void): void;
|
|
13
|
+
_read(_size: number): void;
|
|
14
|
+
_destroy(error: Error | null, callback: (error: Error | null) => void): void;
|
|
15
|
+
}
|
|
16
|
+
export {};
|