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 {
// DevFS / VM virtual file system methods
/// Create a new file system.
///
/// When you create a file system you provide a fsName parameter. Given the
/// [fsName] parameter you can build all the URIs you need with the following
/// format:
///
/// dart-devfs://$fsName/$path
Future<Response> createDevFS(String fsName) {
return sendRequest('_createDevFS', <String, dynamic> { 'fsName': fsName });
Future<CreateDevFSResponse> createDevFS(String fsName) async {
Response response = await sendRequest('_createDevFS', <String, dynamic> { 'fsName': fsName });
return new CreateDevFSResponse(response.response);
}
/// List the available file systems.
......@@ -175,9 +170,7 @@ class Observatory {
}
// Write multiple files into a file system.
Future<Response> writeDevFSFiles(String fsName, {
List<DevFSFile> files
}) {
Future<Response> writeDevFSFiles(String fsName, { List<DevFSFile> files }) {
assert(files != null);
return sendRequest('_writeDevFSFiles', <String, dynamic> {
......@@ -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.
Future<List<String>> listDevFSFiles(String fsName) {
return sendRequest('_listDevFSFiles', <String, dynamic> {
......@@ -229,9 +215,10 @@ class Observatory {
}
Future<Response> flutterExit(String isolateId) {
return peer.sendRequest('ext.flutter.exit', <String, dynamic>{
'isolateId': isolateId
}).then((dynamic result) => new Response(result));
return peer
.sendRequest('ext.flutter.exit', <String, dynamic>{ 'isolateId': isolateId })
.then((dynamic result) => new Response(result))
.timeout(new Duration(seconds: 2), onTimeout: () => null);
}
void _addIsolate(IsolateRef isolate) {
......@@ -278,6 +265,13 @@ class Response {
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 {
VM(Map<String, dynamic> response) : super(response);
......
......@@ -267,15 +267,17 @@ class RunAndStayResident {
});
}
ProcessSignal.SIGINT.watch().listen((ProcessSignal signal) {
ProcessSignal.SIGINT.watch().listen((ProcessSignal signal) async {
_resetTerminal();
_stopLogger();
_stopApp();
await _stopLogger();
await _stopApp();
exit(0);
});
ProcessSignal.SIGTERM.watch().listen((ProcessSignal signal) {
ProcessSignal.SIGTERM.watch().listen((ProcessSignal signal) async {
_resetTerminal();
_stopLogger();
_stopApp();
await _stopLogger();
await _stopApp();
exit(0);
});
}
......@@ -383,8 +385,8 @@ class RunAndStayResident {
printStatus('Type "d" to send modified project files to the the client\'s DevFS.');
}
void _stopLogger() {
_loggingSubscription?.cancel();
Future<dynamic> _stopLogger() {
return _loggingSubscription?.cancel();
}
void _resetTerminal() {
......@@ -441,9 +443,13 @@ class DevFS {
final Observatory observatory;
String fsName;
String uri;
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) {
entries.putIfAbsent(devPath, () => new _DevFSFileEntry(devPath, file));
......@@ -456,7 +462,7 @@ class DevFS {
.toList();
for (_DevFSFileEntry entry in toSend) {
printTrace('sending devfs://$fsName/${entry.devPath}');
printTrace('sending to devfs: ${entry.devPath}');
entry.updateLastModified();
}
......@@ -471,7 +477,16 @@ class DevFS {
List<_DevFSFile> files = toSend.map((_DevFSFileEntry entry) {
return new _DevFSFile('/${entry.devPath}', entry.file);
}).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 {
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