BREAKING CHANGE All imports from 'angular2/core/compiler' should be changed to 'angular2/compiler'.
		
			
				
	
	
		
			56 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.7 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 = ['import "dart:isolate";'];
 | |
|   moduleImports.forEach((sourceImport) {
 | |
|     String modName = sourceImport[0];
 | |
|     String modAlias = sourceImport[1];
 | |
|     moduleSourceParts.add("import '${modName}' as ${modAlias};");
 | |
|   });
 | |
|   moduleSourceParts.add(moduleSource);
 | |
|   moduleSourceParts.add("""
 | |
| main(List args, SendPort replyPort) {
 | |
|   replyPort.send(run(args));
 | |
| }
 | |
| """);
 | |
|   return moduleSourceParts.join('\n');
 | |
| }
 | |
| 
 | |
| var timeStamp = new DateTime.now().millisecondsSinceEpoch;
 | |
| 
 | |
| dynamic callModule(dynamic data) {
 | |
|   return data.map((a) => a + 1);
 | |
| }
 | |
| 
 | |
| evalModule(String moduleSource, List<List<String>> imports, List args) {
 | |
|   String source = createIsolateSource(moduleSource, imports);
 | |
|   Completer completer = new Completer();
 | |
|   RawReceivePort receivePort;
 | |
|   receivePort = new RawReceivePort((message) {
 | |
|     receivePort.close();
 | |
|     completer.complete(message);
 | |
|   });
 | |
|   // Note: we have a special karma plugin that sends files under
 | |
|   // urls like /package_1234 as permanently cached.
 | |
|   // With this, spawning multiple isolates gets faster as Darts does not
 | |
|   // reload the files from the server.
 | |
|   var packageRoot = Uri.parse('/packages_${timeStamp}');
 | |
|   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;
 | |
|   });
 | |
| }
 |