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.
|
// under the hood. That's the hope, anyway.
|
||||||
|
|
||||||
GLE.init = function(fn) {
|
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
|
// ignore the init function and launch the worker
|
||||||
return require("./worker.js").create();
|
return require("./worker.js").create();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,134 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
var path = require("path");
|
||||||
|
var fs = require("fs");
|
||||||
|
|
||||||
module.exports.create = function(opts) {
|
module.exports.create = function(opts) {
|
||||||
var Greenlock = require("@root/greenlock");
|
var Greenlock = require("@root/greenlock");
|
||||||
var greenlock = opts.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) {
|
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);
|
opts.packageAgent = addGreenlockAgent(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);
|
greenlock = Greenlock.create(opts);
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (opts.notify) {
|
if (opts.notify) {
|
||||||
greenlock._defaults.notify = opts.notify;
|
greenlock._defaults.notify = opts.notify;
|
||||||
|
@ -29,6 +150,7 @@ module.exports.create = function(opts) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
console.info("Ready to Serve:");
|
console.info("Ready to Serve:");
|
||||||
|
|
||||||
var max = 3;
|
var max = 3;
|
||||||
if (sites.length >= 1) {
|
if (sites.length >= 1) {
|
||||||
sites.slice(0, max).forEach(function(site) {
|
sites.slice(0, max).forEach(function(site) {
|
||||||
|
@ -59,47 +181,12 @@ function addGreenlockAgent(opts) {
|
||||||
// ex: "<john@example.com>"
|
// ex: "<john@example.com>"
|
||||||
// ex: "john@example.com"
|
// ex: "john@example.com"
|
||||||
var looseEmailRe = /(^|[\s<])([^'" <>:;`]+@[^'" <>:;`]+\.[^'" <>:;`]+)/;
|
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) {
|
function parseMaintainer(maintainerEmail) {
|
||||||
try {
|
try {
|
||||||
maintainerEmail = maintainerEmail.match(looseEmailRe)[2];
|
maintainerEmail = maintainerEmail.match(looseEmailRe)[2];
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
maintainerEmail = null;
|
maintainerEmail = null;
|
||||||
}
|
}
|
||||||
if (!maintainerEmail) {
|
|
||||||
throw new Error("missing or malformed `maintainerEmail`, which is used as the contact for support notices");
|
|
||||||
}
|
|
||||||
return maintainerEmail;
|
return maintainerEmail;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue