Index: sdk/lib/vmservice/vmservice.dart |
diff --git a/sdk/lib/vmservice/vmservice.dart b/sdk/lib/vmservice/vmservice.dart |
index a56c2932d4e40df002f369d2ffabe7cb1f04517b..75de45930797208111b7689cf5252bc4f2448a27 100644 |
--- a/sdk/lib/vmservice/vmservice.dart |
+++ b/sdk/lib/vmservice/vmservice.dart |
@@ -7,7 +7,9 @@ library dart._vmservice; |
import 'dart:async'; |
import 'dart:collection'; |
import 'dart:convert'; |
+import 'dart:developer' show ServiceProtocolInfo; |
import 'dart:isolate'; |
+import 'dart:math'; |
import 'dart:typed_data'; |
part 'asset.dart'; |
@@ -19,13 +21,26 @@ 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 { |
void cleanup(); |
} |
+String _makeAuthToken() { |
+ final kTokenByteSize = 8; |
+ Uint8List bytes = new Uint8List(kTokenByteSize); |
+ Random random = new Random.secure(); |
+ for (int i = 0; i < kTokenByteSize; i++) { |
+ bytes[i] = random.nextInt(256); |
+ } |
+ return BASE64URL.encode(bytes); |
+} |
+ |
+// The randomly generated auth token used to access the VM service. |
+final String serviceAuthToken = _makeAuthToken(); |
+ |
// This is for use by the embedder. It is a map from the isolateId to |
// anything implementing IsolateEmbedderData. When an isolate goes away, |
// the cleanup method will be invoked after being removed from the map. |
@@ -125,6 +140,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 +157,8 @@ class VMServiceEmbedderHooks { |
static WriteStreamFileCallback writeStreamFile; |
static ReadFileCallback readFile; |
static ListFilesCallback listFiles; |
+ static ServerInformationCallback serverInformation; |
+ static WebServerControlCallback webServerControl; |
} |
class VMService extends MessageRouter { |
@@ -194,6 +217,27 @@ class VMService extends MessageRouter { |
} |
} |
+ Future<Null> _serverMessageHandler(int code, SendPort sp, bool enable) async { |
rmacnak
2016/10/20 17:12:31
Future
Cutch
2016/10/20 23:31:51
Strong mode requires Future<Null> :(
|
+ 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 +245,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 +277,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 +295,7 @@ class VMService extends MessageRouter { |
} |
VMService._internal() |
- : eventPort = isolateLifecyclePort { |
+ : eventPort = isolateControlPort { |
eventPort.handler = messageHandler; |
} |
@@ -425,8 +476,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) { |