Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(241)

Unified Diff: runtime/bin/vmservice/client/lib/service_html.dart

Issue 305603004: Observatory now uses websockets to communicate with the vm. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
}

Powered by Google App Engine
This is Rietveld 408576698