49 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import "dart:isolate";
 | 
						|
import "dart:async";
 | 
						|
 | 
						|
Uri toDartDataUri(String source) {
 | 
						|
  return Uri.parse("data:application/dart;charset=utf-8,"
 | 
						|
                   "${Uri.encodeComponent(source)}");
 | 
						|
}
 | 
						|
 | 
						|
createIsolateSource(String moduleSource, List<List<String>> moduleImports) {
 | 
						|
  var moduleSourceParts = [];
 | 
						|
  moduleImports.forEach((sourceImport) {
 | 
						|
    String modName = sourceImport[0];
 | 
						|
    String modAlias = sourceImport[1];
 | 
						|
    moduleSourceParts.add("import 'package:${modName}.dart' as ${modAlias};");
 | 
						|
  });
 | 
						|
  moduleSourceParts.add(moduleSource);
 | 
						|
  
 | 
						|
  return """
 | 
						|
import "dart:isolate";
 | 
						|
import "${toDartDataUri(moduleSourceParts.join('\n'))}" as mut;
 | 
						|
 | 
						|
main(List args, SendPort replyPort) {
 | 
						|
  replyPort.send(mut.run(args));
 | 
						|
}
 | 
						|
""";
 | 
						|
 | 
						|
} 
 | 
						|
 | 
						|
dynamic callModule(dynamic data) { return data.map( (a) => a+1); }
 | 
						|
 | 
						|
evalModule(String moduleSource, List<List<String>> moduleImports, List args) {
 | 
						|
    String source = createIsolateSource(moduleSource, moduleImports);
 | 
						|
    Completer completer = new Completer();
 | 
						|
    RawReceivePort receivePort;
 | 
						|
    receivePort = new RawReceivePort( (message) {
 | 
						|
      receivePort.close();
 | 
						|
      completer.complete(message);
 | 
						|
    });
 | 
						|
    var packageRoot = Uri.parse('/packages');
 | 
						|
    return Isolate.spawnUri(toDartDataUri(source), args, receivePort.sendPort, packageRoot: packageRoot).then( (isolate) { 
 | 
						|
      RawReceivePort errorPort;
 | 
						|
      errorPort = new RawReceivePort( (message) {
 | 
						|
        completer.completeError(message);
 | 
						|
      });
 | 
						|
      isolate.addErrorListener(errorPort.sendPort);
 | 
						|
      return completer.future; 
 | 
						|
    });
 | 
						|
}
 |