Skip to content

Commit e71e739

Browse files
authored
Add WebSocket.connect as a cross-platform connection method (#1149)
1 parent f14b5aa commit e71e739

9 files changed

+40
-11
lines changed

pkgs/web_socket/README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,11 @@ implementations.
77
## Using
88

99
```dart
10-
import 'package:web_socket/io_web_socket.dart';
1110
import 'package:web_socket/web_socket.dart';
1211
1312
void main() async {
1413
final socket =
15-
await IOWebSocket.connect(Uri.parse('wss://ws.postman-echo.com/raw'));
14+
await WebSocket.connect(Uri.parse('wss://ws.postman-echo.com/raw'));
1615
1716
socket.events.listen((e) async {
1817
switch (e) {

pkgs/web_socket/example/web_socket_example.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import 'dart:convert';
22
import 'dart:io';
33

4-
import 'package:web_socket/io_web_socket.dart';
54
import 'package:web_socket/web_socket.dart';
65

76
const requestId = 305;
@@ -11,7 +10,7 @@ void main() async {
1110
// Whitebit public WebSocket API documentation:
1211
// https://docs.whitebit.com/public/websocket/
1312
final socket =
14-
await IOWebSocket.connect(Uri.parse('wss://api.whitebit.com/ws'));
13+
await WebSocket.connect(Uri.parse('wss://api.whitebit.com/ws'));
1514

1615
socket.events.listen((e) {
1716
switch (e) {

pkgs/web_socket/lib/src/browser_web_socket.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ class BrowserWebSocket implements WebSocket {
1818
final web.WebSocket _webSocket;
1919
final _events = StreamController<WebSocketEvent>();
2020

21-
static Future<BrowserWebSocket> connect(Uri url) async {
21+
static Future<BrowserWebSocket> connect(Uri url,
22+
{Iterable<String>? protocols}) async {
2223
final webSocket = web.WebSocket(url.toString())..binaryType = 'arraybuffer';
2324
final browserSocket = BrowserWebSocket._(webSocket);
2425
final webSocketConnected = Completer<BrowserWebSocket>();
@@ -126,3 +127,5 @@ class BrowserWebSocket implements WebSocket {
126127
@override
127128
Stream<WebSocketEvent> get events => _events.stream;
128129
}
130+
131+
const connect = BrowserWebSocket.connect;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import '../web_socket.dart';
6+
7+
Future<WebSocket> connect(Uri url, {Iterable<String>? protocols}) {
8+
throw UnsupportedError('Cannot connect without dart:js_interop or dart:io.');
9+
}

pkgs/web_socket/lib/src/io_web_socket.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@ class IOWebSocket implements WebSocket {
1616
final io.WebSocket _webSocket;
1717
final _events = StreamController<WebSocketEvent>();
1818

19-
static Future<IOWebSocket> connect(Uri uri) async {
19+
static Future<IOWebSocket> connect(Uri url,
20+
{Iterable<String>? protocols}) async {
2021
try {
21-
final webSocket = await io.WebSocket.connect(uri.toString());
22+
final webSocket = await io.WebSocket.connect(url.toString());
2223
return IOWebSocket._(webSocket);
2324
} on io.WebSocketException catch (e) {
2425
throw WebSocketException(e.message);
@@ -90,3 +91,5 @@ class IOWebSocket implements WebSocket {
9091
@override
9192
Stream<WebSocketEvent> get events => _events.stream;
9293
}
94+
95+
const connect = IOWebSocket.connect;

pkgs/web_socket/lib/src/web_socket.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44

55
import 'dart:typed_data';
66

7+
import 'connect_stub.dart'
8+
if (dart.library.js_interop) 'browser_web_socket.dart'
9+
if (dart.library.io) 'io_web_socket.dart' as connector;
10+
711
/// An event received from the peer through the [WebSocket].
812
sealed class WebSocketEvent {}
913

@@ -90,12 +94,11 @@ class WebSocketConnectionClosed extends WebSocketException {
9094
/// The interface for WebSocket connections.
9195
///
9296
/// ```dart
93-
/// import 'package:web_socket/io_web_socket.dart';
9497
/// import 'package:web_socket/src/web_socket.dart';
9598
///
9699
/// void main() async {
97100
/// final socket =
98-
/// await IOWebSocket.connect(Uri.parse('wss://ws.postman-echo.com/raw'));
101+
/// await WebSocket.connect(Uri.parse('wss://ws.postman-echo.com/raw'));
99102
///
100103
/// socket.events.listen((e) async {
101104
/// switch (e) {
@@ -112,6 +115,9 @@ class WebSocketConnectionClosed extends WebSocketException {
112115
/// socket.sendText('Hello Dart WebSockets! 🎉');
113116
/// }
114117
abstract interface class WebSocket {
118+
static Future<WebSocket> connect(Uri url, {Iterable<String>? protocols}) =>
119+
connector.connect(url, protocols: protocols);
120+
115121
/// Sends text data to the connected peer.
116122
///
117123
/// Throws [WebSocketConnectionClosed] if the [WebSocket] is

pkgs/web_socket/test/browser_web_socket_conformance_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ import 'package:web_socket/browser_web_socket.dart';
1010
import 'package:web_socket_conformance_tests/web_socket_conformance_tests.dart';
1111

1212
void main() {
13-
testAll((uri, {protocols}) => BrowserWebSocket.connect(uri));
13+
testAll(BrowserWebSocket.connect);
1414
}

pkgs/web_socket/test/io_web_socket_conformance_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ import 'package:web_socket/io_web_socket.dart';
1010
import 'package:web_socket_conformance_tests/web_socket_conformance_tests.dart';
1111

1212
void main() {
13-
testAll((uri, {protocols}) => IOWebSocket.connect(uri));
13+
testAll(IOWebSocket.connect);
1414
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:web_socket/web_socket.dart';
6+
import 'package:web_socket_conformance_tests/web_socket_conformance_tests.dart';
7+
8+
void main() {
9+
testAll(WebSocket.connect);
10+
}

0 commit comments

Comments
 (0)