| Index: runtime/bin/vmservice/observatory/lib/service_common.dart
|
| ===================================================================
|
| --- runtime/bin/vmservice/observatory/lib/service_common.dart (revision 39216)
|
| +++ runtime/bin/vmservice/observatory/lib/service_common.dart (working copy)
|
| @@ -6,6 +6,7 @@
|
|
|
| import 'dart:async';
|
| import 'dart:convert';
|
| +import 'dart:typed_data';
|
|
|
| import 'package:logging/logging.dart';
|
| import 'package:observatory/service.dart';
|
| @@ -69,6 +70,7 @@
|
| bool get isOpen;
|
| void send(dynamic data);
|
| void close();
|
| + Future<ByteData> nonStringToByteData(dynamic data);
|
| }
|
|
|
| /// A [CommonWebSocketVM] communicates with a Dart VM over a CommonWebSocket.
|
| @@ -160,7 +162,21 @@
|
|
|
| // WebSocket message event handler.
|
| void _onMessage(dynamic data) {
|
| - assert(data is String); // We don't handle binary data, yet.
|
| + if (data is! String) {
|
| + _webSocket.nonStringToByteData(data).then((ByteData bytes) {
|
| + // See format spec. in VMs Service::SendEvent.
|
| + int offset = 0;
|
| + int metaSize = bytes.getUint64(offset, Endianness.BIG_ENDIAN);
|
| + offset += 8;
|
| + var meta = new Utf8Decoder().convert(new Uint8List.view(
|
| + bytes.buffer, bytes.offsetInBytes + offset, metaSize));
|
| + offset += metaSize;
|
| + var data = new ByteData.view(
|
| + bytes.buffer, bytes.offsetInBytes + offset);
|
| + postEventMessage(meta, data);
|
| + });
|
| + return;
|
| + }
|
| var map = JSON.decode(data);
|
| if (map == null) {
|
| Logger.root.severe('WebSocketVM got empty message');
|
|
|