@push.rocks/smartstream 3.0.15 → 3.0.17
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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/smartstream.classes.smartduplex.d.ts +7 -5
- package/dist_ts/smartstream.classes.smartduplex.js +22 -13
- package/dist_ts/smartstream.functions.js +1 -1
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/smartstream.classes.smartduplex.ts +26 -16
- package/ts/smartstream.functions.ts +1 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartstream',
|
|
6
|
-
version: '3.0.
|
|
6
|
+
version: '3.0.17',
|
|
7
7
|
description: 'simplifies access to node streams'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx5QkFBeUI7SUFDL0IsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLG1DQUFtQztDQUNqRCxDQUFBIn0=
|
|
@@ -12,23 +12,25 @@ export interface IStreamWriteFunction<T, rT> {
|
|
|
12
12
|
export interface IStreamFinalFunction<rT> {
|
|
13
13
|
(toolsArg: IStreamTools): Promise<rT>;
|
|
14
14
|
}
|
|
15
|
-
export interface
|
|
15
|
+
export interface ISmartDuplexOptions<TInput, TOutput> extends DuplexOptions {
|
|
16
16
|
handleBackpressure?: boolean;
|
|
17
17
|
readFunction?: () => Promise<void>;
|
|
18
18
|
writeFunction?: IStreamWriteFunction<TInput, TOutput>;
|
|
19
19
|
finalFunction?: IStreamFinalFunction<TOutput>;
|
|
20
20
|
}
|
|
21
21
|
export declare class SmartDuplex<TInput = any, TOutput = any> extends Duplex {
|
|
22
|
-
static fromBuffer(buffer: Buffer, options?:
|
|
23
|
-
static fromObservable(observable: plugins.smartrx.rxjs.Observable<any>, options?:
|
|
22
|
+
static fromBuffer(buffer: Buffer, options?: ISmartDuplexOptions<any, any>): SmartDuplex;
|
|
23
|
+
static fromObservable(observable: plugins.smartrx.rxjs.Observable<any>, options?: ISmartDuplexOptions<any, any>): SmartDuplex;
|
|
24
24
|
static fromReplaySubject(replaySubject: plugins.smartrx.rxjs.ReplaySubject<any>, options?: DuplexOptions): SmartDuplex;
|
|
25
25
|
private readFunction?;
|
|
26
26
|
private handleBackpressure;
|
|
27
27
|
private writeFunction?;
|
|
28
28
|
private finalFunction?;
|
|
29
29
|
private observableSubscription?;
|
|
30
|
-
constructor(optionsArg?:
|
|
30
|
+
constructor(optionsArg?: ISmartDuplexOptions<TInput, TOutput>);
|
|
31
31
|
_read(size: number): Promise<void>;
|
|
32
|
-
|
|
32
|
+
notBackpressured: boolean;
|
|
33
|
+
push(chunkArg?: TOutput | null): boolean;
|
|
34
|
+
_write(chunk: TInput, encoding: string, callback: (error?: Error | null) => void): Promise<boolean | void>;
|
|
33
35
|
_final(callback: (error?: Error | null) => void): Promise<void>;
|
|
34
36
|
}
|
|
@@ -3,18 +3,18 @@ import { Duplex } from 'stream';
|
|
|
3
3
|
export class SmartDuplex extends Duplex {
|
|
4
4
|
// STATIC
|
|
5
5
|
static fromBuffer(buffer, options) {
|
|
6
|
-
const
|
|
6
|
+
const smartDuplex = new SmartDuplex(options);
|
|
7
7
|
process.nextTick(() => {
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
smartDuplex.push(buffer);
|
|
9
|
+
smartDuplex.push(null); // Signal the end of the data
|
|
10
10
|
});
|
|
11
|
-
return
|
|
11
|
+
return smartDuplex;
|
|
12
12
|
}
|
|
13
13
|
static fromObservable(observable, options) {
|
|
14
14
|
const smartStream = new SmartDuplex(options);
|
|
15
15
|
smartStream.observableSubscription = observable.subscribe({
|
|
16
16
|
next: (data) => {
|
|
17
|
-
if (!smartStream.push(data)) {
|
|
17
|
+
if (!smartStream.push(data) && smartStream.handleBackpressure) {
|
|
18
18
|
// Pause the observable if the stream buffer is full
|
|
19
19
|
smartStream.observableSubscription?.unsubscribe();
|
|
20
20
|
smartStream.once('drain', () => {
|
|
@@ -75,6 +75,7 @@ export class SmartDuplex extends Duplex {
|
|
|
75
75
|
}
|
|
76
76
|
constructor(optionsArg) {
|
|
77
77
|
super(optionsArg);
|
|
78
|
+
this.notBackpressured = true;
|
|
78
79
|
this.readFunction = optionsArg?.readFunction;
|
|
79
80
|
this.writeFunction = optionsArg?.writeFunction;
|
|
80
81
|
this.finalFunction = optionsArg?.finalFunction;
|
|
@@ -85,6 +86,19 @@ export class SmartDuplex extends Duplex {
|
|
|
85
86
|
await this.readFunction();
|
|
86
87
|
}
|
|
87
88
|
}
|
|
89
|
+
push(chunkArg) {
|
|
90
|
+
const result = super.push(chunkArg);
|
|
91
|
+
if (!result && this.handleBackpressure) {
|
|
92
|
+
this.notBackpressured = false;
|
|
93
|
+
this.pause();
|
|
94
|
+
// Listen for 'drain' event to resume
|
|
95
|
+
this.once('drain', () => {
|
|
96
|
+
this.notBackpressured = true;
|
|
97
|
+
this.resume(); // Resume the source of data
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
88
102
|
// Ensure the _write method types the chunk as TInput and encodes TOutput
|
|
89
103
|
async _write(chunk, encoding, callback) {
|
|
90
104
|
if (!this.writeFunction) {
|
|
@@ -100,19 +114,14 @@ export class SmartDuplex extends Duplex {
|
|
|
100
114
|
try {
|
|
101
115
|
const modifiedChunk = await this.writeFunction(chunk, tools);
|
|
102
116
|
if (modifiedChunk) {
|
|
103
|
-
|
|
104
|
-
this.pause();
|
|
105
|
-
// Listen for 'drain' event to resume
|
|
106
|
-
this.once('drain', () => {
|
|
107
|
-
this.resume(); // Resume the source of data
|
|
108
|
-
});
|
|
109
|
-
}
|
|
117
|
+
this.push(modifiedChunk);
|
|
110
118
|
}
|
|
111
119
|
callback();
|
|
112
120
|
}
|
|
113
121
|
catch (err) {
|
|
114
122
|
callback(err);
|
|
115
123
|
}
|
|
124
|
+
return this.notBackpressured;
|
|
116
125
|
}
|
|
117
126
|
async _final(callback) {
|
|
118
127
|
if (this.finalFunction) {
|
|
@@ -137,4 +146,4 @@ export class SmartDuplex extends Duplex {
|
|
|
137
146
|
callback();
|
|
138
147
|
}
|
|
139
148
|
}
|
|
140
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzdHJlYW0uY2xhc3Nlcy5zbWFydGR1cGxleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c3RyZWFtLmNsYXNzZXMuc21hcnRkdXBsZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFzQixNQUFNLFFBQVEsQ0FBQztBQXVCcEQsTUFBTSxPQUFPLFdBQXlDLFNBQVEsTUFBTTtJQUNsRSxTQUFTO0lBQ1QsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFjLEVBQUUsT0FBdUM7UUFDdkUsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDcEIsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QixXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsNkJBQTZCO1FBQ3ZELENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQ25CLFVBQWdELEVBQ2hELE9BQXVDO1FBRXZDLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLFdBQVcsQ0FBQyxzQkFBc0IsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO1lBQ3hELElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNiLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRTtvQkFDN0Qsb0RBQW9EO29CQUNwRCxXQUFXLENBQUMsc0JBQXNCLEVBQUUsV0FBVyxFQUFFLENBQUM7b0JBQ2xELFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcs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
|
|
@@ -10,4 +10,4 @@ export function createTransformFunction(asyncFunction, options) {
|
|
|
10
10
|
});
|
|
11
11
|
return smartDuplexStream;
|
|
12
12
|
}
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzdHJlYW0uZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRzdHJlYW0uZnVuY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWlELE1BQU0sUUFBUSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQU1uRSxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLGFBQXNELEVBQ3RELE9BQTBCO0lBRTFCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxXQUFXLENBQUM7UUFDeEMsR0FBRyxPQUFPO1FBQ1YsYUFBYSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDMUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0MsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztLQUNGLENBQUMsQ0FBQztJQUVILE9BQU8saUJBQWlCLENBQUM7QUFDM0IsQ0FBQyJ9
|
package/package.json
CHANGED
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -14,7 +14,7 @@ export interface IStreamFinalFunction<rT> {
|
|
|
14
14
|
(toolsArg: IStreamTools): Promise<rT>;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
export interface
|
|
17
|
+
export interface ISmartDuplexOptions<TInput, TOutput> extends DuplexOptions {
|
|
18
18
|
handleBackpressure?: boolean;
|
|
19
19
|
readFunction?: () => Promise<void>;
|
|
20
20
|
writeFunction?: IStreamWriteFunction<TInput, TOutput>;
|
|
@@ -24,23 +24,23 @@ export interface SmartStreamOptions<TInput, TOutput> extends DuplexOptions {
|
|
|
24
24
|
|
|
25
25
|
export class SmartDuplex<TInput = any, TOutput = any> extends Duplex {
|
|
26
26
|
// STATIC
|
|
27
|
-
static fromBuffer(buffer: Buffer, options?:
|
|
28
|
-
const
|
|
27
|
+
static fromBuffer(buffer: Buffer, options?: ISmartDuplexOptions<any, any>): SmartDuplex {
|
|
28
|
+
const smartDuplex = new SmartDuplex(options);
|
|
29
29
|
process.nextTick(() => {
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
smartDuplex.push(buffer);
|
|
31
|
+
smartDuplex.push(null); // Signal the end of the data
|
|
32
32
|
});
|
|
33
|
-
return
|
|
33
|
+
return smartDuplex;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
static fromObservable(
|
|
37
37
|
observable: plugins.smartrx.rxjs.Observable<any>,
|
|
38
|
-
options?:
|
|
38
|
+
options?: ISmartDuplexOptions<any, any>
|
|
39
39
|
): SmartDuplex {
|
|
40
40
|
const smartStream = new SmartDuplex(options);
|
|
41
41
|
smartStream.observableSubscription = observable.subscribe({
|
|
42
42
|
next: (data) => {
|
|
43
|
-
if (!smartStream.push(data)) {
|
|
43
|
+
if (!smartStream.push(data) && smartStream.handleBackpressure) {
|
|
44
44
|
// Pause the observable if the stream buffer is full
|
|
45
45
|
smartStream.observableSubscription?.unsubscribe();
|
|
46
46
|
smartStream.once('drain', () => {
|
|
@@ -115,7 +115,7 @@ export class SmartDuplex<TInput = any, TOutput = any> extends Duplex {
|
|
|
115
115
|
private finalFunction?: IStreamFinalFunction<TOutput>;
|
|
116
116
|
private observableSubscription?: plugins.smartrx.rxjs.Subscription;
|
|
117
117
|
|
|
118
|
-
constructor(optionsArg?:
|
|
118
|
+
constructor(optionsArg?: ISmartDuplexOptions<TInput, TOutput>) {
|
|
119
119
|
super(optionsArg);
|
|
120
120
|
this.readFunction = optionsArg?.readFunction;
|
|
121
121
|
this.writeFunction = optionsArg?.writeFunction;
|
|
@@ -129,6 +129,21 @@ export class SmartDuplex<TInput = any, TOutput = any> extends Duplex {
|
|
|
129
129
|
}
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
+
public notBackpressured = true;
|
|
133
|
+
public push(chunkArg?: TOutput | null): boolean {
|
|
134
|
+
const result = super.push(chunkArg);
|
|
135
|
+
if (!result && this.handleBackpressure) {
|
|
136
|
+
this.notBackpressured = false;
|
|
137
|
+
this.pause();
|
|
138
|
+
// Listen for 'drain' event to resume
|
|
139
|
+
this.once('drain', () => {
|
|
140
|
+
this.notBackpressured = true;
|
|
141
|
+
this.resume(); // Resume the source of data
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
return result;
|
|
145
|
+
}
|
|
146
|
+
|
|
132
147
|
// Ensure the _write method types the chunk as TInput and encodes TOutput
|
|
133
148
|
public async _write(chunk: TInput, encoding: string, callback: (error?: Error | null) => void) {
|
|
134
149
|
if (!this.writeFunction) {
|
|
@@ -146,18 +161,13 @@ export class SmartDuplex<TInput = any, TOutput = any> extends Duplex {
|
|
|
146
161
|
try {
|
|
147
162
|
const modifiedChunk = await this.writeFunction(chunk, tools);
|
|
148
163
|
if (modifiedChunk) {
|
|
149
|
-
|
|
150
|
-
this.pause();
|
|
151
|
-
// Listen for 'drain' event to resume
|
|
152
|
-
this.once('drain', () => {
|
|
153
|
-
this.resume(); // Resume the source of data
|
|
154
|
-
});
|
|
155
|
-
}
|
|
164
|
+
this.push(modifiedChunk);
|
|
156
165
|
}
|
|
157
166
|
callback();
|
|
158
167
|
} catch (err) {
|
|
159
168
|
callback(err);
|
|
160
169
|
}
|
|
170
|
+
return this.notBackpressured;
|
|
161
171
|
}
|
|
162
172
|
|
|
163
173
|
public async _final(callback: (error?: Error | null) => void) {
|