Skip to content

Commit b69a713

Browse files
authored
Merge pull request #7 from drstranges/master
Send CANCEL frame on request-stream cancelled by client
2 parents 347476a + 3cc827a commit b69a713

File tree

3 files changed

+19
-3
lines changed

3 files changed

+19
-3
lines changed

lib/core/rsocket_requester.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@ class CompleterSubscriber implements Subscriber {
4545
}
4646

4747
class StreamSubscriber implements Subscriber {
48-
StreamController controller = StreamController();
48+
final StreamController controller;
49+
50+
StreamSubscriber({FutureOr<void> onCancel() = null})
51+
: controller = StreamController(onCancel: onCancel);
4952

5053
@override
5154
void onNext(Payload value) {
@@ -123,7 +126,10 @@ class RSocketRequester extends RSocket {
123126
var streamId = streamIdSupplier.nextStreamId(senders);
124127
connection.write(FrameCodec.encodeRequestStreamFrame(
125128
streamId, MAX_REQUEST_N_SIZE, payload));
126-
var streamSubscriber = StreamSubscriber();
129+
var streamSubscriber = StreamSubscriber(onCancel: () {
130+
connection.write(FrameCodec.encodeCancelFrame(streamId));
131+
senders.remove(streamId);
132+
});
127133
senders[streamId] = streamSubscriber;
128134
return streamSubscriber.payloadStream();
129135
};

lib/frame/frame.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,16 @@ class FrameCodec {
472472
refillFrameLength(frameBuffer);
473473
return frameBuffer.toUint8Array();
474474
}
475+
476+
static Uint8List encodeCancelFrame(int streamId) {
477+
var frameBuffer = RSocketByteBuffer();
478+
frameBuffer.writeI24(0); // frame length
479+
frameBuffer.writeI32(streamId); //stream id
480+
frameBuffer.writeI8(frame_types.CANCEL << 2);
481+
frameBuffer.writeI8(0);
482+
refillFrameLength(frameBuffer);
483+
return frameBuffer.toUint8Array();
484+
}
475485
}
476486

477487
Payload decodePayload(

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ issue_tracker: https://github.com/rsocket/rsocket-dart/issues
77
environment:
88
sdk: '>=2.7.0 <3.0.0'
99
dependencies:
10-
rxdart: ^0.27.0
10+
rxdart: ^0.27.1
1111
dev_dependencies:
1212
test: ^1.6.0

0 commit comments

Comments
 (0)