Commit d0f43ed9 authored by Devon Carew's avatar Devon Carew Committed by GitHub

update flutter run --devfs (#4942)

* update flutter run --devfs

* use async; add todo
parent e42be3c3
...@@ -142,14 +142,9 @@ class Observatory { ...@@ -142,14 +142,9 @@ class Observatory {
// DevFS / VM virtual file system methods // DevFS / VM virtual file system methods
/// Create a new file system. /// Create a new file system.
/// Future<CreateDevFSResponse> createDevFS(String fsName) async {
/// When you create a file system you provide a fsName parameter. Given the Response response = await sendRequest('_createDevFS', <String, dynamic> { 'fsName': fsName });
/// [fsName] parameter you can build all the URIs you need with the following return new CreateDevFSResponse(response.response);
/// format:
///
/// dart-devfs://$fsName/$path
Future<Response> createDevFS(String fsName) {
return sendRequest('_createDevFS', <String, dynamic> { 'fsName': fsName });
} }
/// List the available file systems. /// List the available file systems.
...@@ -175,9 +170,7 @@ class Observatory { ...@@ -175,9 +170,7 @@ class Observatory {
} }
// Write multiple files into a file system. // Write multiple files into a file system.
Future<Response> writeDevFSFiles(String fsName, { Future<Response> writeDevFSFiles(String fsName, { List<DevFSFile> files }) {
List<DevFSFile> files
}) {
assert(files != null); assert(files != null);
return sendRequest('_writeDevFSFiles', <String, dynamic> { return sendRequest('_writeDevFSFiles', <String, dynamic> {
...@@ -186,13 +179,6 @@ class Observatory { ...@@ -186,13 +179,6 @@ class Observatory {
}); });
} }
// Read one file from a file system.
Future<List<int>> readDevFSFile() {
return sendRequest('_readDevFSFile').then((Response response) {
return BASE64.decode(response.response['fileContents']);
});
}
/// The complete list of a file system. /// The complete list of a file system.
Future<List<String>> listDevFSFiles(String fsName) { Future<List<String>> listDevFSFiles(String fsName) {
return sendRequest('_listDevFSFiles', <String, dynamic> { return sendRequest('_listDevFSFiles', <String, dynamic> {
...@@ -229,9 +215,10 @@ class Observatory { ...@@ -229,9 +215,10 @@ class Observatory {
} }
Future<Response> flutterExit(String isolateId) { Future<Response> flutterExit(String isolateId) {
return peer.sendRequest('ext.flutter.exit', <String, dynamic>{ return peer
'isolateId': isolateId .sendRequest('ext.flutter.exit', <String, dynamic>{ 'isolateId': isolateId })
}).then((dynamic result) => new Response(result)); .then((dynamic result) => new Response(result))
.timeout(new Duration(seconds: 2), onTimeout: () => null);
} }
void _addIsolate(IsolateRef isolate) { void _addIsolate(IsolateRef isolate) {
...@@ -278,6 +265,13 @@ class Response { ...@@ -278,6 +265,13 @@ class Response {
String toString() => response.toString(); String toString() => response.toString();
} }
class CreateDevFSResponse extends Response {
CreateDevFSResponse(Map<String, dynamic> response) : super(response);
String get name => response['name'];
String get uri => response['uri'];
}
class VM extends Response { class VM extends Response {
VM(Map<String, dynamic> response) : super(response); VM(Map<String, dynamic> response) : super(response);
......
...@@ -267,15 +267,17 @@ class RunAndStayResident { ...@@ -267,15 +267,17 @@ class RunAndStayResident {
}); });
} }
ProcessSignal.SIGINT.watch().listen((ProcessSignal signal) { ProcessSignal.SIGINT.watch().listen((ProcessSignal signal) async {
_resetTerminal(); _resetTerminal();
_stopLogger(); await _stopLogger();
_stopApp(); await _stopApp();
exit(0);
}); });
ProcessSignal.SIGTERM.watch().listen((ProcessSignal signal) { ProcessSignal.SIGTERM.watch().listen((ProcessSignal signal) async {
_resetTerminal(); _resetTerminal();
_stopLogger(); await _stopLogger();
_stopApp(); await _stopApp();
exit(0);
}); });
} }
...@@ -383,8 +385,8 @@ class RunAndStayResident { ...@@ -383,8 +385,8 @@ class RunAndStayResident {
printStatus('Type "d" to send modified project files to the the client\'s DevFS.'); printStatus('Type "d" to send modified project files to the the client\'s DevFS.');
} }
void _stopLogger() { Future<dynamic> _stopLogger() {
_loggingSubscription?.cancel(); return _loggingSubscription?.cancel();
} }
void _resetTerminal() { void _resetTerminal() {
...@@ -441,9 +443,13 @@ class DevFS { ...@@ -441,9 +443,13 @@ class DevFS {
final Observatory observatory; final Observatory observatory;
String fsName; String fsName;
String uri;
Map<String, _DevFSFileEntry> entries = <String, _DevFSFileEntry>{}; Map<String, _DevFSFileEntry> entries = <String, _DevFSFileEntry>{};
Future<dynamic> init() => observatory.createDevFS(fsName); Future<Null> init() async {
CreateDevFSResponse response = await observatory.createDevFS(fsName);
uri = response.uri;
}
void stageFile(String devPath, File file) { void stageFile(String devPath, File file) {
entries.putIfAbsent(devPath, () => new _DevFSFileEntry(devPath, file)); entries.putIfAbsent(devPath, () => new _DevFSFileEntry(devPath, file));
...@@ -456,7 +462,7 @@ class DevFS { ...@@ -456,7 +462,7 @@ class DevFS {
.toList(); .toList();
for (_DevFSFileEntry entry in toSend) { for (_DevFSFileEntry entry in toSend) {
printTrace('sending devfs://$fsName/${entry.devPath}'); printTrace('sending to devfs: ${entry.devPath}');
entry.updateLastModified(); entry.updateLastModified();
} }
...@@ -471,7 +477,16 @@ class DevFS { ...@@ -471,7 +477,16 @@ class DevFS {
List<_DevFSFile> files = toSend.map((_DevFSFileEntry entry) { List<_DevFSFile> files = toSend.map((_DevFSFileEntry entry) {
return new _DevFSFile('/${entry.devPath}', entry.file); return new _DevFSFile('/${entry.devPath}', entry.file);
}).toList(); }).toList();
await observatory.writeDevFSFiles(fsName, files: files);
// TODO(devoncarew): Batch this up in larger groups using writeDevFSFiles().
// The current implementation leaves dangling service protocol calls on a timeout.
await Future.wait(files.map((_DevFSFile file) {
return observatory.writeDevFSFile(
fsName,
path: file.path,
fileContents: file.getContents()
);
})).timeout(new Duration(seconds: 10));
} finally { } finally {
status.stop(showElapsedTime: true); status.stop(showElapsedTime: true);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment