compat.js 2.62 KB
// Copyright 2018 AJ ONeal. All rights reserved
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
'use strict';
/* global Promise */

var ACME2 = require('./').ACME;

function resolveFn(cb) {
	return function(val) {
		// nextTick to get out of Promise chain
		process.nextTick(function() {
			cb(null, val);
		});
	};
}
function rejectFn(cb) {
	return function(err) {
		console.error('[acme-v2] handled(?) rejection as errback:');
		console.error(err.stack);

		// nextTick to get out of Promise chain
		process.nextTick(function() {
			cb(err);
		});

		// do not resolve promise further
		return new Promise(function() {});
	};
}

function create(deps) {
	deps.LeCore = {};
	var acme2 = ACME2.create(deps);
	acme2.registerNewAccount = function(options, cb) {
		acme2.accounts.create(options).then(resolveFn(cb), rejectFn(cb));
	};
	acme2.getCertificate = function(options, cb) {
		options.agreeToTerms =
			options.agreeToTerms ||
			function(tos) {
				return Promise.resolve(tos);
			};
		acme2.certificates.create(options).then(function(certs) {
			var privkeyPem = acme2.RSA.exportPrivatePem(options.domainKeypair);
			certs.privkey = privkeyPem;
			resolveFn(cb)(certs);
		}, rejectFn(cb));
	};
	acme2.getAcmeUrls = function(options, cb) {
		acme2.init(options).then(resolveFn(cb), rejectFn(cb));
	};
	acme2.getOptions = function() {
		var defs = {};

		Object.keys(module.exports.defaults).forEach(function(key) {
			defs[key] = defs[deps] || module.exports.defaults[key];
		});

		return defs;
	};
	acme2.stagingServerUrl = module.exports.defaults.stagingServerUrl;
	acme2.productionServerUrl = module.exports.defaults.productionServerUrl;
	acme2.acmeChallengePrefix = module.exports.defaults.acmeChallengePrefix;
	return acme2;
}

module.exports.ACME = {};
module.exports.defaults = {
	productionServerUrl: 'https://acme-v02.api.letsencrypt.org/directory',
	stagingServerUrl: 'https://acme-staging-v02.api.letsencrypt.org/directory',
	knownEndpoints: [
		'keyChange',
		'meta',
		'newAccount',
		'newNonce',
		'newOrder',
		'revokeCert'
	],
	challengeTypes: ['http-01', 'dns-01'],
	challengeType: 'http-01',
	//, keyType:                'rsa' // ecdsa
	//, keySize:                2048 // 256
	rsaKeySize: 2048, // 256
	acmeChallengePrefix: '/.well-known/acme-challenge/'
};
Object.keys(module.exports.defaults).forEach(function(key) {
	module.exports.ACME[key] = module.exports.defaults[key];
});
Object.keys(ACME2).forEach(function(key) {
	module.exports.ACME[key] = ACME2[key];
});
module.exports.ACME.create = create;