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,145 @@
|
|
|
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 _PeekPassThrough_instances, _PeekPassThrough_maxBuffer, _PeekPassThrough_buffer, _PeekPassThrough_bufferedLength, _PeekPassThrough_peeked, _PeekPassThrough_peekCallback, _PeekPassThrough_swappedStream, _PeekPassThrough_ended, _PeekPassThrough_performPeek;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const node_stream_1 = require("node:stream");
|
|
16
|
+
class PeekPassThrough extends node_stream_1.Duplex {
|
|
17
|
+
constructor(options, peekCallback) {
|
|
18
|
+
super(options);
|
|
19
|
+
_PeekPassThrough_instances.add(this);
|
|
20
|
+
_PeekPassThrough_maxBuffer.set(this, void 0);
|
|
21
|
+
_PeekPassThrough_buffer.set(this, void 0);
|
|
22
|
+
_PeekPassThrough_bufferedLength.set(this, void 0);
|
|
23
|
+
_PeekPassThrough_peeked.set(this, void 0);
|
|
24
|
+
_PeekPassThrough_peekCallback.set(this, void 0);
|
|
25
|
+
_PeekPassThrough_swappedStream.set(this, void 0);
|
|
26
|
+
_PeekPassThrough_ended.set(this, void 0);
|
|
27
|
+
__classPrivateFieldSet(this, _PeekPassThrough_maxBuffer, options.maxBuffer || 65536, "f");
|
|
28
|
+
__classPrivateFieldSet(this, _PeekPassThrough_buffer, [], "f");
|
|
29
|
+
__classPrivateFieldSet(this, _PeekPassThrough_bufferedLength, 0, "f");
|
|
30
|
+
__classPrivateFieldSet(this, _PeekPassThrough_peeked, false, "f");
|
|
31
|
+
__classPrivateFieldSet(this, _PeekPassThrough_peekCallback, peekCallback, "f");
|
|
32
|
+
__classPrivateFieldSet(this, _PeekPassThrough_swappedStream, null, "f");
|
|
33
|
+
__classPrivateFieldSet(this, _PeekPassThrough_ended, false, "f");
|
|
34
|
+
}
|
|
35
|
+
_write(chunk, encoding, callback) {
|
|
36
|
+
// If we already peeked and have a swapped stream, write to it
|
|
37
|
+
if (__classPrivateFieldGet(this, _PeekPassThrough_peeked, "f") && __classPrivateFieldGet(this, _PeekPassThrough_swappedStream, "f")) {
|
|
38
|
+
__classPrivateFieldGet(this, _PeekPassThrough_swappedStream, "f").write(chunk, encoding, callback);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// If we already peeked but no swap, just pass through
|
|
42
|
+
if (__classPrivateFieldGet(this, _PeekPassThrough_peeked, "f")) {
|
|
43
|
+
this.push(chunk);
|
|
44
|
+
callback();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// Buffer chunks until we have enough to peek
|
|
48
|
+
__classPrivateFieldGet(this, _PeekPassThrough_buffer, "f").push(chunk);
|
|
49
|
+
__classPrivateFieldSet(this, _PeekPassThrough_bufferedLength, __classPrivateFieldGet(this, _PeekPassThrough_bufferedLength, "f") + chunk.length, "f");
|
|
50
|
+
if (__classPrivateFieldGet(this, _PeekPassThrough_bufferedLength, "f") >= __classPrivateFieldGet(this, _PeekPassThrough_maxBuffer, "f")) {
|
|
51
|
+
__classPrivateFieldGet(this, _PeekPassThrough_instances, "m", _PeekPassThrough_performPeek).call(this, callback);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
callback();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
_final(callback) {
|
|
58
|
+
// If we haven't peeked yet and stream is ending, peek now
|
|
59
|
+
if (!__classPrivateFieldGet(this, _PeekPassThrough_peeked, "f")) {
|
|
60
|
+
__classPrivateFieldGet(this, _PeekPassThrough_instances, "m", _PeekPassThrough_performPeek).call(this, callback);
|
|
61
|
+
}
|
|
62
|
+
else if (__classPrivateFieldGet(this, _PeekPassThrough_swappedStream, "f")) {
|
|
63
|
+
// End the swapped stream
|
|
64
|
+
__classPrivateFieldGet(this, _PeekPassThrough_swappedStream, "f").end(callback);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// No swap - signal EOF for passthrough case
|
|
68
|
+
if (!__classPrivateFieldGet(this, _PeekPassThrough_ended, "f")) {
|
|
69
|
+
__classPrivateFieldSet(this, _PeekPassThrough_ended, true, "f");
|
|
70
|
+
this.push(null);
|
|
71
|
+
}
|
|
72
|
+
callback();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
_read(_size) {
|
|
76
|
+
// If we have a swapped stream, resume it if paused
|
|
77
|
+
if (__classPrivateFieldGet(this, _PeekPassThrough_swappedStream, "f")) {
|
|
78
|
+
if (__classPrivateFieldGet(this, _PeekPassThrough_swappedStream, "f").isPaused && __classPrivateFieldGet(this, _PeekPassThrough_swappedStream, "f").isPaused()) {
|
|
79
|
+
__classPrivateFieldGet(this, _PeekPassThrough_swappedStream, "f").resume();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
_destroy(error, callback) {
|
|
84
|
+
if (__classPrivateFieldGet(this, _PeekPassThrough_swappedStream, "f") && !__classPrivateFieldGet(this, _PeekPassThrough_swappedStream, "f").destroyed) {
|
|
85
|
+
__classPrivateFieldGet(this, _PeekPassThrough_swappedStream, "f").destroy();
|
|
86
|
+
}
|
|
87
|
+
callback(error);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
_PeekPassThrough_maxBuffer = new WeakMap(), _PeekPassThrough_buffer = new WeakMap(), _PeekPassThrough_bufferedLength = new WeakMap(), _PeekPassThrough_peeked = new WeakMap(), _PeekPassThrough_peekCallback = new WeakMap(), _PeekPassThrough_swappedStream = new WeakMap(), _PeekPassThrough_ended = new WeakMap(), _PeekPassThrough_instances = new WeakSet(), _PeekPassThrough_performPeek = function _PeekPassThrough_performPeek(callback) {
|
|
91
|
+
__classPrivateFieldSet(this, _PeekPassThrough_peeked, true, "f");
|
|
92
|
+
const peekData = Buffer.concat(__classPrivateFieldGet(this, _PeekPassThrough_buffer, "f"));
|
|
93
|
+
// Call the peek callback to determine which stream to use
|
|
94
|
+
__classPrivateFieldGet(this, _PeekPassThrough_peekCallback, "f").call(this, peekData, (err, swappedStream) => {
|
|
95
|
+
if (err) {
|
|
96
|
+
callback(err);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (swappedStream) {
|
|
100
|
+
// We have a swapped stream
|
|
101
|
+
__classPrivateFieldSet(this, _PeekPassThrough_swappedStream, swappedStream, "f");
|
|
102
|
+
// Pipe swapped stream's output to our output
|
|
103
|
+
swappedStream.on('data', (chunk) => {
|
|
104
|
+
if (!this.push(chunk)) {
|
|
105
|
+
swappedStream.pause();
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
swappedStream.on('end', () => {
|
|
109
|
+
if (!__classPrivateFieldGet(this, _PeekPassThrough_ended, "f")) {
|
|
110
|
+
__classPrivateFieldSet(this, _PeekPassThrough_ended, true, "f");
|
|
111
|
+
this.push(null);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
swappedStream.on('error', (streamErr) => {
|
|
115
|
+
this.destroy(streamErr);
|
|
116
|
+
});
|
|
117
|
+
// Resume reading when downstream is ready
|
|
118
|
+
this.on('drain', () => {
|
|
119
|
+
if (swappedStream.isPaused && swappedStream.isPaused()) {
|
|
120
|
+
swappedStream.resume();
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
// Write all buffered data to the swapped stream
|
|
124
|
+
for (const bufferedChunk of __classPrivateFieldGet(this, _PeekPassThrough_buffer, "f")) {
|
|
125
|
+
swappedStream.write(bufferedChunk);
|
|
126
|
+
}
|
|
127
|
+
// Ensure the swapped stream is in flowing mode
|
|
128
|
+
if (swappedStream.isPaused && swappedStream.isPaused()) {
|
|
129
|
+
swappedStream.resume();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// No swap - just push buffered data through
|
|
134
|
+
for (const bufferedChunk of __classPrivateFieldGet(this, _PeekPassThrough_buffer, "f")) {
|
|
135
|
+
this.push(bufferedChunk);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Clear the buffer
|
|
139
|
+
__classPrivateFieldSet(this, _PeekPassThrough_buffer, [], "f");
|
|
140
|
+
__classPrivateFieldSet(this, _PeekPassThrough_bufferedLength, 0, "f");
|
|
141
|
+
callback();
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
exports.default = PeekPassThrough;
|
|
145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlay10cmFuc2Zvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVlay10cmFuc2Zvcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBcUM7QUFVckMsTUFBcUIsZUFBZ0IsU0FBUSxvQkFBTTtJQVNqRCxZQUFZLE9BQW9CLEVBQUUsWUFBMEI7UUFDMUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDOztRQVRqQiw2Q0FBbUI7UUFDbkIsMENBQWtCO1FBQ2xCLGtEQUF3QjtRQUN4QiwwQ0FBaUI7UUFDakIsZ0RBQTRCO1FBQzVCLGlEQUE4QjtRQUM5Qix5Q0FBZ0I7UUFJZCx1QkFBQSxJQUFJLDhCQUFjLE9BQU8sQ0FBQyxTQUFTLElBQUksS0FBSyxNQUFBLENBQUM7UUFDN0MsdUJBQUEsSUFBSSwyQkFBVyxFQUFFLE1BQUEsQ0FBQztRQUNsQix1QkFBQSxJQUFJLG1DQUFtQixDQUFDLE1BQUEsQ0FBQztRQUN6Qix1QkFBQSxJQUFJLDJCQUFXLEtBQUssTUFBQSxDQUFDO1FBQ3JCLHVCQUFBLElBQUksaUNBQWlCLFlBQVksTUFBQSxDQUFDO1FBQ2xDLHVCQUFBLElBQUksa0NBQWtCLElBQUksTUFBQSxDQUFDO1FBQzNCLHVCQUFBLElBQUksMEJBQVUsS0FBSyxNQUFBLENBQUM7SUFDdEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFhLEVBQUUsUUFBd0IsRUFBRSxRQUF3QztRQUN0Riw4REFBOEQ7UUFDOUQsSUFBSSx1QkFBQSxJQUFJLCtCQUFRLElBQUksdUJBQUEsSUFBSSxzQ0FBZSxFQUFFLENBQUM7WUFDeEMsdUJBQUEsSUFBSSxzQ0FBZSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3JELE9BQU87UUFDVCxDQUFDO1FBRUQsc0RBQXNEO1FBQ3RELElBQUksdUJBQUEsSUFBSSwrQkFBUSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFD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
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Duplex } from 'node:stream';
|
|
2
|
+
import { SpawnOptions } from 'node:child_process';
|
|
3
|
+
import type { DuplexOptions } from 'node:stream';
|
|
4
|
+
export default class ProcessDuplex extends Duplex {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(command: string, args: string[], spawnOptions?: SpawnOptions, streamOptions?: DuplexOptions);
|
|
7
|
+
_read(_size: number): void;
|
|
8
|
+
_write(chunk: Buffer, encoding: BufferEncoding, callback: (error?: Error | null) => void): void;
|
|
9
|
+
_final(callback: (error?: Error | null) => void): void;
|
|
10
|
+
_destroy(error: Error | null, callback: (error: Error | null) => void): void;
|
|
11
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
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 _ProcessDuplex_process, _ProcessDuplex_stdoutDataHandler, _ProcessDuplex_stdoutEndHandler, _ProcessDuplex_stdoutErrorHandler, _ProcessDuplex_stdoutCloseHandler, _ProcessDuplex_stderrDataHandler, _ProcessDuplex_processExitHandler, _ProcessDuplex_processErrorHandler;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const node_stream_1 = require("node:stream");
|
|
16
|
+
const node_child_process_1 = require("node:child_process");
|
|
17
|
+
class ProcessDuplex extends node_stream_1.Duplex {
|
|
18
|
+
constructor(command, args, spawnOptions, streamOptions) {
|
|
19
|
+
super(streamOptions);
|
|
20
|
+
_ProcessDuplex_process.set(this, void 0);
|
|
21
|
+
_ProcessDuplex_stdoutDataHandler.set(this, void 0);
|
|
22
|
+
_ProcessDuplex_stdoutEndHandler.set(this, void 0);
|
|
23
|
+
_ProcessDuplex_stdoutErrorHandler.set(this, void 0);
|
|
24
|
+
_ProcessDuplex_stdoutCloseHandler.set(this, void 0);
|
|
25
|
+
_ProcessDuplex_stderrDataHandler.set(this, void 0);
|
|
26
|
+
_ProcessDuplex_processExitHandler.set(this, void 0);
|
|
27
|
+
_ProcessDuplex_processErrorHandler.set(this, void 0);
|
|
28
|
+
// Spawn the child process
|
|
29
|
+
__classPrivateFieldSet(this, _ProcessDuplex_process, (0, node_child_process_1.spawn)(command, args, spawnOptions || {}), "f");
|
|
30
|
+
// Forward stdout to the readable side of this duplex
|
|
31
|
+
if (__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdout) {
|
|
32
|
+
__classPrivateFieldSet(this, _ProcessDuplex_stdoutDataHandler, (chunk) => {
|
|
33
|
+
const canPushMore = this.push(chunk);
|
|
34
|
+
if (!canPushMore) {
|
|
35
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdout?.pause();
|
|
36
|
+
}
|
|
37
|
+
}, "f");
|
|
38
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdout.on('data', __classPrivateFieldGet(this, _ProcessDuplex_stdoutDataHandler, "f"));
|
|
39
|
+
__classPrivateFieldSet(this, _ProcessDuplex_stdoutEndHandler, () => {
|
|
40
|
+
// Signal end of readable side
|
|
41
|
+
this.push(null);
|
|
42
|
+
}, "f");
|
|
43
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdout.on('end', __classPrivateFieldGet(this, _ProcessDuplex_stdoutEndHandler, "f"));
|
|
44
|
+
__classPrivateFieldSet(this, _ProcessDuplex_stdoutErrorHandler, (err) => {
|
|
45
|
+
this.destroy(err);
|
|
46
|
+
}, "f");
|
|
47
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdout.on('error', __classPrivateFieldGet(this, _ProcessDuplex_stdoutErrorHandler, "f"));
|
|
48
|
+
__classPrivateFieldSet(this, _ProcessDuplex_stdoutCloseHandler, () => {
|
|
49
|
+
// Ensure we signal end if not already done
|
|
50
|
+
this.push(null);
|
|
51
|
+
}, "f");
|
|
52
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdout.on('close', __classPrivateFieldGet(this, _ProcessDuplex_stdoutCloseHandler, "f"));
|
|
53
|
+
}
|
|
54
|
+
// Forward stderr errors
|
|
55
|
+
if (__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stderr) {
|
|
56
|
+
__classPrivateFieldSet(this, _ProcessDuplex_stderrDataHandler, (chunk) => {
|
|
57
|
+
// Emit stderr as a warning or error event
|
|
58
|
+
this.emit('stderr', chunk.toString());
|
|
59
|
+
}, "f");
|
|
60
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stderr.on('data', __classPrivateFieldGet(this, _ProcessDuplex_stderrDataHandler, "f"));
|
|
61
|
+
}
|
|
62
|
+
// Handle process exit
|
|
63
|
+
__classPrivateFieldSet(this, _ProcessDuplex_processExitHandler, (code, signal) => {
|
|
64
|
+
this.emit('exit', code, signal);
|
|
65
|
+
}, "f");
|
|
66
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").on('exit', __classPrivateFieldGet(this, _ProcessDuplex_processExitHandler, "f"));
|
|
67
|
+
// Handle process errors
|
|
68
|
+
__classPrivateFieldSet(this, _ProcessDuplex_processErrorHandler, (err) => {
|
|
69
|
+
this.destroy(err);
|
|
70
|
+
}, "f");
|
|
71
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").on('error', __classPrivateFieldGet(this, _ProcessDuplex_processErrorHandler, "f"));
|
|
72
|
+
}
|
|
73
|
+
_read(_size) {
|
|
74
|
+
// Resume stdout if it was paused
|
|
75
|
+
if (__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdout && __classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdout.isPaused()) {
|
|
76
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdout.resume();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
_write(chunk, encoding, callback) {
|
|
80
|
+
// Write to the process stdin
|
|
81
|
+
if (__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdin) {
|
|
82
|
+
if (!__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdin.write(chunk, encoding)) {
|
|
83
|
+
// If the write buffer is full, wait for drain
|
|
84
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdin.once('drain', callback);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
callback();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
callback(new Error('Process stdin is not available'));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
_final(callback) {
|
|
95
|
+
// Close stdin when the writable side is finished
|
|
96
|
+
if (__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdin) {
|
|
97
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdin.end(callback);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
callback();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
_destroy(error, callback) {
|
|
104
|
+
// Remove all event listeners to prevent memory leaks
|
|
105
|
+
if (__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdout) {
|
|
106
|
+
if (__classPrivateFieldGet(this, _ProcessDuplex_stdoutDataHandler, "f"))
|
|
107
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdout.removeListener('data', __classPrivateFieldGet(this, _ProcessDuplex_stdoutDataHandler, "f"));
|
|
108
|
+
if (__classPrivateFieldGet(this, _ProcessDuplex_stdoutEndHandler, "f"))
|
|
109
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdout.removeListener('end', __classPrivateFieldGet(this, _ProcessDuplex_stdoutEndHandler, "f"));
|
|
110
|
+
if (__classPrivateFieldGet(this, _ProcessDuplex_stdoutErrorHandler, "f"))
|
|
111
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdout.removeListener('error', __classPrivateFieldGet(this, _ProcessDuplex_stdoutErrorHandler, "f"));
|
|
112
|
+
if (__classPrivateFieldGet(this, _ProcessDuplex_stdoutCloseHandler, "f"))
|
|
113
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdout.removeListener('close', __classPrivateFieldGet(this, _ProcessDuplex_stdoutCloseHandler, "f"));
|
|
114
|
+
}
|
|
115
|
+
if (__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stderr && __classPrivateFieldGet(this, _ProcessDuplex_stderrDataHandler, "f")) {
|
|
116
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stderr.removeListener('data', __classPrivateFieldGet(this, _ProcessDuplex_stderrDataHandler, "f"));
|
|
117
|
+
}
|
|
118
|
+
if (__classPrivateFieldGet(this, _ProcessDuplex_processExitHandler, "f")) {
|
|
119
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").removeListener('exit', __classPrivateFieldGet(this, _ProcessDuplex_processExitHandler, "f"));
|
|
120
|
+
}
|
|
121
|
+
if (__classPrivateFieldGet(this, _ProcessDuplex_processErrorHandler, "f")) {
|
|
122
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").removeListener('error', __classPrivateFieldGet(this, _ProcessDuplex_processErrorHandler, "f"));
|
|
123
|
+
}
|
|
124
|
+
// Kill the child process and wait for it to exit
|
|
125
|
+
if (__classPrivateFieldGet(this, _ProcessDuplex_process, "f") && !__classPrivateFieldGet(this, _ProcessDuplex_process, "f").killed) {
|
|
126
|
+
// Close stdin first so the process receives EOF and can exit cleanly
|
|
127
|
+
if (__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdin && !__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdin.destroyed) {
|
|
128
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").stdin.end();
|
|
129
|
+
}
|
|
130
|
+
// Wait for the process to fully exit before calling callback
|
|
131
|
+
const onClose = () => {
|
|
132
|
+
clearTimeout(forceKillTimeout);
|
|
133
|
+
callback(error);
|
|
134
|
+
};
|
|
135
|
+
// Set up close listener
|
|
136
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").once('close', onClose);
|
|
137
|
+
// Kill the process (should exit quickly now that stdin is closed)
|
|
138
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").kill();
|
|
139
|
+
// Force kill if process doesn't exit within 1 second
|
|
140
|
+
const forceKillTimeout = setTimeout(() => {
|
|
141
|
+
if (!__classPrivateFieldGet(this, _ProcessDuplex_process, "f").killed) {
|
|
142
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").kill('SIGKILL');
|
|
143
|
+
}
|
|
144
|
+
// Remove the close listener and call callback
|
|
145
|
+
__classPrivateFieldGet(this, _ProcessDuplex_process, "f").removeListener('close', onClose);
|
|
146
|
+
callback(error);
|
|
147
|
+
}, 1000);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
// Process already killed or doesn't exist
|
|
151
|
+
callback(error);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
_ProcessDuplex_process = new WeakMap(), _ProcessDuplex_stdoutDataHandler = new WeakMap(), _ProcessDuplex_stdoutEndHandler = new WeakMap(), _ProcessDuplex_stdoutErrorHandler = new WeakMap(), _ProcessDuplex_stdoutCloseHandler = new WeakMap(), _ProcessDuplex_stderrDataHandler = new WeakMap(), _ProcessDuplex_processExitHandler = new WeakMap(), _ProcessDuplex_processErrorHandler = new WeakMap();
|
|
156
|
+
exports.default = ProcessDuplex;
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1kdXBsZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvY2Vzcy1kdXBsZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBcUM7QUFDckMsMkRBQXVFO0FBR3ZFLE1BQXFCLGFBQWMsU0FBUSxvQkFBTTtJQVUvQyxZQUNFLE9BQWUsRUFDZixJQUFjLEVBQ2QsWUFBMkIsRUFDM0IsYUFBNkI7UUFFN0IsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBZnZCLHlDQUF1QjtRQUN2QixtREFBNkM7UUFDN0Msa0RBQStCO1FBQy9CLG9EQUEyQztRQUMzQyxvREFBaUM7UUFDakMsbURBQTZDO1FBQzdDLG9EQUFtRjtRQUNuRixxREFBNEM7UUFVMUMsMEJBQTBCO1FBQzFCLHVCQUFBLElBQUksMEJBQVksSUFBQSwwQkFBSyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxJQUFJLEVBQUUsQ0FBQyxNQUFBLENBQUM7UUFFekQscURBQXFEO1FBQ3JELElBQUksdUJBQUEsSUFBSSw4QkFBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLHVCQUFBLElBQUksb0NBQXNCLENBQUMsS0FBYSxFQUFFLEVBQUU7Z0JBQzFDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDakIsdUJBQUEsSUFBSSw4QkFBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztnQkFDaEMsQ0FBQztZQUNILENBQUMsTUFBQSxDQUFDO1lBQ0YsdUJBQUEsSUFBSSw4QkFBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLHVCQUFBLElBQUksd0NBQW1CLENBQUMsQ0FBQztZQUV6RCx1QkFBQSxJQUFJLG1DQUFxQixHQUFHLEVBQUU7Z0JBQzVCLDhCQUE4QjtnQkFDOUIsSUFBSSxD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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export default class ProcessQueue<QueueItem> {
|
|
2
|
+
#private;
|
|
3
|
+
constructor(targetSize: number, factory: () => Promise<QueueItem>, destroy: (process: Promise<QueueItem>) => void);
|
|
4
|
+
get hits(): number;
|
|
5
|
+
get misses(): number;
|
|
6
|
+
acquire(): Promise<QueueItem>;
|
|
7
|
+
destroy(): Promise<void>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// This is a generic class for creating a queue of worker processes.
|
|
3
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
4
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
5
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
6
|
+
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");
|
|
7
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
8
|
+
};
|
|
9
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
10
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
11
|
+
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");
|
|
12
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
13
|
+
};
|
|
14
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
16
|
+
};
|
|
17
|
+
var _ProcessQueue_instances, _ProcessQueue_targetSize, _ProcessQueue_queue, _ProcessQueue_factory, _ProcessQueue_destroy, _ProcessQueue_hitCount, _ProcessQueue_missCount, _ProcessQueue_destroyed, _ProcessQueue_createResource;
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
const debug_1 = __importDefault(require("debug"));
|
|
20
|
+
const debug = (0, debug_1.default)('SimpleZSTDQueue');
|
|
21
|
+
class ProcessQueue {
|
|
22
|
+
constructor(targetSize, factory, destroy) {
|
|
23
|
+
_ProcessQueue_instances.add(this);
|
|
24
|
+
_ProcessQueue_targetSize.set(this, void 0);
|
|
25
|
+
_ProcessQueue_queue.set(this, void 0);
|
|
26
|
+
_ProcessQueue_factory.set(this, void 0);
|
|
27
|
+
_ProcessQueue_destroy.set(this, void 0);
|
|
28
|
+
_ProcessQueue_hitCount.set(this, void 0);
|
|
29
|
+
_ProcessQueue_missCount.set(this, void 0);
|
|
30
|
+
_ProcessQueue_destroyed.set(this, void 0);
|
|
31
|
+
debug('constructor', targetSize);
|
|
32
|
+
__classPrivateFieldSet(this, _ProcessQueue_targetSize, targetSize, "f");
|
|
33
|
+
__classPrivateFieldSet(this, _ProcessQueue_queue, [], "f");
|
|
34
|
+
__classPrivateFieldSet(this, _ProcessQueue_factory, factory, "f");
|
|
35
|
+
__classPrivateFieldSet(this, _ProcessQueue_destroy, destroy, "f");
|
|
36
|
+
__classPrivateFieldSet(this, _ProcessQueue_hitCount, 0, "f");
|
|
37
|
+
__classPrivateFieldSet(this, _ProcessQueue_missCount, 0, "f");
|
|
38
|
+
__classPrivateFieldSet(this, _ProcessQueue_destroyed, false, "f");
|
|
39
|
+
for (let i = 0; i < targetSize || 0; i += 1) {
|
|
40
|
+
__classPrivateFieldGet(this, _ProcessQueue_instances, "m", _ProcessQueue_createResource).call(this);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
get hits() {
|
|
44
|
+
return __classPrivateFieldGet(this, _ProcessQueue_hitCount, "f");
|
|
45
|
+
}
|
|
46
|
+
get misses() {
|
|
47
|
+
return __classPrivateFieldGet(this, _ProcessQueue_missCount, "f");
|
|
48
|
+
}
|
|
49
|
+
async acquire() {
|
|
50
|
+
debug('acquire');
|
|
51
|
+
const attempt = __classPrivateFieldGet(this, _ProcessQueue_queue, "f").pop();
|
|
52
|
+
if (attempt) {
|
|
53
|
+
debug('acquire hit');
|
|
54
|
+
if (!__classPrivateFieldGet(this, _ProcessQueue_destroyed, "f")) {
|
|
55
|
+
setImmediate(() => {
|
|
56
|
+
// Double-check destroyed flag in case it changed
|
|
57
|
+
if (!__classPrivateFieldGet(this, _ProcessQueue_destroyed, "f")) {
|
|
58
|
+
__classPrivateFieldGet(this, _ProcessQueue_instances, "m", _ProcessQueue_createResource).call(this);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
__classPrivateFieldSet(this, _ProcessQueue_hitCount, __classPrivateFieldGet(this, _ProcessQueue_hitCount, "f") + 1, "f");
|
|
63
|
+
return attempt;
|
|
64
|
+
}
|
|
65
|
+
debug('acquire miss');
|
|
66
|
+
__classPrivateFieldSet(this, _ProcessQueue_missCount, __classPrivateFieldGet(this, _ProcessQueue_missCount, "f") + 1, "f");
|
|
67
|
+
return __classPrivateFieldGet(this, _ProcessQueue_factory, "f").call(this);
|
|
68
|
+
}
|
|
69
|
+
async destroy() {
|
|
70
|
+
debug('destroy', __classPrivateFieldGet(this, _ProcessQueue_queue, "f").length);
|
|
71
|
+
__classPrivateFieldSet(this, _ProcessQueue_destroyed, true, "f");
|
|
72
|
+
const destroyPromises = [];
|
|
73
|
+
while (__classPrivateFieldGet(this, _ProcessQueue_queue, "f").length > 0) {
|
|
74
|
+
const p = __classPrivateFieldGet(this, _ProcessQueue_queue, "f").pop();
|
|
75
|
+
if (p) {
|
|
76
|
+
destroyPromises.push(Promise.resolve(__classPrivateFieldGet(this, _ProcessQueue_destroy, "f").call(this, p)));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
await Promise.all(destroyPromises);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
_ProcessQueue_targetSize = new WeakMap(), _ProcessQueue_queue = new WeakMap(), _ProcessQueue_factory = new WeakMap(), _ProcessQueue_destroy = new WeakMap(), _ProcessQueue_hitCount = new WeakMap(), _ProcessQueue_missCount = new WeakMap(), _ProcessQueue_destroyed = new WeakMap(), _ProcessQueue_instances = new WeakSet(), _ProcessQueue_createResource = async function _ProcessQueue_createResource() {
|
|
83
|
+
debug('createResource?', __classPrivateFieldGet(this, _ProcessQueue_queue, "f").length);
|
|
84
|
+
if (__classPrivateFieldGet(this, _ProcessQueue_destroyed, "f")) {
|
|
85
|
+
debug('createResource skipped - queue destroyed');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (__classPrivateFieldGet(this, _ProcessQueue_queue, "f").length < __classPrivateFieldGet(this, _ProcessQueue_targetSize, "f")) {
|
|
89
|
+
debug('createResource call factory');
|
|
90
|
+
__classPrivateFieldGet(this, _ProcessQueue_queue, "f").push(__classPrivateFieldGet(this, _ProcessQueue_factory, "f").call(this));
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
exports.default = ProcessQueue;
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1xdWV1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9jZXNzLXF1ZXVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvRUFBb0U7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXBFLGtEQUEwQjtBQUUxQixNQUFNLEtBQUssR0FBRyxJQUFBLGVBQUssRUFBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBRXZDLE1BQXFCLFlBQVk7SUFlL0IsWUFDRSxVQUFrQixFQUNsQixPQUFpQyxFQUNqQyxPQUE4Qzs7UUFqQmhELDJDQUFZO1FBRVosc0NBQWtDO1FBRWxDLHdDQUFtQztRQUVuQyx3Q0FBZ0Q7UUFFaEQseUNBQVU7UUFFViwwQ0FBVztRQUVYLDBDQUFvQjtRQU9sQixLQUFLLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2pDLHVCQUFBLElBQUksNEJBQWUsVUFBVSxNQUFBLENBQUM7UUFDOUIsdUJBQUEsSUFBSSx1QkFBVSxFQUFFLE1BQUEsQ0FBQztRQUNqQix1QkFBQSxJQUFJLHlCQUFZLE9BQU8sTUFBQSxDQUFDO1FBQ3hCLHVCQUFBLElBQUkseUJBQVksT0FBTyxNQUFBLENBQUM7UUFFeEIsdUJBQUEsSUFBSSwwQkFBYSxDQUFDLE1BQUEsQ0FBQztRQUNuQix1QkFBQSxJQUFJLDJCQUFjLENBQUMsTUFBQSxDQUFDO1FBQ3BCLHVCQUFBLElBQUksMkJBQWMsS0FBSyxNQUFBLENBQUM7UUFFeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzVDLHVCQUFBLElBQUksNkRBQWdCLE1BQXBCLElBQUksQ0FBa0IsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sdUJBQUEsSUFBSSw4QkFBVSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLHVCQUFBLElBQUksK0JBQVcsQ0FBQztJQUN6QixDQUFDO0lBY0QsS0FBSyxDQUFDLE9BQU87UUFDWCxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakIsTUFBTSxPQUFPLEdBQUcsdUJBQUEsSUFBSSwyQkFBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRWxDLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLHVCQUFBLElBQUksK0JBQVcsRUFBRSxDQUFDO2dCQUNyQixZQUFZLENBQUMsR0FBRyxFQUFFO29CQUNoQixpREFBaUQ7b0JBQ2pELElBQUksQ0FBQyx1QkFBQSxJQUFJLCtCQUFXLEVBQUUsQ0FBQzt3QkFDckIsdUJBQUEsSUFBSSw2REFBZ0IsTUFBcEIsSUFBSSxDQUFrQixDQUFDO29CQUN6QixDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELGlIQUFrQixDQUFDLE1BQUEsQ0FBQztZQUNwQixPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBRUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RCLG1IQUFtQixDQUFDLE1BQUEsQ0FBQztRQUNyQixPQUFPLHVCQUFBLElBQUksNkJBQVMsTUFBYixJQUFJLENBQVcsQ0FBQztJQUN6QixDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU87UUFDWCxLQUFLLENBQUMsU0FBUyxFQUFFLHVCQUFBLElBQUksMkJBQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyx1QkFBQSxJQUFJLDJCQUFjLElBQUksTUFBQSxDQUFDO1FBQ3ZCLE1BQU0sZUFBZSxHQUFvQixFQUFFLENBQUM7UUFDNUMsT0FBTyx1QkFBQSxJQUFJLDJCQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxHQUFHLHVCQUFBLElBQUksMkJBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNOLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyx1QkFBQSxJQUFJLDZCQUFTLE1BQWIsSUFBSSxFQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNyQyxDQUFDO0NBQ0Y7K1ZBL0NDLEtBQUs7SUFDSCxLQUFLLENBQUMsaUJBQWlCLEVBQUUsdUJBQUEsSUFBSSwyQkFBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLElBQUksdUJBQUEsSUFBSSwrQkFBVyxFQUFFLENBQUM7UUFDcEIsS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDbEQsT0FBTztJQUNULENBQUM7SUFDRCxJQUFJLHVCQUFBLElBQUksMkJBQU8sQ0FBQyxNQUFNLEdBQUcsdUJBQUEsSUFBSSxnQ0FBWSxFQUFFLENBQUM7UUFDMUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDckMsdUJBQUEsSUFBSSwyQkFBTyxDQUFDLElBQUksQ0FBQyx1QkFBQSxJQUFJLDZCQUFTLE1BQWIsSUFBSSxDQUFXLENBQUMsQ0FBQztJQUNwQyxDQUFDO0FBQ0gsQ0FBQztrQkFyRGtCLFlBQVkifQ==
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { SpawnOptions } from 'child_process';
|
|
2
|
+
import { DuplexOptions } from 'stream';
|
|
3
|
+
export interface CompressOpts {
|
|
4
|
+
compLevel?: number;
|
|
5
|
+
dictionary?: Buffer | {
|
|
6
|
+
path: string;
|
|
7
|
+
};
|
|
8
|
+
zstdOptions?: Array<string>;
|
|
9
|
+
spawnOptions?: SpawnOptions;
|
|
10
|
+
streamOptions?: DuplexOptions;
|
|
11
|
+
}
|
|
12
|
+
export interface DecompressOpts {
|
|
13
|
+
dictionary?: Buffer | {
|
|
14
|
+
path: string;
|
|
15
|
+
};
|
|
16
|
+
zstdOptions?: Array<string>;
|
|
17
|
+
spawnOptions?: SpawnOptions;
|
|
18
|
+
streamOptions?: DuplexOptions;
|
|
19
|
+
}
|
|
20
|
+
export interface PoolOpts {
|
|
21
|
+
compressQueueSize?: number;
|
|
22
|
+
decompressQueueSize?: number;
|
|
23
|
+
compressQueue?: CompressOpts;
|
|
24
|
+
decompressQueue?: DecompressOpts;
|
|
25
|
+
}
|
|
26
|
+
export interface DictionaryObject {
|
|
27
|
+
path: string;
|
|
28
|
+
}
|
|
29
|
+
export interface ZSTDOpts {
|
|
30
|
+
spawnOptions?: object;
|
|
31
|
+
streamOptions?: DuplexOptions;
|
|
32
|
+
zstdOptions?: string[];
|
|
33
|
+
dictionary?: DictionaryObject | Buffer;
|
|
34
|
+
}
|
package/eslint.config.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import js from '@eslint/js';
|
|
2
|
+
import tsPlugin from '@typescript-eslint/eslint-plugin';
|
|
3
|
+
import tsParser from '@typescript-eslint/parser';
|
|
4
|
+
import globals from 'globals';
|
|
5
|
+
import prettierConfig from 'eslint-config-prettier';
|
|
6
|
+
|
|
7
|
+
export default [
|
|
8
|
+
js.configs.recommended,
|
|
9
|
+
{
|
|
10
|
+
files: ['**/*.ts'],
|
|
11
|
+
languageOptions: {
|
|
12
|
+
parser: tsParser,
|
|
13
|
+
parserOptions: {
|
|
14
|
+
ecmaVersion: 'latest',
|
|
15
|
+
sourceType: 'module',
|
|
16
|
+
},
|
|
17
|
+
globals: {
|
|
18
|
+
...globals.node,
|
|
19
|
+
...globals.es2020,
|
|
20
|
+
BufferEncoding: 'readonly',
|
|
21
|
+
NodeJS: 'readonly',
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
plugins: {
|
|
25
|
+
'@typescript-eslint': tsPlugin,
|
|
26
|
+
},
|
|
27
|
+
rules: {
|
|
28
|
+
...tsPlugin.configs.recommended.rules,
|
|
29
|
+
'max-len': 'off',
|
|
30
|
+
'no-underscore-dangle': 'off',
|
|
31
|
+
'@typescript-eslint/no-unused-vars': ['error', {
|
|
32
|
+
argsIgnorePattern: '^_',
|
|
33
|
+
varsIgnorePattern: '^_',
|
|
34
|
+
}],
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
files: ['**/*.js'],
|
|
39
|
+
languageOptions: {
|
|
40
|
+
globals: {
|
|
41
|
+
...globals.node,
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
ignores: ['node_modules', 'dist'],
|
|
47
|
+
},
|
|
48
|
+
prettierConfig,
|
|
49
|
+
];
|
package/package.json
CHANGED
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "simple-zstd",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Node.js interface to the system installed zstd.",
|
|
5
|
-
"main": "index.js",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": ">=20.0.0"
|
|
9
|
+
},
|
|
6
10
|
"scripts": {
|
|
7
|
-
"
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"prepublish": "tsc",
|
|
13
|
+
"lint": "eslint . --ext .ts",
|
|
14
|
+
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
15
|
+
"format:check": "prettier --check \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
16
|
+
"test": "timeout --signal=TERM --kill-after=5s 120s node --test --require ts-node/register test/test.ts || true",
|
|
17
|
+
"test-debug": "DEBUG=SimpleZSTD,SimpleZSTDQueue timeout --signal=TERM --kill-after=5s 120s node --test --require ts-node/register test/test.ts || true",
|
|
18
|
+
"test-ci": "timeout --signal=TERM --kill-after=5s 120s node --test --require ts-node/register test/test.ts && exit 0 || exit 1",
|
|
19
|
+
"coverage": "timeout --signal=TERM --kill-after=5s 120s node --test --experimental-test-coverage --require ts-node/register test/test.ts || true"
|
|
8
20
|
},
|
|
9
21
|
"repository": {
|
|
10
22
|
"type": "git",
|
|
@@ -42,20 +54,24 @@
|
|
|
42
54
|
},
|
|
43
55
|
"homepage": "https://github.com/Stieneee/simple-zstd#readme",
|
|
44
56
|
"devDependencies": {
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"eslint": "^8.
|
|
50
|
-
"eslint
|
|
51
|
-
"eslint-
|
|
52
|
-
"
|
|
53
|
-
"
|
|
57
|
+
"@release-it/conventional-changelog": "^10.0.1",
|
|
58
|
+
"@types/debug": "^4.1.12",
|
|
59
|
+
"@types/node": "^24.10.0",
|
|
60
|
+
"@typescript-eslint/eslint-plugin": "^8.46.3",
|
|
61
|
+
"@typescript-eslint/parser": "^8.46.3",
|
|
62
|
+
"eslint": "^9.39.1",
|
|
63
|
+
"eslint-config-prettier": "^10.1.8",
|
|
64
|
+
"globals": "^16.5.0",
|
|
65
|
+
"prettier": "^3.6.2",
|
|
66
|
+
"release-it": "^19.0.6",
|
|
67
|
+
"ts-node": "^10.9.1",
|
|
68
|
+
"typescript": "^5.9.3"
|
|
54
69
|
},
|
|
55
70
|
"dependencies": {
|
|
71
|
+
"debug": "^4.3.4",
|
|
56
72
|
"is-zst": "^1.0.0",
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
|
|
60
|
-
|
|
73
|
+
"tmp": "^0.2.1",
|
|
74
|
+
"tmp-promise": "^3.0.3"
|
|
75
|
+
},
|
|
76
|
+
"packageManager": "npm@11.6.2"
|
|
61
77
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Writable, WritableOptions } from 'node:stream';
|
|
2
|
+
|
|
3
|
+
export default class BufferWritable extends Writable {
|
|
4
|
+
#buf: Array<Buffer>;
|
|
5
|
+
|
|
6
|
+
constructor(options: WritableOptions) {
|
|
7
|
+
super(options);
|
|
8
|
+
this.#buf = [];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
_write(chunk: Buffer, encoding: string, callback: () => void = () => null) {
|
|
12
|
+
this.#buf.push(chunk);
|
|
13
|
+
callback();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
_writev(chunks: Array<{ chunk: Buffer; encoding: string }>, callback: () => void = () => null) {
|
|
17
|
+
for (const { chunk } of chunks) {
|
|
18
|
+
this.#buf.push(chunk);
|
|
19
|
+
}
|
|
20
|
+
callback();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
_final(callback: () => void = () => null) {
|
|
24
|
+
callback();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
getBuffer(): Buffer {
|
|
28
|
+
return Buffer.concat(this.#buf) || Buffer.alloc(0);
|
|
29
|
+
}
|
|
30
|
+
}
|