Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
c77e0f2ba6 | |||
196fb6d396 | |||
df0ddf04b3 | |||
2e1aa4a8ff | |||
bc09033af0 | |||
22df9dfd94 | |||
d48ef6eb43 | |||
9421c652a2 |
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@push.rocks/smartstream",
|
"name": "@push.rocks/smartstream",
|
||||||
"version": "3.0.21",
|
"version": "3.0.25",
|
||||||
"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,17 +16,16 @@ 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`);
|
||||||
|
// await tools.push(chunk);
|
||||||
return chunk;
|
return chunk;
|
||||||
},
|
},
|
||||||
}); // This stream processes data more slowly
|
}); // This stream processes data more slowly
|
||||||
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`);
|
||||||
|
@ -5,9 +5,7 @@ import * as fs from 'fs';
|
|||||||
|
|
||||||
tap.test('should create a SmartStream from a Buffer', async () => {
|
tap.test('should create a SmartStream from a Buffer', async () => {
|
||||||
const bufferData = Buffer.from('This is a test buffer');
|
const bufferData = Buffer.from('This is a test buffer');
|
||||||
const smartStream = SmartDuplex.fromBuffer(bufferData, {
|
const smartStream = SmartDuplex.fromBuffer(bufferData, {});
|
||||||
handleBackpressure: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
let receivedData = Buffer.alloc(0);
|
let receivedData = Buffer.alloc(0);
|
||||||
|
|
||||||
|
@ -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.25',
|
||||||
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>;
|
||||||
@ -60,9 +59,7 @@ export class SmartDuplex<TInput = any, TOutput = any> extends Duplex {
|
|||||||
let canPushMore = true;
|
let canPushMore = true;
|
||||||
while(this.backpressuredArray.data.length > 0 && canPushMore) {
|
while(this.backpressuredArray.data.length > 0 && canPushMore) {
|
||||||
const nextChunk = this.backpressuredArray.shift();
|
const nextChunk = this.backpressuredArray.shift();
|
||||||
if (nextChunk) {
|
canPushMore = this.push(nextChunk);
|
||||||
canPushMore = this.push(nextChunk);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,8 +77,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 +95,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,21 +112,23 @@ 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.backpressuredArray.push(pipeObject);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const finalChunk = await this.options.finalFunction(tools);
|
const finalChunk = await this.options.finalFunction(tools);
|
||||||
if (finalChunk) {
|
if (finalChunk) {
|
||||||
this.push(finalChunk);
|
this.backpressuredArray.push(finalChunk);
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this.push(null);
|
this.backpressuredArray.push(null);
|
||||||
callback(err);
|
callback(err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.push(null);
|
this.backpressuredArray.push(null);
|
||||||
callback();
|
callback();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user