From 19738ab1e0904d3ce1577ad11380fae4e09d3030 Mon Sep 17 00:00:00 2001 From: Brian Quinlan Date: Mon, 4 Mar 2024 16:18:52 -0800 Subject: [PATCH 1/4] Factory --- pkgs/web_socket/README.md | 3 +-- pkgs/web_socket/lib/src/browser_web_socket.dart | 12 ++++++++++-- pkgs/web_socket/lib/src/connect_stub.dart | 5 +++++ pkgs/web_socket/lib/src/io_web_socket.dart | 11 +++++++++-- pkgs/web_socket/lib/src/web_socket.dart | 12 ++++++++++-- .../test/browser_web_socket_conformance_test.dart | 2 +- .../test/io_web_socket_conformance_test.dart | 2 +- pkgs/web_socket/test/websocket_test.dart | 10 ++++++++++ 8 files changed, 47 insertions(+), 10 deletions(-) create mode 100644 pkgs/web_socket/lib/src/connect_stub.dart create mode 100644 pkgs/web_socket/test/websocket_test.dart diff --git a/pkgs/web_socket/README.md b/pkgs/web_socket/README.md index 3e9c2d0146..786d239891 100644 --- a/pkgs/web_socket/README.md +++ b/pkgs/web_socket/README.md @@ -7,12 +7,11 @@ implementations. ## Using ```dart -import 'package:web_socket/io_web_socket.dart'; import 'package:web_socket/web_socket.dart'; void main() async { final socket = - await IOWebSocket.connect(Uri.parse('wss://ws.postman-echo.com/raw')); + await WebSocket.connect(Uri.parse('wss://ws.postman-echo.com/raw')); socket.events.listen((e) async { switch (e) { diff --git a/pkgs/web_socket/lib/src/browser_web_socket.dart b/pkgs/web_socket/lib/src/browser_web_socket.dart index eceb86c02c..a98afe9262 100644 --- a/pkgs/web_socket/lib/src/browser_web_socket.dart +++ b/pkgs/web_socket/lib/src/browser_web_socket.dart @@ -18,8 +18,11 @@ class BrowserWebSocket implements WebSocket { final web.WebSocket _webSocket; final _events = StreamController(); - static Future connect(Uri url) async { - final webSocket = web.WebSocket(url.toString())..binaryType = 'arraybuffer'; + static Future connect(Uri url, + {Iterable? protocols}) async { + final webSocket = web.WebSocket(url.toString(), + protocols?.map((e) => e.toJS).toList().toJS ?? JSArray()) + ..binaryType = 'arraybuffer'; final browserSocket = BrowserWebSocket._(webSocket); final webSocketConnected = Completer(); @@ -125,4 +128,9 @@ class BrowserWebSocket implements WebSocket { @override Stream get events => _events.stream; + + @override + String get protocol => _webSocket.protocol; } + +const connect = BrowserWebSocket.connect; diff --git a/pkgs/web_socket/lib/src/connect_stub.dart b/pkgs/web_socket/lib/src/connect_stub.dart new file mode 100644 index 0000000000..828a09dc63 --- /dev/null +++ b/pkgs/web_socket/lib/src/connect_stub.dart @@ -0,0 +1,5 @@ +import '../web_socket.dart'; + +Future connect(Uri url, {Iterable? protocols}) { + throw UnsupportedError('Cannot connect without dart:js_interop or dart:io.'); +} diff --git a/pkgs/web_socket/lib/src/io_web_socket.dart b/pkgs/web_socket/lib/src/io_web_socket.dart index 3b17ccdf58..1fbd43c64e 100644 --- a/pkgs/web_socket/lib/src/io_web_socket.dart +++ b/pkgs/web_socket/lib/src/io_web_socket.dart @@ -16,9 +16,11 @@ class IOWebSocket implements WebSocket { final io.WebSocket _webSocket; final _events = StreamController(); - static Future connect(Uri uri) async { + static Future connect(Uri url, + {Iterable? protocols}) async { try { - final webSocket = await io.WebSocket.connect(uri.toString()); + final webSocket = + await io.WebSocket.connect(url.toString(), protocols: protocols); return IOWebSocket._(webSocket); } on io.WebSocketException catch (e) { throw WebSocketException(e.message); @@ -89,4 +91,9 @@ class IOWebSocket implements WebSocket { @override Stream get events => _events.stream; + + @override + String get protocol => _webSocket.protocol ?? ''; } + +const connect = IOWebSocket.connect; diff --git a/pkgs/web_socket/lib/src/web_socket.dart b/pkgs/web_socket/lib/src/web_socket.dart index dfd3486f00..e1b8ce885c 100644 --- a/pkgs/web_socket/lib/src/web_socket.dart +++ b/pkgs/web_socket/lib/src/web_socket.dart @@ -4,6 +4,10 @@ import 'dart:typed_data'; +import 'connect_stub.dart' + if (dart.library.js_interop) 'browser_web_socket.dart' + if (dart.library.io) 'io_web_socket.dart' as connector; + /// An event received from the peer through the [WebSocket]. sealed class WebSocketEvent {} @@ -90,12 +94,11 @@ class WebSocketConnectionClosed extends WebSocketException { /// The interface for WebSocket connections. /// /// ```dart -/// import 'package:web_socket/io_web_socket.dart'; /// import 'package:web_socket/src/web_socket.dart'; /// /// void main() async { /// final socket = -/// await IOWebSocket.connect(Uri.parse('wss://ws.postman-echo.com/raw')); +/// await WebSocket.connect(Uri.parse('wss://ws.postman-echo.com/raw')); /// /// socket.events.listen((e) async { /// switch (e) { @@ -112,6 +115,9 @@ class WebSocketConnectionClosed extends WebSocketException { /// socket.sendText('Hello Dart WebSockets! 🎉'); /// } abstract interface class WebSocket { + static Future connect(Uri url, {Iterable? protocols}) => + connector.connect(url, protocols: protocols); + /// Sends text data to the connected peer. /// /// Throws [WebSocketConnectionClosed] if the [WebSocket] is @@ -163,4 +169,6 @@ abstract interface class WebSocket { /// /// Errors will never appear in this [Stream]. Stream get events; + + String get protocol; } diff --git a/pkgs/web_socket/test/browser_web_socket_conformance_test.dart b/pkgs/web_socket/test/browser_web_socket_conformance_test.dart index caddff137c..2105a45508 100644 --- a/pkgs/web_socket/test/browser_web_socket_conformance_test.dart +++ b/pkgs/web_socket/test/browser_web_socket_conformance_test.dart @@ -10,5 +10,5 @@ import 'package:web_socket/browser_web_socket.dart'; import 'package:web_socket_conformance_tests/web_socket_conformance_tests.dart'; void main() { - testAll((uri, {protocols}) => BrowserWebSocket.connect(uri)); + testAll(BrowserWebSocket.connect); } diff --git a/pkgs/web_socket/test/io_web_socket_conformance_test.dart b/pkgs/web_socket/test/io_web_socket_conformance_test.dart index 9b3728ddd2..cc313a6a0d 100644 --- a/pkgs/web_socket/test/io_web_socket_conformance_test.dart +++ b/pkgs/web_socket/test/io_web_socket_conformance_test.dart @@ -10,5 +10,5 @@ import 'package:web_socket/io_web_socket.dart'; import 'package:web_socket_conformance_tests/web_socket_conformance_tests.dart'; void main() { - testAll((uri, {protocols}) => IOWebSocket.connect(uri)); + testAll(IOWebSocket.connect); } diff --git a/pkgs/web_socket/test/websocket_test.dart b/pkgs/web_socket/test/websocket_test.dart new file mode 100644 index 0000000000..859e4fe636 --- /dev/null +++ b/pkgs/web_socket/test/websocket_test.dart @@ -0,0 +1,10 @@ +// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:web_socket/web_socket.dart'; +import 'package:web_socket_conformance_tests/web_socket_conformance_tests.dart'; + +void main() { + testAll(WebSocket.connect); +} From 8a28891a15aa42d3dadf7b348dcc5208403b3805 Mon Sep 17 00:00:00 2001 From: Brian Quinlan Date: Tue, 5 Mar 2024 08:28:48 -0800 Subject: [PATCH 2/4] Remove protocol. --- pkgs/web_socket/example/web_socket_example.dart | 3 +-- pkgs/web_socket/lib/src/browser_web_socket.dart | 7 +------ pkgs/web_socket/lib/src/io_web_socket.dart | 6 +----- pkgs/web_socket/lib/src/web_socket.dart | 5 +++-- 4 files changed, 6 insertions(+), 15 deletions(-) diff --git a/pkgs/web_socket/example/web_socket_example.dart b/pkgs/web_socket/example/web_socket_example.dart index 27ab4569c1..423b2016ed 100644 --- a/pkgs/web_socket/example/web_socket_example.dart +++ b/pkgs/web_socket/example/web_socket_example.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'dart:io'; -import 'package:web_socket/io_web_socket.dart'; import 'package:web_socket/web_socket.dart'; const requestId = 305; @@ -11,7 +10,7 @@ void main() async { // Whitebit public WebSocket API documentation: // https://docs.whitebit.com/public/websocket/ final socket = - await IOWebSocket.connect(Uri.parse('wss://api.whitebit.com/ws')); + await WebSocket.connect(Uri.parse('wss://api.whitebit.com/ws')); socket.events.listen((e) { switch (e) { diff --git a/pkgs/web_socket/lib/src/browser_web_socket.dart b/pkgs/web_socket/lib/src/browser_web_socket.dart index a98afe9262..069f2781f0 100644 --- a/pkgs/web_socket/lib/src/browser_web_socket.dart +++ b/pkgs/web_socket/lib/src/browser_web_socket.dart @@ -20,9 +20,7 @@ class BrowserWebSocket implements WebSocket { static Future connect(Uri url, {Iterable? protocols}) async { - final webSocket = web.WebSocket(url.toString(), - protocols?.map((e) => e.toJS).toList().toJS ?? JSArray()) - ..binaryType = 'arraybuffer'; + final webSocket = web.WebSocket(url.toString())..binaryType = 'arraybuffer'; final browserSocket = BrowserWebSocket._(webSocket); final webSocketConnected = Completer(); @@ -128,9 +126,6 @@ class BrowserWebSocket implements WebSocket { @override Stream get events => _events.stream; - - @override - String get protocol => _webSocket.protocol; } const connect = BrowserWebSocket.connect; diff --git a/pkgs/web_socket/lib/src/io_web_socket.dart b/pkgs/web_socket/lib/src/io_web_socket.dart index 1fbd43c64e..b0bc3c7ea5 100644 --- a/pkgs/web_socket/lib/src/io_web_socket.dart +++ b/pkgs/web_socket/lib/src/io_web_socket.dart @@ -19,8 +19,7 @@ class IOWebSocket implements WebSocket { static Future connect(Uri url, {Iterable? protocols}) async { try { - final webSocket = - await io.WebSocket.connect(url.toString(), protocols: protocols); + final webSocket = await io.WebSocket.connect(url.toString()); return IOWebSocket._(webSocket); } on io.WebSocketException catch (e) { throw WebSocketException(e.message); @@ -91,9 +90,6 @@ class IOWebSocket implements WebSocket { @override Stream get events => _events.stream; - - @override - String get protocol => _webSocket.protocol ?? ''; } const connect = IOWebSocket.connect; diff --git a/pkgs/web_socket/lib/src/web_socket.dart b/pkgs/web_socket/lib/src/web_socket.dart index e1b8ce885c..8c8aa63a94 100644 --- a/pkgs/web_socket/lib/src/web_socket.dart +++ b/pkgs/web_socket/lib/src/web_socket.dart @@ -91,6 +91,9 @@ class WebSocketConnectionClosed extends WebSocketException { WebSocketConnectionClosed([super.message = 'Connection Closed']); } +typedef WebSocketConnector = Future Function(Uri url, + {Iterable? protocols}); + /// The interface for WebSocket connections. /// /// ```dart @@ -169,6 +172,4 @@ abstract interface class WebSocket { /// /// Errors will never appear in this [Stream]. Stream get events; - - String get protocol; } From 2f15f0390187d51a2ecbf819d63e374060cea83d Mon Sep 17 00:00:00 2001 From: Brian Quinlan Date: Tue, 5 Mar 2024 08:35:55 -0800 Subject: [PATCH 3/4] Remove factory --- pkgs/web_socket/lib/src/web_socket.dart | 3 --- 1 file changed, 3 deletions(-) diff --git a/pkgs/web_socket/lib/src/web_socket.dart b/pkgs/web_socket/lib/src/web_socket.dart index 8c8aa63a94..945fc57aed 100644 --- a/pkgs/web_socket/lib/src/web_socket.dart +++ b/pkgs/web_socket/lib/src/web_socket.dart @@ -91,9 +91,6 @@ class WebSocketConnectionClosed extends WebSocketException { WebSocketConnectionClosed([super.message = 'Connection Closed']); } -typedef WebSocketConnector = Future Function(Uri url, - {Iterable? protocols}); - /// The interface for WebSocket connections. /// /// ```dart From bdf16e17aa7358125866596e90946700055a5939 Mon Sep 17 00:00:00 2001 From: Brian Quinlan Date: Tue, 5 Mar 2024 08:46:34 -0800 Subject: [PATCH 4/4] Update connect_stub.dart --- pkgs/web_socket/lib/src/connect_stub.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkgs/web_socket/lib/src/connect_stub.dart b/pkgs/web_socket/lib/src/connect_stub.dart index 828a09dc63..3a420deeec 100644 --- a/pkgs/web_socket/lib/src/connect_stub.dart +++ b/pkgs/web_socket/lib/src/connect_stub.dart @@ -1,3 +1,7 @@ +// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + import '../web_socket.dart'; Future connect(Uri url, {Iterable? protocols}) {