fix(core): Fix incorrect backpressure logic in VirtualStream class
This commit is contained in:
parent
70e2dcc1b8
commit
1a92aa6630
@ -1,5 +1,11 @@
|
||||
# Changelog
|
||||
|
||||
## 2024-10-14 - 3.1.2 - fix(core)
|
||||
Fix incorrect backpressure logic in VirtualStream class
|
||||
|
||||
- Corrected the logic for determining backpressure status by checking the available space in the receiveBackpressuredArray.
|
||||
- Introduced a looping mechanism to wait when the other side is backpressured before sending more data.
|
||||
|
||||
## 2024-10-14 - 3.1.1 - fix(virtualstream)
|
||||
Fix handling of virtual streams for proper shutdown
|
||||
|
||||
|
@ -3,6 +3,6 @@
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@api.global/typedrequest',
|
||||
version: '3.1.1',
|
||||
version: '3.1.2',
|
||||
description: 'A TypeScript library for making typed requests towards APIs, including facilities for handling requests, routing, and virtual stream handling.'
|
||||
}
|
||||
|
@ -162,7 +162,7 @@ export class VirtualStream<T = Uint8Array> implements plugins.typedRequestInterf
|
||||
cycle: 'request',
|
||||
mainPurpose: 'feedback',
|
||||
next: this.sendBackpressuredArray.data.length > 0,
|
||||
backpressure: this.receiveBackpressuredArray.checkSpaceAvailable(),
|
||||
backpressure: !this.receiveBackpressuredArray.checkSpaceAvailable(),
|
||||
},
|
||||
response: null,
|
||||
}).catch(() => {
|
||||
@ -178,6 +178,12 @@ export class VirtualStream<T = Uint8Array> implements plugins.typedRequestInterf
|
||||
|
||||
// do work loop
|
||||
while (this.sendBackpressuredArray.data.length > 0 || otherSideHasNext) {
|
||||
if (otherSideIsBackpressured) {
|
||||
while (otherSideIsBackpressured) {
|
||||
await plugins.smartdelay.delayFor(50);
|
||||
await getFeedback();
|
||||
}
|
||||
}
|
||||
let dataArg: typeof this.sendBackpressuredArray.data[0];
|
||||
if (this.sendBackpressuredArray.data.length > 0) {
|
||||
dataArg = this.sendBackpressuredArray.shift();
|
||||
@ -204,7 +210,8 @@ export class VirtualStream<T = Uint8Array> implements plugins.typedRequestInterf
|
||||
if (streamTr && streamTr.response && streamTr.response.chunkData) {
|
||||
this.receiveBackpressuredArray.push(streamTr.response.chunkData);
|
||||
}
|
||||
thisSideIsBackpressured = this.receiveBackpressuredArray.checkSpaceAvailable();
|
||||
otherSideIsBackpressured = streamTr && streamTr.response && streamTr.response.backpressure;
|
||||
thisSideIsBackpressured = !this.receiveBackpressuredArray.checkSpaceAvailable();
|
||||
|
||||
// lets care about looping
|
||||
otherSideHasNext = streamTr && streamTr.response && streamTr.response.next;
|
||||
@ -235,7 +242,7 @@ export class VirtualStream<T = Uint8Array> implements plugins.typedRequestInterf
|
||||
mainPurpose: 'keepAlive',
|
||||
keepAlive: this.keepAlive,
|
||||
next: this.sendBackpressuredArray.data.length > 0,
|
||||
backpressure: this.receiveBackpressuredArray.checkSpaceAvailable(),
|
||||
backpressure: !this.receiveBackpressuredArray.checkSpaceAvailable(),
|
||||
};
|
||||
}
|
||||
|
||||
@ -247,7 +254,7 @@ export class VirtualStream<T = Uint8Array> implements plugins.typedRequestInterf
|
||||
cycle: 'response',
|
||||
mainPurpose: 'feedback',
|
||||
next: this.sendBackpressuredArray.data.length > 0,
|
||||
backpressure: this.receiveBackpressuredArray.checkSpaceAvailable(),
|
||||
backpressure: !this.receiveBackpressuredArray.checkSpaceAvailable(),
|
||||
};
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user