From 01ff1d7da591dbc872f57746bebe9c9d82184bec Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Tue, 12 Nov 2019 01:46:47 -0700 Subject: [PATCH] wip: refining API --- greenlock-express.js | 3 +- greenlock-shim.js | 163 +++++++++++++++++++++++++++++++++---------- 2 files changed, 127 insertions(+), 39 deletions(-) diff --git a/greenlock-express.js b/greenlock-express.js index 4b8292e..074a327 100644 --- a/greenlock-express.js +++ b/greenlock-express.js @@ -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(); } diff --git a/greenlock-shim.js b/greenlock-shim.js index f6a281a..3044708 100644 --- a/greenlock-shim.js +++ b/greenlock-shim.js @@ -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: "" // 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; }