diff --git a/lib/html.dart b/lib/html.dart index 82edd2d..5446b67 100644 --- a/lib/html.dart +++ b/lib/html.dart @@ -127,13 +127,17 @@ class HtmlWebSocketChannel extends StreamChannelMixin } void _innerListen(MessageEvent event) { + // Event data will be ArrayBuffer, Blob, or String. final eventData = event.data; - Object? data; - if (eventData.typeofEquals('object') && + 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.asUint8List(); } else { - data = event.data; + // Blobs are passed directly. + data = eventData; } _controller.local.sink.add(data); } diff --git a/test/html_test.dart b/test/html_test.dart index 9d91025..69f0cd9 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 its [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())); });