Implementation
Future<U> execute() async {
if (packageConfigURI != null &&
!File.fromUri(packageConfigURI!).existsSync()) {
throw StateError(
"Package file '$packageConfigURI' not found. Run 'pub get' and retry.",
);
}
final scriptSource = Uri.encodeComponent(await generator.scriptSource);
final onErrorPort = ReceivePort()
..listen((err) async {
if (err is List) {
final stack =
StackTrace.fromString(err.last.replaceAll(scriptSource, ""));
completer.completeError(StateError(err.first), stack);
} else {
completer.completeError(err);
}
});
final controlPort = ReceivePort()
..listen((results) {
if (results is Map && results.length == 1) {
if (results.containsKey("_result")) {
completer.complete(results['_result']);
return;
} else if (results.containsKey("_line_")) {
_logListener.add(results["_line_"]);
return;
}
}
_eventListener.add(results);
});
try {
message["_sendPort"] = controlPort.sendPort;
final dataUri = Uri.parse(
"data:application/dart;charset=utf-8,$scriptSource",
);
await Isolate.spawnUri(
dataUri,
[],
message,
onError: onErrorPort.sendPort,
packageConfig: packageConfigURI,
automaticPackageResolution: packageConfigURI == null,
);
return await completer.future;
} finally {
onErrorPort.close();
controlPort.close();
_eventListener.close();
_logListener.close();
}
}