Skip to content

Commit f31cc6e

Browse files
authored
Merge pull request #13 from eugenechyrski/master
Support for rsocket over websocket in browser
2 parents 902a4fd + 81b6f38 commit f31cc6e

File tree

7 files changed

+35
-17
lines changed

7 files changed

+35
-17
lines changed

lib/core/rsocket_requester.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,10 +261,10 @@ class RSocketRequester extends RSocket {
261261
case frame_types.REQUEST_RESPONSE:
262262
var requestResponseFrame = frame as RequestResponseFrame;
263263
if (responder != null && requestResponseFrame.payload != null) {
264-
responder!.requestResponse!(requestResponseFrame.payload)
264+
responder!.subscribe!(requestResponseFrame.payload)
265265
.then((payload) {
266266
connection.write(
267-
FrameCodec.encodePayloadFrame(header.streamId, true, payload));
267+
FrameCodec.encodePayloadFrame(header.streamId, false, payload));
268268
}).catchError((error) {
269269
var rsocketError = convertToRSocketException(error);
270270
connection.write(FrameCodec.encodeErrorFrame(

lib/core/rsocket_responder.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import 'dart:io';
1+
2+
3+
import 'package:universal_io/io.dart';
24

35
import '../core/rsocket_requester.dart';
46
import '../duplex_connection.dart';

lib/duplex_connection.dart

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
import 'dart:io';
21
import 'dart:typed_data';
32

3+
import 'package:universal_io/io.dart';
4+
import 'package:web_socket_channel/web_socket_channel.dart';
5+
46
import 'io/bytes.dart';
57
import 'rsocket.dart';
68

@@ -56,14 +58,16 @@ class TcpDuplexConnection extends DuplexConnection {
5658
}
5759

5860
class WebSocketDuplexConnection extends DuplexConnection {
59-
WebSocket webSocket;
60-
bool closed = false;
61+
WebSocketChannel webSocket;
62+
bool closed = true;
6163

6264
WebSocketDuplexConnection(this.webSocket);
6365

6466
@override
6567
void init() {
66-
webSocket.listen((message) {
68+
69+
70+
webSocket.stream.listen((message) {
6771
var data = message as List<int>;
6872
var frameLenBytes = i24ToBytes(data.length);
6973
receiveHandler!(Uint8List.fromList(frameLenBytes + data));
@@ -79,15 +83,14 @@ class WebSocketDuplexConnection extends DuplexConnection {
7983
if (!closed) {
8084
closed = true;
8185
_availability = 0.0;
82-
webSocket.close();
8386
closeHandler?.call();
8487
}
8588
}
8689

8790
@override
8891
void write(Uint8List chunk) {
8992
//remove frame length: 3 bytes
90-
webSocket.add(chunk.sublist(3));
93+
webSocket.sink.add(chunk.sublist(3));
9194
}
9295
}
9396

@@ -97,10 +100,13 @@ Future<DuplexConnection> connectRSocket(String url, TcpChunkHandler handler) {
97100
if (scheme == 'tcp') {
98101
var socketFuture = Socket.connect(uri.host, uri.port);
99102
return socketFuture.then((socket) => TcpDuplexConnection(socket));
100-
} else if (scheme == 'ws' || scheme == 'wss') {
101-
var socketFuture = WebSocket.connect(url);
102-
return socketFuture.then((socket) => WebSocketDuplexConnection(socket));
103+
}if (scheme == 'ws' || scheme == 'wss') {
104+
final websocket = WebSocketChannel.connect(
105+
Uri.parse(url),
106+
);
107+
return Future.value(WebSocketDuplexConnection(websocket));
103108
} else {
104109
return Future.error('${scheme} unsupported');
105110
}
106111
}
112+

lib/io/bytes.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,16 @@ class RSocketByteBuffer {
155155
}
156156

157157
Uint8List i64ToBytes(int value) {
158-
return Uint8List(8)..buffer.asByteData().setUint64(0, value, Endian.big);
158+
//because of browser limitations
159+
int l = value;
160+
var b = BytesBuilder();
161+
for (int i = 7; i >= 0; i--) {
162+
b.addByte(l & 0xFF);
163+
164+
l >>= 8;
165+
}
166+
return Uint8List.fromList(b.toBytes().reversed.toList());
167+
//return Uint8List(8)..buffer.asByteData().setUint64(0, value, Endian.big);
159168
}
160169

161170
Uint8List i32ToBytes(int value) {

lib/rsocket.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class RSocket implements Closeable, Availability {
2626
(Stream<Payload> payloads) => Stream.error(Exception('Unsupported'));
2727
MetadataPush? metadataPush =
2828
(Payload? payload) => Future.error(Exception('Unsupported'));
29-
29+
RequestResponse? subscribe= (Payload? payload)=> Future.error(Exception('Unsupported'));
3030
@override
3131
void close() {}
3232

lib/rsocket_server.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import 'dart:io';
1+
2+
import 'package:universal_io/io.dart';
23

34
import 'core/rsocket_responder.dart';
45
import 'rsocket.dart';

pubspec.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ issue_tracker: https://github.com/rsocket/rsocket-dart/issues
77
environment:
88
sdk: '>=2.12.0 <3.0.0'
99
dependencies:
10-
rxdart: ^0.27.2
11-
collection: ^1.15.0-nullsafety.4
10+
web_socket_channel:
11+
universal_io:
1212
dev_dependencies:
1313
test: ^1.19.2

0 commit comments

Comments
 (0)