OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library service_common; | 5 library service_common; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:convert'; | 8 import 'dart:convert'; |
9 import 'dart:typed_data'; | 9 import 'dart:typed_data'; |
10 | 10 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 'networkAddress': networkAddress, | 51 'networkAddress': networkAddress, |
52 }; | 52 }; |
53 } | 53 } |
54 } | 54 } |
55 | 55 |
56 class _WebSocketRequest { | 56 class _WebSocketRequest { |
57 final String method; | 57 final String method; |
58 final Map params; | 58 final Map params; |
59 final Completer<String> completer; | 59 final Completer<String> completer; |
60 | 60 |
61 _WebSocketRequest.old(this.method) | 61 _WebSocketRequest(this.method, this.params) |
62 : params = null, completer = new Completer<String>(); | |
63 | |
64 _WebSocketRequest.rpc(this.method, this.params) | |
65 : completer = new Completer<String>(); | 62 : completer = new Completer<String>(); |
66 } | 63 } |
67 | 64 |
68 /// Minimal common interface for 'WebSocket' in [dart:io] and [dart:html]. | 65 /// Minimal common interface for 'WebSocket' in [dart:io] and [dart:html]. |
69 abstract class CommonWebSocket { | 66 abstract class CommonWebSocket { |
70 void connect(String address, | 67 void connect(String address, |
71 void onOpen(), | 68 void onOpen(), |
72 void onMessage(dynamic data), | 69 void onMessage(dynamic data), |
73 void onError(), | 70 void onError(), |
74 void onClose()); | 71 void onClose()); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 Future get onDisconnect => _disconnected.future; | 118 Future get onDisconnect => _disconnected.future; |
122 | 119 |
123 void disconnect() { | 120 void disconnect() { |
124 if (_hasInitiatedConnect) { | 121 if (_hasInitiatedConnect) { |
125 _webSocket.close(); | 122 _webSocket.close(); |
126 } | 123 } |
127 _cancelAllRequests(); | 124 _cancelAllRequests(); |
128 _notifyDisconnect(); | 125 _notifyDisconnect(); |
129 } | 126 } |
130 | 127 |
131 Future<String> getStringDeprecated(String id) { | |
132 if (!_hasInitiatedConnect) { | |
133 _hasInitiatedConnect = true; | |
134 _webSocket.connect( | |
135 target.networkAddress, _onOpen, _onMessage, _onError, _onClose); | |
136 } | |
137 return _makeRequest(id); | |
138 } | |
139 | |
140 /// Add a request for [id] to pending requests. | |
141 Future<String> _makeRequest(String id) { | |
142 assert(_hasInitiatedConnect); | |
143 // Create request. | |
144 String serial = (_requestSerial++).toString(); | |
145 var request = new _WebSocketRequest.old(id); | |
146 if (_webSocket.isOpen) { | |
147 // Already connected, send request immediately. | |
148 _sendRequest(serial, request); | |
149 } else { | |
150 // Not connected yet, add to delayed requests. | |
151 _delayedRequests[serial] = request; | |
152 } | |
153 return request.completer.future; | |
154 } | |
155 | |
156 Future<String> invokeRpcRaw(String method, Map params) { | 128 Future<String> invokeRpcRaw(String method, Map params) { |
157 if (!_hasInitiatedConnect) { | 129 if (!_hasInitiatedConnect) { |
158 _hasInitiatedConnect = true; | 130 _hasInitiatedConnect = true; |
159 _webSocket.connect( | 131 _webSocket.connect( |
160 target.networkAddress, _onOpen, _onMessage, _onError, _onClose); | 132 target.networkAddress, _onOpen, _onMessage, _onError, _onClose); |
161 } | 133 } |
162 String serial = (_requestSerial++).toString(); | 134 String serial = (_requestSerial++).toString(); |
163 var request = new _WebSocketRequest.rpc(method, params); | 135 var request = new _WebSocketRequest(method, params); |
164 if (_webSocket.isOpen) { | 136 if (_webSocket.isOpen) { |
165 // Already connected, send request immediately. | 137 // Already connected, send request immediately. |
166 _sendRequest(serial, request); | 138 _sendRequest(serial, request); |
167 } else { | 139 } else { |
168 // Not connected yet, add to delayed requests. | 140 // Not connected yet, add to delayed requests. |
169 _delayedRequests[serial] = request; | 141 _delayedRequests[serial] = request; |
170 } | 142 } |
171 return request.completer.future; | 143 return request.completer.future; |
172 } | 144 } |
173 | 145 |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 Logger.root.info('Sending all delayed requests.'); | 254 Logger.root.info('Sending all delayed requests.'); |
283 // Send all delayed requests. | 255 // Send all delayed requests. |
284 _delayedRequests.forEach(_sendRequest); | 256 _delayedRequests.forEach(_sendRequest); |
285 // Clear all delayed requests. | 257 // Clear all delayed requests. |
286 _delayedRequests.clear(); | 258 _delayedRequests.clear(); |
287 } | 259 } |
288 | 260 |
289 /// Send the request over WebSocket. | 261 /// Send the request over WebSocket. |
290 void _sendRequest(String serial, _WebSocketRequest request) { | 262 void _sendRequest(String serial, _WebSocketRequest request) { |
291 assert (_webSocket.isOpen); | 263 assert (_webSocket.isOpen); |
292 if (request.method != 'getTagProfile') { | 264 if (request.method != 'getTagProfile' && |
| 265 request.method != 'getIsolateMetric' && |
| 266 request.method != 'getVMMetric') { |
293 Logger.root.info('GET ${request.method} from ${target.networkAddress}'); | 267 Logger.root.info('GET ${request.method} from ${target.networkAddress}'); |
294 } | 268 } |
295 // Mark request as pending. | 269 // Mark request as pending. |
296 assert(_pendingRequests.containsKey(serial) == false); | 270 assert(_pendingRequests.containsKey(serial) == false); |
297 _pendingRequests[serial] = request; | 271 _pendingRequests[serial] = request; |
298 var message; | 272 var message; |
299 // Encode message. | 273 // Encode message. |
300 if (target.chrome) { | 274 if (target.chrome) { |
301 message = JSON.encode({ | 275 message = JSON.encode({ |
302 'id': int.parse(serial), | 276 'id': int.parse(serial), |
303 'method': 'Dart.observatoryQuery', | 277 'method': 'Dart.observatoryQuery', |
304 'params': { | 278 'params': { |
305 'id': serial, | 279 'id': serial, |
306 'query': request.method | 280 'query': request.method |
307 } | 281 } |
308 }); | 282 }); |
309 } else { | 283 } else { |
310 message = JSON.encode({'id': serial, | 284 message = JSON.encode({'id': serial, |
311 'method': request.method, | 285 'method': request.method, |
312 'params': request.params}); | 286 'params': request.params}); |
313 } | 287 } |
314 // Send message. | 288 // Send message. |
315 _webSocket.send(message); | 289 _webSocket.send(message); |
316 } | 290 } |
317 } | 291 } |
OLD | NEW |