Chromium Code Reviews| Index: runtime/bin/vmservice/client/lib/service_html.dart |
| diff --git a/runtime/bin/vmservice/client/lib/service_html.dart b/runtime/bin/vmservice/client/lib/service_html.dart |
| index bd611a55e666700ea0433804f6863a00e3fae4f5..1a892aa4d9b8860123f9d17c62223c7d57952a72 100644 |
| --- a/runtime/bin/vmservice/client/lib/service_html.dart |
| +++ b/runtime/bin/vmservice/client/lib/service_html.dart |
| @@ -50,8 +50,84 @@ class HttpVM extends VM { |
| } |
| } |
| +class WebSocketVM extends VM { |
| + final Map<int, Completer> _pendingRequests = |
| + new Map<int, Completer>(); |
| + int _requestSerial = 0; |
| + |
| + String _host; |
| + Future<WebSocket> _socketFuture; |
| + |
| + bool runningInJavaScript() => identical(1.0, 1); |
| + |
| + WebSocketVM() : super() { |
| + if (runningInJavaScript()) { |
| + // When we are running as JavaScript use the same hostname:port |
| + // that the Observatory is loaded from. |
| + _host = 'ws://${window.location.host}/ws'; |
| + } else { |
| + // Otherwise, assume we are running from the Dart Editor and |
| + // want to connect on the default port. |
| + _host = 'ws://127.0.0.1:8181/ws'; |
| + } |
| + |
| + var completer = new Completer<WebSocket>(); |
| + _socketFuture = completer.future; |
| + var socket = new WebSocket(_host); |
| + socket.onOpen.first.then((_) { |
| + socket.onMessage.listen(_handleMessage); |
| + socket.onClose.first.then((_) { |
| + _socketFuture = null; |
| + }); |
| + completer.complete(socket); |
| + }); |
| + socket.onError.first.then((_) { |
| + _socketFuture = null; |
| + }); |
| + } |
| + |
| + void _handleMessage(MessageEvent event) { |
| + var map = JSON.decode(event.data); |
| + int seq = map['seq']; |
| + var response = map['response']; |
| + var completer = _pendingRequests.remove(seq); |
| + if (completer == null) { |
| + Logger.root.severe('Received unexpected message: ${map}'); |
| + } else { |
| + completer.complete(response); |
| + } |
| + } |
| + |
| + Future<String> getString(String id) { |
| + if (_socketFuture == null) { |
| + var errorResponse = JSON.encode({ |
| + 'type': 'ServiceException', |
| + 'id': '', |
| + 'response': '', |
| + 'kind': 'NetworkException', |
| + 'message': 'Could not connect to service. Check that you started the' |
| + ' VM with the following flags:\n --enable-vm-service' |
|
Cutch
2014/05/28 19:31:48
We have a new flag:
--observe which is an alias f
|
| + ' --pause-isolates-on-exit' |
| + }); |
| + return new Future.value(errorResponse); |
| + } |
| + return _socketFuture.then((socket) { |
| + int seq = _requestSerial++; |
| + if (!id.endsWith('/profile/tag')) { |
| + Logger.root.info('Fetching $id from $_host'); |
| + } |
| + var completer = new Completer<String>(); |
| + _pendingRequests[seq] = completer; |
| + var message = JSON.encode({'seq': seq, 'request': id}); |
| + socket.send(message); |
| + return completer.future; |
| + }); |
| + } |
| +} |
| + |
| class DartiumVM extends VM { |
| - final Map _outstandingRequests = new Map(); |
| + final Map<String, Completer> _pendingRequests = |
| + new Map<String, Completer>(); |
| int _requestSerial = 0; |
| DartiumVM() : super() { |
| @@ -66,9 +142,9 @@ class DartiumVM extends VM { |
| if (name != 'observatoryData') { |
| return; |
| } |
| - var completer = _outstandingRequests[id]; |
| + var completer = _pendingRequests[id]; |
| assert(completer != null); |
| - _outstandingRequests.remove(id); |
| + _pendingRequests.remove(id); |
| completer.complete(data); |
| } |
| @@ -80,7 +156,7 @@ class DartiumVM extends VM { |
| message['query'] = '/$path'; |
| _requestSerial++; |
| var completer = new Completer(); |
| - _outstandingRequests[idString] = completer; |
| + _pendingRequests[idString] = completer; |
| window.parent.postMessage(JSON.encode(message), '*'); |
| return completer.future; |
| } |