| 
									
										
										
										
											2015-08-28 11:45:39 -07:00
										 |  |  | import "dart:isolate"; | 
					
						
							|  |  |  | import "dart:async"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Uri toDartDataUri(String source) { | 
					
						
							|  |  |  |   return Uri.parse("data:application/dart;charset=utf-8," | 
					
						
							| 
									
										
										
										
											2015-10-20 09:38:14 -07:00
										 |  |  |       "${Uri.encodeComponent(source)}"); | 
					
						
							| 
									
										
										
										
											2015-08-28 11:45:39 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | createIsolateSource(String moduleSource, List<List<String>> moduleImports) { | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |   var moduleSourceParts = ['import "dart:isolate";']; | 
					
						
							| 
									
										
										
										
											2015-08-28 11:45:39 -07:00
										 |  |  |   moduleImports.forEach((sourceImport) { | 
					
						
							|  |  |  |     String modName = sourceImport[0]; | 
					
						
							|  |  |  |     String modAlias = sourceImport[1]; | 
					
						
							| 
									
										
										
										
											2015-10-01 10:07:49 -07:00
										 |  |  |     moduleSourceParts.add("import '${modName}' as ${modAlias};"); | 
					
						
							| 
									
										
										
										
											2015-08-28 11:45:39 -07:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |   moduleSourceParts.add(moduleSource); | 
					
						
							|  |  |  |   moduleSourceParts.add("""
 | 
					
						
							| 
									
										
										
										
											2015-08-28 11:45:39 -07:00
										 |  |  | main(List args, SendPort replyPort) { | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  |   replyPort.send(run(args)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | """);
 | 
					
						
							|  |  |  |   return moduleSourceParts.join('\n'); | 
					
						
							| 
									
										
										
										
											2015-08-28 11:45:39 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-11 13:33:24 -07:00
										 |  |  | var timeStamp = new DateTime.now().millisecondsSinceEpoch; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-20 09:38:14 -07:00
										 |  |  | dynamic callModule(dynamic data) { | 
					
						
							|  |  |  |   return data.map((a) => a + 1); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-08-28 11:45:39 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-14 15:59:09 -07:00
										 |  |  | evalModule(String moduleSource, List<List<String>> imports, List args) { | 
					
						
							| 
									
										
										
										
											2015-10-20 09:38:14 -07:00
										 |  |  |   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); | 
					
						
							| 
									
										
										
										
											2015-08-28 11:45:39 -07:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2015-10-20 09:38:14 -07:00
										 |  |  |     isolate.addErrorListener(errorPort.sendPort); | 
					
						
							|  |  |  |     return completer.future; | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2015-08-28 11:45:39 -07:00
										 |  |  | } |