wip: refining API
This commit is contained in:
		
							parent
							
								
									347402a4d4
								
							
						
					
					
						commit
						01ff1d7da5
					
				| @ -17,7 +17,8 @@ var GLE = module.exports; | ||||
| // under the hood. That's the hope, anyway.
 | ||||
| 
 | ||||
| GLE.init = function(fn) { | ||||
|     if (false !== fn.cluster && cluster.isWorker) { | ||||
|     // See https://git.coolaj86.com/coolaj86/greenlock-express.js/issues/80
 | ||||
|     if (fn && false !== fn.cluster && cluster.isWorker) { | ||||
|         // ignore the init function and launch the worker
 | ||||
|         return require("./worker.js").create(); | ||||
|     } | ||||
|  | ||||
| @ -1,13 +1,134 @@ | ||||
| "use strict"; | ||||
| 
 | ||||
| var path = require("path"); | ||||
| var fs = require("fs"); | ||||
| 
 | ||||
| module.exports.create = function(opts) { | ||||
|     var Greenlock = require("@root/greenlock"); | ||||
|     var greenlock = opts.greenlock; | ||||
|     var pkgText; | ||||
|     var pkgErr; | ||||
|     var msgErr; | ||||
|     //var emailErr;
 | ||||
|     var realPkg; | ||||
|     var userPkg; | ||||
|     var myPkg = {}; | ||||
|     // we want to be SUPER transparent that we're reading from package.json
 | ||||
|     // we don't want anything unexpected
 | ||||
|     var implicitConfig = []; | ||||
|     var rc; | ||||
| 
 | ||||
|     if (!greenlock && opts.packageRoot) { | ||||
|         try { | ||||
|             greenlock = require(path.resolve(opts.packageRoot, "greenlock.js")); | ||||
|         } catch (e) { | ||||
|             if ("MODULE_NOT_FOUND" !== e.code) { | ||||
|                 throw e; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (!greenlock) { | ||||
|         opts = parsePackage(opts); | ||||
|         if (opts.packageRoot) { | ||||
|             try { | ||||
|                 pkgText = fs.readFileSync(path.resolve(opts.packageRoot, "package.json"), "utf8"); | ||||
|             } catch (e) { | ||||
|                 pkgErr = e; | ||||
|                 console.warn("`packageRoot` should be the root of the package (probably `__dirname`)"); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (pkgText) { | ||||
|             try { | ||||
|                 realPkg = JSON.parse(pkgText); | ||||
|             } catch (e) { | ||||
|                 pkgErr = e; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         userPkg = opts.package; | ||||
| 
 | ||||
|         if (realPkg || userPkg) { | ||||
|             userPkg = userPkg || {}; | ||||
|             realPkg = realPkg || {}; | ||||
| 
 | ||||
|             // build package agent
 | ||||
|             if (!opts.packageAgent) { | ||||
|                 // name
 | ||||
|                 myPkg.name = userPkg.name; | ||||
|                 if (!myPkg.name) { | ||||
|                     myPkg.name = realPkg.name; | ||||
|                     implicitConfig.push("name"); | ||||
|                 } | ||||
| 
 | ||||
|                 // version
 | ||||
|                 myPkg.version = userPkg.version; | ||||
|                 if (!myPkg.version) { | ||||
|                     myPkg.version = realPkg.version; | ||||
|                     implicitConfig.push("version"); | ||||
|                 } | ||||
|                 if (myPkg.name && myPkg.version) { | ||||
|                     opts.packageAgent = myPkg.name + "/" + myPkg.version; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             // build author
 | ||||
|             myPkg.author = opts.maintainerEmail; | ||||
|             if (!myPkg.author) { | ||||
|                 myPkg.author = (userPkg.author && userPkg.author.email) || userPkg.author; | ||||
|             } | ||||
|             if (!myPkg.author) { | ||||
|                 implicitConfig.push("author"); | ||||
|                 myPkg.author = (realPkg.author && realPkg.author.email) || realPkg.author; | ||||
|             } | ||||
|             opts.maintainerEmail = myPkg.maintainerEmail; | ||||
|         } | ||||
| 
 | ||||
|         if (!opts.packageAgent) { | ||||
|             msgErr = "missing `packageAgent` and also failed to read `name` and/or `version` from `package.json`"; | ||||
|             if (pkgErr) { | ||||
|                 msgErr += ": " + pkgErr.message; | ||||
|             } | ||||
|             throw new Error(msgErr); | ||||
|         } | ||||
| 
 | ||||
|         opts.maintainerEmail = parseMaintainer(opts.maintainerEmail); | ||||
|         if (!opts.maintainerEmail) { | ||||
|             msgErr = | ||||
|                 "missing or malformed `maintainerEmail` (or `author` from `package.json`), which is used as the contact for support notices"; | ||||
|             throw new Error(msgErr); | ||||
|         } | ||||
| 
 | ||||
|         opts.packageAgent = addGreenlockAgent(opts); | ||||
|         greenlock = Greenlock.create(opts); | ||||
| 
 | ||||
|         if (opts.packageRoot) { | ||||
|             try { | ||||
|                 rc = JSON.parse(fs.readFileSync(path.resolve(opts.packageRoot, ".greenlockrc"))); | ||||
|             } catch (e) { | ||||
|                 if ("ENOENT" !== e.code) { | ||||
|                     throw e; | ||||
|                 } | ||||
|                 rc = {}; | ||||
|             } | ||||
| 
 | ||||
|             if (opts.configFile && opts.configFile !== rc.configFile) { | ||||
|                 if (rc.configFile) { | ||||
|                     console.info("changing `configFile` from '%s' to '%s'", rc.configFile, opts.configFile); | ||||
|                 } | ||||
|                 rc.configFile = opts.configFile; | ||||
| 
 | ||||
|                 if (!rc.manager) { | ||||
|                     rc.manager = "@greenlock/manager"; | ||||
|                 } | ||||
| 
 | ||||
|                 fs.writeFileSync(path.resolve(opts.packageRoot, ".greenlockrc"), JSON.stringify(rc)); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (!greenlock) { | ||||
|             greenlock = Greenlock.create(opts); | ||||
|         } | ||||
| 
 | ||||
|         try { | ||||
|             if (opts.notify) { | ||||
|                 greenlock._defaults.notify = opts.notify; | ||||
| @ -29,6 +150,7 @@ module.exports.create = function(opts) { | ||||
|             return; | ||||
|         } | ||||
|         console.info("Ready to Serve:"); | ||||
| 
 | ||||
|         var max = 3; | ||||
|         if (sites.length >= 1) { | ||||
|             sites.slice(0, max).forEach(function(site) { | ||||
| @ -59,47 +181,12 @@ function addGreenlockAgent(opts) { | ||||
| // ex: "<john@example.com>"
 | ||||
| // ex: "john@example.com"
 | ||||
| var looseEmailRe = /(^|[\s<])([^'" <>:;`]+@[^'" <>:;`]+\.[^'" <>:;`]+)/; | ||||
| function parsePackage(opts) { | ||||
|     // 'package' is sometimes a reserved word
 | ||||
|     var pkg = opts.package || opts.pkg; | ||||
|     if (!pkg) { | ||||
|         opts.maintainerEmail = parseMaintainer(opts.maintainerEmail); | ||||
|         return opts; | ||||
|     } | ||||
| 
 | ||||
|     if (!opts.packageAgent) { | ||||
|         var err = "missing `package.THING`, which is used for the ACME client user agent string"; | ||||
|         if (!pkg.name) { | ||||
|             throw new Error(err.replace("THING", "name")); | ||||
|         } | ||||
|         if (!pkg.version) { | ||||
|             throw new Error(err.replace("THING", "version")); | ||||
|         } | ||||
|         opts.packageAgent = pkg.name + "/" + pkg.version; | ||||
|     } | ||||
| 
 | ||||
|     if (!opts.maintainerEmail) { | ||||
|         try { | ||||
|             opts.maintainerEmail = pkg.author.email || pkg.author.match(looseEmailRe)[2]; | ||||
|         } catch (e) {} | ||||
|     } | ||||
|     if (!opts.maintainerEmail) { | ||||
|         throw new Error("missing or malformed `package.author`, which is used as the contact for support notices"); | ||||
|     } | ||||
|     opts.package = undefined; | ||||
|     opts.maintainerEmail = parseMaintainer(opts.maintainerEmail); | ||||
| 
 | ||||
|     return opts; | ||||
| } | ||||
| 
 | ||||
| function parseMaintainer(maintainerEmail) { | ||||
|     try { | ||||
|         maintainerEmail = maintainerEmail.match(looseEmailRe)[2]; | ||||
|     } catch (e) { | ||||
|         maintainerEmail = null; | ||||
|     } | ||||
|     if (!maintainerEmail) { | ||||
|         throw new Error("missing or malformed `maintainerEmail`, which is used as the contact for support notices"); | ||||
|     } | ||||
| 
 | ||||
|     return maintainerEmail; | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user