Index: sdk/lib/vmservice/vmservice.dart |
diff --git a/sdk/lib/vmservice/vmservice.dart b/sdk/lib/vmservice/vmservice.dart |
index a56c2932d4e40df002f369d2ffabe7cb1f04517b..a7dcce7ea2cb15133ba56019ca2061f447e43c09 100644 |
--- a/sdk/lib/vmservice/vmservice.dart |
+++ b/sdk/lib/vmservice/vmservice.dart |
@@ -7,6 +7,7 @@ library dart._vmservice; |
import 'dart:async'; |
import 'dart:collection'; |
import 'dart:convert'; |
+import 'dart:developer' show ServiceProtocolInfo; |
import 'dart:isolate'; |
import 'dart:typed_data'; |
@@ -19,7 +20,7 @@ part 'running_isolates.dart'; |
part 'message.dart'; |
part 'message_router.dart'; |
-final RawReceivePort isolateLifecyclePort = new RawReceivePort(); |
+final RawReceivePort isolateControlPort = new RawReceivePort(); |
final RawReceivePort scriptLoadPort = new RawReceivePort(); |
abstract class IsolateEmbedderData { |
@@ -125,6 +126,12 @@ typedef Future<List<int>> ReadFileCallback(Uri path); |
/// Called to list all files under some path. |
typedef Future<List<Map<String,String>>> ListFilesCallback(Uri path); |
+/// Called when we need information about the server. |
+typedef Future<Uri> ServerInformationCallback(); |
+ |
+/// Called when we want to [enable] or disable the web server. |
+typedef Future<Uri> WebServerControlCallback(bool enable); |
+ |
/// Hooks that are setup by the embedder. |
class VMServiceEmbedderHooks { |
static ServerStartCallback serverStart; |
@@ -136,6 +143,8 @@ class VMServiceEmbedderHooks { |
static WriteStreamFileCallback writeStreamFile; |
static ReadFileCallback readFile; |
static ListFilesCallback listFiles; |
+ static ServerInformationCallback serverInformation; |
+ static WebServerControlCallback webServerControl; |
} |
class VMService extends MessageRouter { |
@@ -194,6 +203,27 @@ class VMService extends MessageRouter { |
} |
} |
+ Future<Null> _serverMessageHandler(int code, SendPort sp, bool enable) async { |
+ switch (code) { |
+ case Constants.WEB_SERVER_CONTROL_MESSAGE_ID: |
+ if (VMServiceEmbedderHooks.webServerControl == null) { |
+ sp.send(null); |
+ return; |
+ } |
+ Uri uri = await VMServiceEmbedderHooks.webServerControl(enable); |
+ sp.send(uri); |
+ break; |
+ case Constants.SERVER_INFO_MESSAGE_ID: |
+ if (VMServiceEmbedderHooks.serverInformation == null) { |
+ sp.send(null); |
+ return; |
+ } |
+ Uri uri = await VMServiceEmbedderHooks.serverInformation(); |
+ sp.send(uri); |
+ break; |
+ } |
+ } |
+ |
Future _exit() async { |
// Stop the server. |
if (VMServiceEmbedderHooks.serverStop != null) { |
@@ -201,7 +231,7 @@ class VMService extends MessageRouter { |
} |
// Close receive ports. |
- isolateLifecyclePort.close(); |
+ isolateControlPort.close(); |
scriptLoadPort.close(); |
// Create a copy of the set as a list because client.disconnect() will |
@@ -233,6 +263,13 @@ class VMService extends MessageRouter { |
_exit(); |
return; |
} |
+ if (message.length == 3) { |
+ // This is a message interacting with the web server. |
+ assert((message[0] == Constants.WEB_SERVER_CONTROL_MESSAGE_ID) || |
+ (message[0] == Constants.SERVER_INFO_MESSAGE_ID)); |
+ _serverMessageHandler(message[0], message[1], message[2]); |
+ return; |
+ } |
if (message.length == 4) { |
// This is a message informing us of the birth or death of an |
// isolate. |
@@ -244,7 +281,7 @@ class VMService extends MessageRouter { |
} |
VMService._internal() |
- : eventPort = isolateLifecyclePort { |
+ : eventPort = isolateControlPort { |
eventPort.handler = messageHandler; |
} |
@@ -425,8 +462,8 @@ class VMService extends MessageRouter { |
} |
RawReceivePort boot() { |
- // Return the port we expect isolate startup and shutdown messages on. |
- return isolateLifecyclePort; |
+ // Return the port we expect isolate control messages on. |
+ return isolateControlPort; |
} |
void _registerIsolate(int port_id, SendPort sp, String name) { |