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.
Files changed (48) hide show
  1. package/.github/workflows/ci.yml +46 -0
  2. package/.github/workflows/release.yml +45 -0
  3. package/.prettierignore +5 -0
  4. package/.prettierrc +8 -0
  5. package/.release-it.json +28 -0
  6. package/CHANGELOG.md +26 -0
  7. package/README.md +690 -47
  8. package/dist/src/buffer-writable.d.ts +12 -0
  9. package/dist/src/buffer-writable.js +41 -0
  10. package/dist/src/index.d.ts +49 -0
  11. package/dist/src/index.js +430 -0
  12. package/dist/src/peek-transform.d.ts +16 -0
  13. package/dist/src/peek-transform.js +145 -0
  14. package/dist/src/process-duplex.d.ts +11 -0
  15. package/dist/src/process-duplex.js +157 -0
  16. package/dist/src/process-queue.d.ts +8 -0
  17. package/dist/src/process-queue.js +94 -0
  18. package/dist/src/types.d.ts +34 -0
  19. package/dist/src/types.js +3 -0
  20. package/eslint.config.js +49 -0
  21. package/package.json +32 -16
  22. package/src/buffer-writable.ts +30 -0
  23. package/src/index.ts +472 -0
  24. package/src/is-zst.d.ts +5 -0
  25. package/src/peek-transform.ts +153 -0
  26. package/src/process-duplex.ts +164 -0
  27. package/src/process-queue.ts +97 -0
  28. package/src/types.ts +35 -0
  29. package/tsconfig.json +110 -0
  30. package/.eslintrc.js +0 -18
  31. package/.nyc_output/4b36a1ef-a01d-4de7-a4be-e966f315cbd7.json +0 -1
  32. package/.nyc_output/5d73987b-f188-488b-8441-66c67bb19076.json +0 -1
  33. package/.nyc_output/processinfo/4b36a1ef-a01d-4de7-a4be-e966f315cbd7.json +0 -1
  34. package/.nyc_output/processinfo/5d73987b-f188-488b-8441-66c67bb19076.json +0 -1
  35. package/.nyc_output/processinfo/index.json +0 -1
  36. package/.travis.yml +0 -9
  37. package/coverage/base.css +0 -224
  38. package/coverage/block-navigation.js +0 -87
  39. package/coverage/buffer-writable.js.html +0 -154
  40. package/coverage/favicon.png +0 -0
  41. package/coverage/index.html +0 -146
  42. package/coverage/index.js.html +0 -841
  43. package/coverage/oven.js.html +0 -235
  44. package/coverage/prettify.css +0 -1
  45. package/coverage/prettify.js +0 -2
  46. package/coverage/sort-arrow-sprite.png +0 -0
  47. package/coverage/sorter.js +0 -196
  48. 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
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -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": "1.4.2",
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
- "test": "mocha"
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
- "brake": "^1.0.1",
46
- "chai": "^4.3.6",
47
- "chai-as-promised": "^7.1.1",
48
- "chai-fs": "^2.0.0",
49
- "eslint": "^8.25.0",
50
- "eslint-config-airbnb-base": "^15.0.0",
51
- "eslint-plugin-import": "^2.26.0",
52
- "mocha": "^10.1.0",
53
- "release-it": "^15.5.0"
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
- "peek-stream": "^1.1.3",
58
- "process-streams": "^1.0.1",
59
- "through2": "^4.0.2"
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
+ }