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

Side by Side Diff: sdk/lib/vmservice/message.dart

Issue 2980733003: Introduced support for external services registration in the ServiceProtocol (Closed)
Patch Set: Address comments Created 3 years, 5 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 unified diff | Download patch
« no previous file with comments | « sdk/lib/vmservice/client.dart ('k') | sdk/lib/vmservice/message_router.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 part of dart._vmservice; 5 part of dart._vmservice;
6 6
7 enum MessageType { Request, Notification, Response }
8
7 class Message { 9 class Message {
8 final Completer _completer = new Completer.sync(); 10 final Completer _completer = new Completer.sync();
9 bool get completed => _completer.isCompleted; 11 bool get completed => _completer.isCompleted;
10 12
11 /// Future of response. 13 /// Future of response.
12 Future<String> get response => _completer.future; 14 Future<String> get response => _completer.future;
13 Client client; 15 Client client;
14 16
17 // Is a notification message (no serial)
18 final MessageType type;
19
15 // Client-side identifier for this message. 20 // Client-side identifier for this message.
16 final serial; 21 final serial;
17 22
18 // In new messages. 23 // In new messages.
19 final String method; 24 final String method;
20 25
21 // In old messages. 26 // In old messages.
22 final List path = new List(); 27 final List path = new List();
23 28
24 final Map params = new Map(); 29 final Map params = new Map();
30 final Map result = new Map();
31 final Map error = new Map();
25 32
26 void _setPath(List<String> pathSegments) { 33 void _setPath(List<String> pathSegments) {
27 if (pathSegments == null) { 34 if (pathSegments == null) {
28 return; 35 return;
29 } 36 }
30 pathSegments.forEach((String segment) { 37 pathSegments.forEach((String segment) {
31 if (segment == null || segment == '') { 38 if (segment == null || segment == '') {
32 return; 39 return;
33 } 40 }
34 path.add(segment); 41 path.add(segment);
35 }); 42 });
36 } 43 }
37 44
38 Message.fromJsonRpc(this.client, Map map) 45 factory Message.fromJsonRpc(Client client, Map map) {
39 : serial = map['id'], 46 if (map.containsKey('id')) {
47 final id = map['id'];
48 if (id != null && id is! num && id is! String) {
49 throw new Exception('"id" must be a number, string, or null.');
50 }
51 if (map.containsKey('method')) {
52 return new Message._fromJsonRpcRequest(client, map);
53 }
54 if (map.containsKey('result')) {
55 return new Message._fromJsonRpcResult(client, map);
56 }
57 if (map.containsKey('error')) {
58 return new Message._fromJsonRpcError(client, map);
59 }
60 } else if (map.containsKey('method')) {
61 return new Message._fromJsonRpcNotification(client, map);
62 }
63 throw new Exception('Invalid message format');
64 }
65
66 // http://www.jsonrpc.org/specification#request_object
67 Message._fromJsonRpcRequest(Client client, Map map)
68 : client = client,
69 type = MessageType.Request,
70 serial = map['id'],
40 method = map['method'] { 71 method = map['method'] {
41 if (map['params'] != null) { 72 if (map['params'] != null) {
42 params.addAll(map['params']); 73 params.addAll(map['params']);
43 } 74 }
44 } 75 }
45 76
77 // http://www.jsonrpc.org/specification#notification
78 Message._fromJsonRpcNotification(Client client, Map map)
79 : client = client,
80 type = MessageType.Notification,
81 method = map['method'],
82 serial = null {
83 if (map['params'] != null) {
84 params.addAll(map['params']);
85 }
86 }
87
88 // http://www.jsonrpc.org/specification#response_object
89 Message._fromJsonRpcResult(Client client, Map map)
90 : client = client,
91 type = MessageType.Response,
92 serial = map['id'],
93 method = null {
94 result.addAll(map['result']);
95 }
96
97 // http://www.jsonrpc.org/specification#response_object
98 Message._fromJsonRpcError(Client client, Map map)
99 : client = client,
100 type = MessageType.Response,
101 serial = map['id'],
102 method = null {
103 error.addAll(map['error']);
104 }
105
46 static String _methodNameFromUri(Uri uri) { 106 static String _methodNameFromUri(Uri uri) {
47 if (uri == null) { 107 if (uri == null) {
48 return ''; 108 return '';
49 } 109 }
50 if (uri.pathSegments.length == 0) { 110 if (uri.pathSegments.length == 0) {
51 return ''; 111 return '';
52 } 112 }
53 return uri.pathSegments[0]; 113 return uri.pathSegments[0];
54 } 114 }
55 115
56 Message.forMethod(String method) 116 Message.forMethod(String method)
57 : client = null, 117 : client = null,
58 method = method, 118 method = method,
119 type = MessageType.Request,
59 serial = ''; 120 serial = '';
60 121
61 Message.fromUri(this.client, Uri uri) 122 Message.fromUri(this.client, Uri uri)
62 : serial = '', 123 : type = MessageType.Request,
124 serial = '',
63 method = _methodNameFromUri(uri) { 125 method = _methodNameFromUri(uri) {
64 params.addAll(uri.queryParameters); 126 params.addAll(uri.queryParameters);
65 } 127 }
66 128
67 Message.forIsolate(this.client, Uri uri, RunningIsolate isolate) 129 Message.forIsolate(this.client, Uri uri, RunningIsolate isolate)
68 : serial = '', 130 : type = MessageType.Request,
131 serial = '',
69 method = _methodNameFromUri(uri) { 132 method = _methodNameFromUri(uri) {
70 params.addAll(uri.queryParameters); 133 params.addAll(uri.queryParameters);
71 params['isolateId'] = isolate.serviceId; 134 params['isolateId'] = isolate.serviceId;
72 } 135 }
73 136
74 Uri toUri() { 137 Uri toUri() {
75 return new Uri(path: method, queryParameters: params); 138 return new Uri(path: method, queryParameters: params);
76 } 139 }
77 140
78 dynamic toJson() { 141 dynamic toJson() {
79 return {'path': path, 'params': params}; 142 return {'path': path, 'params': params};
80 } 143 }
81 144
145 dynamic forwardToJson([Map overloads]) {
146 var json = {'jsonrpc': '2.0', 'id': serial};
147 switch (type) {
148 case MessageType.Request:
149 case MessageType.Notification:
150 json['method'] = method;
151 if (params.isNotEmpty) {
152 json['params'] = params;
153 }
154 break;
155 case MessageType.Response:
156 if (result.isNotEmpty) {
157 json['result'] = result;
158 }
159 if (error.isNotEmpty) {
160 json['error'] = error;
161 }
162 }
163 if (overloads != null) {
164 json.addAll(overloads);
165 }
166 return json;
167 }
168
82 // Calls toString on all non-String elements of [list]. We do this so all 169 // Calls toString on all non-String elements of [list]. We do this so all
83 // elements in the list are strings, making consumption by C++ simpler. 170 // elements in the list are strings, making consumption by C++ simpler.
84 // This has a side effect that boolean literal values like true become 'true' 171 // This has a side effect that boolean literal values like true become 'true'
85 // and thus indistinguishable from the string literal 'true'. 172 // and thus indistinguishable from the string literal 'true'.
86 List _makeAllString(List list) { 173 List _makeAllString(List list) {
87 if (list == null) { 174 if (list == null) {
88 return null; 175 return null;
89 } 176 }
90 for (var i = 0; i < list.length; i++) { 177 for (var i = 0; i < list.length; i++) {
91 if (list[i] is String) { 178 if (list[i] is String) {
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 } 275 }
189 } 276 }
190 277
191 bool sendIsolateServiceMessage(SendPort sp, List m) 278 bool sendIsolateServiceMessage(SendPort sp, List m)
192 native "VMService_SendIsolateServiceMessage"; 279 native "VMService_SendIsolateServiceMessage";
193 280
194 void sendRootServiceMessage(List m) native "VMService_SendRootServiceMessage"; 281 void sendRootServiceMessage(List m) native "VMService_SendRootServiceMessage";
195 282
196 void sendObjectRootServiceMessage(List m) 283 void sendObjectRootServiceMessage(List m)
197 native "VMService_SendObjectRootServiceMessage"; 284 native "VMService_SendObjectRootServiceMessage";
OLDNEW
« no previous file with comments | « sdk/lib/vmservice/client.dart ('k') | sdk/lib/vmservice/message_router.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698