From caad9caf5f62fc966c8d1632e4958d60dd43a000 Mon Sep 17 00:00:00 2001 From: Brian Quinlan Date: Thu, 4 Apr 2024 08:29:59 -0700 Subject: [PATCH] Create a `package:web_socket` `WebSocket` from `dart:io` `WebSocket` (#1173) --- pkgs/web_socket/CHANGELOG.md | 5 +++ pkgs/web_socket/lib/src/io_web_socket.dart | 4 ++ pkgs/web_socket/pubspec.yaml | 2 +- pkgs/web_socket/test/io_web_socket_test.dart | 40 ++++++++++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 pkgs/web_socket/test/io_web_socket_test.dart diff --git a/pkgs/web_socket/CHANGELOG.md b/pkgs/web_socket/CHANGELOG.md index 28b499a2f5..e0df6cbd19 100644 --- a/pkgs/web_socket/CHANGELOG.md +++ b/pkgs/web_socket/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.1.1 + +- Add the ability to create a `package:web_socket` `WebSocket` given a + `dart:io` `WebSocket`. + ## 0.1.0 - Basic functionality in place. diff --git a/pkgs/web_socket/lib/src/io_web_socket.dart b/pkgs/web_socket/lib/src/io_web_socket.dart index d44a33ecfa..5225c07bb9 100644 --- a/pkgs/web_socket/lib/src/io_web_socket.dart +++ b/pkgs/web_socket/lib/src/io_web_socket.dart @@ -49,6 +49,10 @@ class IOWebSocket implements WebSocket { return IOWebSocket._(webSocket); } + // Create an `IOWebSocket` from an existing `dart:io` `WebSocket`. + factory IOWebSocket.fromWebSocket(io.WebSocket webSocket) => + IOWebSocket._(webSocket); + IOWebSocket._(this._webSocket) { _webSocket.listen( (event) { diff --git a/pkgs/web_socket/pubspec.yaml b/pkgs/web_socket/pubspec.yaml index 78ec62ed26..1c341f7329 100644 --- a/pkgs/web_socket/pubspec.yaml +++ b/pkgs/web_socket/pubspec.yaml @@ -3,7 +3,7 @@ description: >- Any easy-to-use library for communicating with WebSockets that has multiple implementations. repository: https://github.com/dart-lang/http/tree/master/pkgs/web_socket -version: 0.1.0 +version: 0.1.1 environment: sdk: ^3.3.0 diff --git a/pkgs/web_socket/test/io_web_socket_test.dart b/pkgs/web_socket/test/io_web_socket_test.dart new file mode 100644 index 0000000000..a0ee671ddd --- /dev/null +++ b/pkgs/web_socket/test/io_web_socket_test.dart @@ -0,0 +1,40 @@ +// 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. + +@TestOn('vm') +library; + +import 'dart:io' as io; + +import 'package:test/test.dart'; +import 'package:web_socket/io_web_socket.dart'; +import 'package:web_socket/web_socket.dart'; + +void main() { + group('fromWebSocket', () { + late final io.HttpServer server; + late io.HttpHeaders headers; + late Uri uri; + + setUp(() async { + server = (await io.HttpServer.bind('localhost', 0)) + ..listen((request) async { + headers = request.headers; + await io.WebSocketTransformer.upgrade(request) + .then((webSocket) => webSocket.listen(webSocket.add)); + }); + uri = Uri.parse('ws://localhost:${server.port}'); + }); + + test('custom headers', () async { + final ws = IOWebSocket.fromWebSocket(await io.WebSocket.connect( + uri.toString(), + headers: {'fruit': 'apple'})); + expect(headers['fruit'], ['apple']); + ws.sendText('Hello World!'); + expect(await ws.events.first, TextDataReceived('Hello World!')); + await ws.close(); + }); + }); +}