| 
									
										
										
										
											2019-10-26 23:52:19 -06:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var Worker = module.exports; | 
					
						
							| 
									
										
										
										
											2019-10-28 01:06:43 -06:00
										 |  |  | // *very* generous, but well below the http norm of 120
 | 
					
						
							|  |  |  | var messageTimeout = 30 * 1000; | 
					
						
							| 
									
										
										
										
											2019-10-28 03:43:42 -06:00
										 |  |  | var msgPrefix = "greenlock:"; | 
					
						
							| 
									
										
										
										
											2019-10-28 01:06:43 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | Worker.create = function() { | 
					
						
							| 
									
										
										
										
											2019-11-01 15:14:07 -06:00
										 |  |  |     var greenlock = {}; | 
					
						
							| 
									
										
										
										
											2019-11-02 21:01:29 -06:00
										 |  |  |     ["getAcmeHttp01ChallengeResponse", "get", "notify", "_notify"].forEach(function(k) { | 
					
						
							| 
									
										
										
										
											2019-11-01 15:14:07 -06:00
										 |  |  |         greenlock[k] = function(args) { | 
					
						
							|  |  |  |             return rpc(k, args); | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-10-26 23:52:19 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-01 15:14:07 -06:00
										 |  |  |     var worker = { | 
					
						
							| 
									
										
										
										
											2019-11-03 01:28:37 -07:00
										 |  |  |         ready: function(fn) { | 
					
						
							| 
									
										
										
										
											2019-11-01 15:14:07 -06:00
										 |  |  |             var servers = require("./servers.js").create(greenlock); | 
					
						
							|  |  |  |             fn(servers); | 
					
						
							|  |  |  |             return worker; | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         master: function() { | 
					
						
							|  |  |  |             // ignore
 | 
					
						
							|  |  |  |             return worker; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2019-11-03 01:28:37 -07:00
										 |  |  |     // backwards compat starts early...
 | 
					
						
							|  |  |  |     worker.serve = worker.ready; | 
					
						
							| 
									
										
										
										
											2019-11-01 15:14:07 -06:00
										 |  |  |     return worker; | 
					
						
							| 
									
										
										
										
											2019-10-26 23:52:19 -06:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-28 01:06:43 -06:00
										 |  |  | function rpc(funcname, msg) { | 
					
						
							| 
									
										
										
										
											2019-11-01 15:14:07 -06:00
										 |  |  |     return new Promise(function(resolve, reject) { | 
					
						
							|  |  |  |         var rnd = Math.random() | 
					
						
							|  |  |  |             .toString() | 
					
						
							|  |  |  |             .slice(2) | 
					
						
							|  |  |  |             .toString(16); | 
					
						
							|  |  |  |         var id = msgPrefix + rnd; | 
					
						
							|  |  |  |         var timeout; | 
					
						
							| 
									
										
										
										
											2019-10-26 23:52:19 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-01 15:14:07 -06:00
										 |  |  |         function getResponse(msg) { | 
					
						
							|  |  |  |             if (msg._id !== id) { | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             process.removeListener("message", getResponse); | 
					
						
							|  |  |  |             clearTimeout(timeout); | 
					
						
							|  |  |  |             resolve(msg._result); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2019-10-26 23:52:19 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-01 15:14:07 -06:00
										 |  |  |         // TODO keep a single listener than just responds
 | 
					
						
							|  |  |  |         // via a collection of callbacks? or leave as is?
 | 
					
						
							|  |  |  |         process.on("message", getResponse); | 
					
						
							|  |  |  |         process.send({ | 
					
						
							|  |  |  |             _id: id, | 
					
						
							|  |  |  |             _funcname: funcname, | 
					
						
							|  |  |  |             _input: msg | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2019-10-26 23:52:19 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-01 15:14:07 -06:00
										 |  |  |         timeout = setTimeout(function() { | 
					
						
							|  |  |  |             process.removeListener("message", getResponse); | 
					
						
							|  |  |  |             reject(new Error("worker rpc request timeout")); | 
					
						
							|  |  |  |         }, messageTimeout); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-10-26 23:52:19 -06:00
										 |  |  | } |