From 1f34c30ff951c69ecf0df2f62868a44480f864ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Sinan=20A=C4=9Facan?= Date: Thu, 30 Nov 2023 09:46:41 +0100 Subject: [PATCH 1/9] Fix JS value to Dart conversion when receiving from a web socket --- lib/html.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/html.dart b/lib/html.dart index 82edd2d..c7dbbf8 100644 --- a/lib/html.dart +++ b/lib/html.dart @@ -127,13 +127,13 @@ class HtmlWebSocketChannel extends StreamChannelMixin } void _innerListen(MessageEvent event) { - final eventData = event.data; + final JSAny? eventData = event.data; Object? data; if (eventData.typeofEquals('object') && (eventData as JSObject).instanceOfString('ArrayBuffer')) { data = (eventData as JSArrayBuffer).toDart.asUint8List(); } else { - data = event.data; + data = event.data.dartify(); } _controller.local.sink.add(data); } From 78387a6328716fb7997070890aaa9f1959bcbfc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Sinan=20A=C4=9Facan?= Date: Thu, 30 Nov 2023 10:35:08 +0100 Subject: [PATCH 2/9] Address comment --- lib/html.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/html.dart b/lib/html.dart index c7dbbf8..e43427a 100644 --- a/lib/html.dart +++ b/lib/html.dart @@ -133,7 +133,7 @@ class HtmlWebSocketChannel extends StreamChannelMixin (eventData as JSObject).instanceOfString('ArrayBuffer')) { data = (eventData as JSArrayBuffer).toDart.asUint8List(); } else { - data = event.data.dartify(); + data = eventData.dartify(); } _controller.local.sink.add(data); } From 1916b79cab8600082982d9080e5f91b69db55679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Sinan=20A=C4=9Facan?= Date: Thu, 30 Nov 2023 10:48:33 +0100 Subject: [PATCH 3/9] Remove type annotation --- lib/html.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/html.dart b/lib/html.dart index e43427a..5d2a528 100644 --- a/lib/html.dart +++ b/lib/html.dart @@ -127,7 +127,7 @@ class HtmlWebSocketChannel extends StreamChannelMixin } void _innerListen(MessageEvent event) { - final JSAny? eventData = event.data; + final eventData = event.data; Object? data; if (eventData.typeofEquals('object') && (eventData as JSObject).instanceOfString('ArrayBuffer')) { From 10ec2cab099fe5a959905981e7fc43436da3d69c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Sinan=20A=C4=9Facan?= Date: Thu, 30 Nov 2023 11:30:10 +0100 Subject: [PATCH 4/9] Update byte buffer to uint8list conversion --- lib/html.dart | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/html.dart b/lib/html.dart index 5d2a528..0dc047c 100644 --- a/lib/html.dart +++ b/lib/html.dart @@ -127,13 +127,9 @@ class HtmlWebSocketChannel extends StreamChannelMixin } void _innerListen(MessageEvent event) { - final eventData = event.data; - Object? data; - if (eventData.typeofEquals('object') && - (eventData as JSObject).instanceOfString('ArrayBuffer')) { - data = (eventData as JSArrayBuffer).toDart.asUint8List(); - } else { - data = eventData.dartify(); + var data = event.data.dartify(); + if (data is ByteBuffer) { + data = data.asUint8List(); } _controller.local.sink.add(data); } From 3bdf975244363bb1803d313712d7aea7359c1e60 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 30 Nov 2023 18:47:00 -0800 Subject: [PATCH 5/9] Add fix to allow tests to pass with Wasm! --- test/html_test.dart | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/test/html_test.dart b/test/html_test.dart index 9d91025..e135b72 100644 --- a/test/html_test.dart +++ b/test/html_test.dart @@ -10,12 +10,19 @@ import 'dart:js_interop'; import 'dart:typed_data'; import 'package:async/async.dart'; +import 'package:stream_channel/stream_channel.dart'; import 'package:test/test.dart'; import 'package:web/helpers.dart' hide BinaryType; import 'package:web_socket_channel/html.dart'; import 'package:web_socket_channel/src/web_helpers.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; +extension on StreamChannel { + /// Handles the WASM case where the runtime type is actually [double] instead + /// of the JS case where it's [int]. + Future get firstAsInt async => ((await stream.first) as num).toInt(); +} + void main() { late int port; setUpAll(() async { @@ -35,7 +42,7 @@ void main() { } ''', stayAlive: true); - port = await channel.stream.first as int; + port = await channel.firstAsInt; }); test('communicates using an existing WebSocket', () async { @@ -169,7 +176,7 @@ void main() { // TODO(nweiz): Make this channel use a port number that's guaranteed to be // invalid. final channel = HtmlWebSocketChannel.connect( - 'ws://localhost:${await serverChannel.stream.first}'); + 'ws://localhost:${await serverChannel.firstAsInt}'); expect(channel.ready, throwsA(isA())); expect(channel.stream.toList(), throwsA(isA())); }); From 28b48f20ca0a331d3826a6bdff576fa558a18b64 Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Thu, 30 Nov 2023 18:49:54 -0800 Subject: [PATCH 6/9] oops --- test/html_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/html_test.dart b/test/html_test.dart index e135b72..2454e44 100644 --- a/test/html_test.dart +++ b/test/html_test.dart @@ -19,7 +19,7 @@ import 'package:web_socket_channel/web_socket_channel.dart'; extension on StreamChannel { /// Handles the WASM case where the runtime type is actually [double] instead - /// of the JS case where it's [int]. + /// of the JS case where its [int]. Future get firstAsInt async => ((await stream.first) as num).toInt(); } From 08fdebf62f364083f8a1f962b7bb9cb447f79226 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Sinan=20A=C4=9Facan?= Date: Fri, 1 Dec 2023 09:23:04 +0100 Subject: [PATCH 7/9] Fix Wasm spelling --- test/html_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/html_test.dart b/test/html_test.dart index 2454e44..69f0cd9 100644 --- a/test/html_test.dart +++ b/test/html_test.dart @@ -18,7 +18,7 @@ import 'package:web_socket_channel/src/web_helpers.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; extension on StreamChannel { - /// Handles the WASM case where the runtime type is actually [double] instead + /// Handles the Wasm case where the runtime type is actually [double] instead /// of the JS case where its [int]. Future get firstAsInt async => ((await stream.first) as num).toInt(); } From a5011a266f2d66ae413f328058a3cb8fcf738f14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Sinan=20A=C4=9Facan?= Date: Fri, 8 Dec 2023 09:59:38 +0100 Subject: [PATCH 8/9] Update conversion --- lib/html.dart | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/html.dart b/lib/html.dart index 0dc047c..166dfc0 100644 --- a/lib/html.dart +++ b/lib/html.dart @@ -127,9 +127,17 @@ class HtmlWebSocketChannel extends StreamChannelMixin } void _innerListen(MessageEvent event) { - var data = event.data.dartify(); - if (data is ByteBuffer) { - data = data.asUint8List(); + // Event data will be ArrayBuffer, Blob, or String. + final eventData = event.data; + final Object? data; + if (eventData.typeofEquals('string')) { + data = (eventData as JSString).toDart; + } else if (eventData.typeofEquals('object') && + (eventData as JSObject).instanceOfString('ArrayBuffer')) { + data = (eventData as JSArrayBuffer).toDart; + } else { + // Blobs are passed directly. + data = eventData; } _controller.local.sink.add(data); } From 31db3746c56f6cb40dd48e4fec77d78fc1c62080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Sinan=20A=C4=9Facan?= Date: Fri, 8 Dec 2023 10:36:43 +0100 Subject: [PATCH 9/9] Convert ArrayBuffer to Uint8List --- lib/html.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/html.dart b/lib/html.dart index 166dfc0..5446b67 100644 --- a/lib/html.dart +++ b/lib/html.dart @@ -134,7 +134,7 @@ class HtmlWebSocketChannel extends StreamChannelMixin data = (eventData as JSString).toDart; } else if (eventData.typeofEquals('object') && (eventData as JSObject).instanceOfString('ArrayBuffer')) { - data = (eventData as JSArrayBuffer).toDart; + data = (eventData as JSArrayBuffer).toDart.asUint8List(); } else { // Blobs are passed directly. data = eventData;