'use strict'; var M = module.exports; var native = require('./lib/native.js'); // Keep track of active maintainers so that we know who to inform if // something breaks or has a serious bug or flaw. var oldCollegeTries = {}; M.init = function (me) { if (oldCollegeTries[me.maintainerEmail]) { return; } var tz = ''; try { // Use timezone to stagger messages to maintainers tz = Intl.DateTimeFormat().resolvedOptions().timeZone; } catch (e) { // ignore node versions with no or incomplete Intl } // Use locale to know what language to use var env = process.env; var locale = env.LC_ALL || env.LC_MESSAGES || env.LANG || env.LANGUAGE; try { M._init(me, tz, locale); } catch (e) { //console.log(e); // ignore } }; M._init = function (me, tz, locale) { setTimeout(function () { // prevent a stampede from misconfigured clients in an eternal loop me.request({ timeout: 3000, method: 'GET', url: 'https://api.rootprojects.org/api/nonce', json: true }) .then(function (resp) { // in the browser this will work until solved, but in // node this will bail unless the challenge is trivial return native._hashcash(resp.body || {}); }) .then(function (hashcash) { var req = { timeout: 3000, headers: { 'x-root-nonce-v1': hashcash }, method: 'POST', url: 'https://api.rootprojects.org/api/projects/ACME.js/dependents', json: { maintainer: me.maintainerEmail, package: me.packageAgent, tz: tz, locale: locale } }; return me.request(req); }) .catch(function (err) { if (me.debug) { console.error( 'error adding maintainer to support notices:' ); console.error(err); } }) .then(function (/*resp*/) { oldCollegeTries[me.maintainerEmail] = true; //console.log(resp); }); }, me.__timeout || 3000); }; if (require.main === module) { var ACME = require('./'); var acme = ACME.create({ maintainerEmail: 'aj+acme-test@rootprojects.org', packageAgent: 'test/v0', __timeout: 100 }); M.init(acme); }