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; 
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								}
							 |