Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
bc09033af0 | |||
22df9dfd94 | |||
d48ef6eb43 | |||
9421c652a2 |
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@push.rocks/smartstream",
|
"name": "@push.rocks/smartstream",
|
||||||
"version": "3.0.21",
|
"version": "3.0.23",
|
||||||
"private": false,
|
"private": false,
|
||||||
"description": "simplifies access to node streams",
|
"description": "simplifies access to node streams",
|
||||||
"main": "dist_ts/index.js",
|
"main": "dist_ts/index.js",
|
||||||
|
@ -7,7 +7,6 @@ tap.test('should run backpressure test', async (toolsArg) => {
|
|||||||
const stream1 = new SmartDuplex({
|
const stream1 = new SmartDuplex({
|
||||||
name: 'stream1',
|
name: 'stream1',
|
||||||
objectMode: true,
|
objectMode: true,
|
||||||
handleBackpressure: true,
|
|
||||||
writeFunction: async (chunk, tools) => {
|
writeFunction: async (chunk, tools) => {
|
||||||
await new Promise((resolve) => setTimeout(resolve, 10)); // Slow processing
|
await new Promise((resolve) => setTimeout(resolve, 10)); // Slow processing
|
||||||
console.log(`processed chunk ${chunk} in stream 1`);
|
console.log(`processed chunk ${chunk} in stream 1`);
|
||||||
@ -17,7 +16,6 @@ tap.test('should run backpressure test', async (toolsArg) => {
|
|||||||
const stream2 = new SmartDuplex({
|
const stream2 = new SmartDuplex({
|
||||||
name: 'stream2',
|
name: 'stream2',
|
||||||
objectMode: true,
|
objectMode: true,
|
||||||
handleBackpressure: true,
|
|
||||||
writeFunction: async (chunk, tools) => {
|
writeFunction: async (chunk, tools) => {
|
||||||
await new Promise((resolve) => setTimeout(resolve, 20)); // Slow processing
|
await new Promise((resolve) => setTimeout(resolve, 20)); // Slow processing
|
||||||
console.log(`processed chunk ${chunk} in stream 2`);
|
console.log(`processed chunk ${chunk} in stream 2`);
|
||||||
@ -27,7 +25,6 @@ tap.test('should run backpressure test', async (toolsArg) => {
|
|||||||
const stream3 = new SmartDuplex({
|
const stream3 = new SmartDuplex({
|
||||||
objectMode: true,
|
objectMode: true,
|
||||||
name: 'stream3',
|
name: 'stream3',
|
||||||
handleBackpressure: true,
|
|
||||||
writeFunction: async (chunk, tools) => {
|
writeFunction: async (chunk, tools) => {
|
||||||
await new Promise((resolve) => setTimeout(resolve, 100)); // Slow processing
|
await new Promise((resolve) => setTimeout(resolve, 100)); // Slow processing
|
||||||
console.log(`processed chunk ${chunk} in stream 3`);
|
console.log(`processed chunk ${chunk} in stream 3`);
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@push.rocks/smartstream',
|
name: '@push.rocks/smartstream',
|
||||||
version: '3.0.21',
|
version: '3.0.23',
|
||||||
description: 'simplifies access to node streams'
|
description: 'simplifies access to node streams'
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ import { Duplex, type DuplexOptions } from 'stream';
|
|||||||
|
|
||||||
export interface IStreamTools {
|
export interface IStreamTools {
|
||||||
truncate: () => void;
|
truncate: () => void;
|
||||||
push: (pipeObject: any) => void;
|
push: (pipeObject: any) => Promise<void>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IStreamWriteFunction<T, rT> {
|
export interface IStreamWriteFunction<T, rT> {
|
||||||
@ -17,7 +17,6 @@ export interface IStreamFinalFunction<rT> {
|
|||||||
export interface ISmartDuplexOptions<TInput, TOutput> extends DuplexOptions {
|
export interface ISmartDuplexOptions<TInput, TOutput> extends DuplexOptions {
|
||||||
debug?: boolean;
|
debug?: boolean;
|
||||||
name?: string;
|
name?: string;
|
||||||
handleBackpressure?: boolean;
|
|
||||||
readFunction?: () => Promise<void>;
|
readFunction?: () => Promise<void>;
|
||||||
writeFunction?: IStreamWriteFunction<TInput, TOutput>;
|
writeFunction?: IStreamWriteFunction<TInput, TOutput>;
|
||||||
finalFunction?: IStreamFinalFunction<TOutput>;
|
finalFunction?: IStreamFinalFunction<TOutput>;
|
||||||
@ -80,8 +79,13 @@ export class SmartDuplex<TInput = any, TOutput = any> extends Duplex {
|
|||||||
isTruncated = true;
|
isTruncated = true;
|
||||||
callback();
|
callback();
|
||||||
},
|
},
|
||||||
push: (pushArg: TOutput) => {
|
push: async (pushArg: TOutput) => {
|
||||||
this.backpressuredArray.push(pushArg);
|
const canPushMore = this.backpressuredArray.push(pushArg);
|
||||||
|
if (!canPushMore) {
|
||||||
|
this.debugLog(`${this.options.name}: cannot push more`);
|
||||||
|
await this.backpressuredArray.waitForSpace();
|
||||||
|
this.debugLog(`${this.options.name}: can push more again`);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -93,12 +97,7 @@ export class SmartDuplex<TInput = any, TOutput = any> extends Duplex {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (modifiedChunk) {
|
if (modifiedChunk) {
|
||||||
const canPushMore = this.backpressuredArray.push(modifiedChunk);
|
await tools.push(modifiedChunk);
|
||||||
if (!canPushMore) {
|
|
||||||
this.debugLog(`${this.options.name}: cannot push more`);
|
|
||||||
await this.backpressuredArray.waitForSpace();
|
|
||||||
this.debugLog(`${this.options.name}: can push more again`);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
callback();
|
callback();
|
||||||
writeDeferred.resolve();
|
writeDeferred.resolve();
|
||||||
@ -115,7 +114,9 @@ export class SmartDuplex<TInput = any, TOutput = any> extends Duplex {
|
|||||||
if (this.options.finalFunction) {
|
if (this.options.finalFunction) {
|
||||||
const tools: IStreamTools = {
|
const tools: IStreamTools = {
|
||||||
truncate: () => callback(),
|
truncate: () => callback(),
|
||||||
push: (pipeObject) => this.push(pipeObject),
|
push: async (pipeObject) => {
|
||||||
|
this.push(pipeObject);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
Reference in New Issue
Block a user