fix(VirtualStream): Fix stream closing behavior to correctly handle closing bits

This commit is contained in:
Philipp Kunz 2024-10-16 09:56:32 +02:00
parent 57e51543e7
commit 74e6205ac3
3 changed files with 23 additions and 6 deletions

View File

@ -1,5 +1,12 @@
# Changelog
## 2024-10-16 - 3.1.8 - fix(VirtualStream)
Fix stream closing behavior to correctly handle closing bits
- Introduced a 'closingBit' constant to properly signal the end of stream data.
- Updated the 'readFromWebstream' function to send a closing bit upon completion if 'closeAfterReading' is true.
- Modified the 'close' method to optionally send a closing bit when terminating the stream.
## 2024-10-16 - 3.1.7 - fix(VirtualStream)
Fix issue in VirtualStream to handle null values during data writing.

View File

@ -3,6 +3,6 @@
*/
export const commitinfo = {
name: '@api.global/typedrequest',
version: '3.1.7',
version: '3.1.8',
description: 'A TypeScript library for making typed requests towards APIs, including facilities for handling requests, routing, and virtual stream handling.'
}

View File

@ -1,6 +1,9 @@
import * as plugins from './plugins.js';
import { TypedRouter } from './classes.typedrouter.js';
const closingBit: any = '#############CLOSING BIT#############';
export interface ICommFunctions {
sendMethod?: (
sendPayload: plugins.typedRequestInterfaces.IStreamRequest
@ -278,7 +281,7 @@ export class VirtualStream<T = Uint8Array> implements plugins.typedRequestInterf
cycleId: streamTrArg.request.cycleId,
cycle: 'response',
mainPurpose: 'chunk',
next: this.sendBackpressuredArray.data.length > 1,
next: this.sendBackpressuredArray.data.length > 1, // 1 and not 0 because we call shift a few lines down
backpressure: !this.receiveBackpressuredArray.checkSpaceAvailable(),
chunkData: this.sendBackpressuredArray.shift(),
};
@ -392,7 +395,7 @@ export class VirtualStream<T = Uint8Array> implements plugins.typedRequestInterf
streamIsDone = done;
}
if (closeAfterReading) {
await this.close();
await this.close(true);
}
}
@ -400,7 +403,7 @@ export class VirtualStream<T = Uint8Array> implements plugins.typedRequestInterf
const writer = writableStreamArg.getWriter();
while(this.keepAlive || this.receiveBackpressuredArray.checkHasItems()) {
const value = await this.fetchData();
if (value === null) {
if (value === closingBit) {
writableStreamArg.close();
break;
}
@ -408,8 +411,15 @@ export class VirtualStream<T = Uint8Array> implements plugins.typedRequestInterf
}
}
public async close() {
this.sendData(null);
/**
* closes the stream
* if sendClosingBitArg is true, the stream will send a closing bit
* @param sendClosingBitArg
*/
public async close(sendClosingBitArg = false) {
if (sendClosingBitArg) {
this.sendData(closingBit);
}
this.keepAlive = false;
}
}