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

Unified 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 side-by-side diff with in-line comments
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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/vmservice/message.dart
diff --git a/sdk/lib/vmservice/message.dart b/sdk/lib/vmservice/message.dart
index a86dc388aeacd29cfaf585e18d429bc1c1bcc7a2..2bedfc10ddea56f6f4037f5a8c8247ce0321cfbe 100644
--- a/sdk/lib/vmservice/message.dart
+++ b/sdk/lib/vmservice/message.dart
@@ -4,6 +4,8 @@
part of dart._vmservice;
+enum MessageType { Request, Notification, Response }
+
class Message {
final Completer _completer = new Completer.sync();
bool get completed => _completer.isCompleted;
@@ -12,6 +14,9 @@ class Message {
Future<String> get response => _completer.future;
Client client;
+ // Is a notification message (no serial)
+ final MessageType type;
+
// Client-side identifier for this message.
final serial;
@@ -22,6 +27,8 @@ class Message {
final List path = new List();
final Map params = new Map();
+ final Map result = new Map();
+ final Map error = new Map();
void _setPath(List<String> pathSegments) {
if (pathSegments == null) {
@@ -35,14 +42,67 @@ class Message {
});
}
- Message.fromJsonRpc(this.client, Map map)
- : serial = map['id'],
+ factory Message.fromJsonRpc(Client client, Map map) {
+ if (map.containsKey('id')) {
+ final id = map['id'];
+ if (id != null && id is! num && id is! String) {
+ throw new Exception('"id" must be a number, string, or null.');
+ }
+ if (map.containsKey('method')) {
+ return new Message._fromJsonRpcRequest(client, map);
+ }
+ if (map.containsKey('result')) {
+ return new Message._fromJsonRpcResult(client, map);
+ }
+ if (map.containsKey('error')) {
+ return new Message._fromJsonRpcError(client, map);
+ }
+ } else if (map.containsKey('method')) {
+ return new Message._fromJsonRpcNotification(client, map);
+ }
+ throw new Exception('Invalid message format');
+ }
+
+ // http://www.jsonrpc.org/specification#request_object
+ Message._fromJsonRpcRequest(Client client, Map map)
+ : client = client,
+ type = MessageType.Request,
+ serial = map['id'],
method = map['method'] {
if (map['params'] != null) {
params.addAll(map['params']);
}
}
+ // http://www.jsonrpc.org/specification#notification
+ Message._fromJsonRpcNotification(Client client, Map map)
+ : client = client,
+ type = MessageType.Notification,
+ method = map['method'],
+ serial = null {
+ if (map['params'] != null) {
+ params.addAll(map['params']);
+ }
+ }
+
+ // http://www.jsonrpc.org/specification#response_object
+ Message._fromJsonRpcResult(Client client, Map map)
+ : client = client,
+ type = MessageType.Response,
+ serial = map['id'],
+ method = null {
+ result.addAll(map['result']);
+ }
+
+ // http://www.jsonrpc.org/specification#response_object
+ Message._fromJsonRpcError(Client client, Map map)
+ : client = client,
+ type = MessageType.Response,
+ serial = map['id'],
+ method = null {
+ error.addAll(map['error']);
+ }
+
static String _methodNameFromUri(Uri uri) {
if (uri == null) {
return '';
@@ -56,16 +116,19 @@ class Message {
Message.forMethod(String method)
: client = null,
method = method,
+ type = MessageType.Request,
serial = '';
Message.fromUri(this.client, Uri uri)
- : serial = '',
+ : type = MessageType.Request,
+ serial = '',
method = _methodNameFromUri(uri) {
params.addAll(uri.queryParameters);
}
Message.forIsolate(this.client, Uri uri, RunningIsolate isolate)
- : serial = '',
+ : type = MessageType.Request,
+ serial = '',
method = _methodNameFromUri(uri) {
params.addAll(uri.queryParameters);
params['isolateId'] = isolate.serviceId;
@@ -79,6 +142,30 @@ class Message {
return {'path': path, 'params': params};
}
+ dynamic forwardToJson([Map overloads]) {
+ var json = {'jsonrpc': '2.0', 'id': serial};
+ switch (type) {
+ case MessageType.Request:
+ case MessageType.Notification:
+ json['method'] = method;
+ if (params.isNotEmpty) {
+ json['params'] = params;
+ }
+ break;
+ case MessageType.Response:
+ if (result.isNotEmpty) {
+ json['result'] = result;
+ }
+ if (error.isNotEmpty) {
+ json['error'] = error;
+ }
+ }
+ if (overloads != null) {
+ json.addAll(overloads);
+ }
+ return json;
+ }
+
// Calls toString on all non-String elements of [list]. We do this so all
// elements in the list are strings, making consumption by C++ simpler.
// This has a side effect that boolean literal values like true become 'true'
« 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