From 4513a6d49c86cffca717cf4fa5beab4c049b7b58 Mon Sep 17 00:00:00 2001 From: Jonathan Hui Date: Wed, 26 Jun 2019 11:59:17 +1000 Subject: [PATCH] Handle asynchronous exceptions, e.g. 'socket hang up' --- lib/community.js | 87 +++++++++++++++++++++++++++--------------------- lib/core.js | 52 +++++++++++++---------------- 2 files changed, 73 insertions(+), 66 deletions(-) diff --git a/lib/community.js b/lib/community.js index e3c07c7..d6c8272 100644 --- a/lib/community.js +++ b/lib/community.js @@ -2,47 +2,58 @@ function addCommunityMember(opts) { // { name, version, email, domains, action, communityMember, telemetry } - setTimeout(function () { - var https = require('https'); - var req = https.request({ - hostname: 'api.ppl.family' - , port: 443 - , path: '/api/ppl.family/public/list' - , method: 'POST' - , headers: { - 'Content-Type': 'application/json' - } - }, function (err, resp) { - if (err) { return; } - resp.on('data', function () {}); - }); - var os = require('os'); - var data = { - address: opts.email - // greenlock-security is transactional and security only - , list: opts.communityMember ? (opts.name + '@ppl.family') : 'greenlock-security@ppl.family' - , action: opts.action // reg | renew - , package: opts.name - // hashed for privacy, but so we can still get some telemetry and inform users - // if abnormal things are happening (like several registrations for the same domain each day) - , domain: (opts.domains||[]).map(function (d) { - return require('crypto').createHash('sha1').update(d).digest('base64') - .replace(/\//g, '_').replace(/\+/g, '-').replace(/=/g, ''); - }).join(',') - }; - if (false !== opts.telemetry) { - data.arch = process.arch || os.arch(); - data.platform = process.platform || os.platform(); - data.release = os.release(); - data.version = opts.version; - data.node = process.version; + var https = require('https'); + var req = https.request({ + hostname: 'api.ppl.family' + , port: 443 + , path: '/api/ppl.family/public/list' + , method: 'POST' + , headers: { + 'Content-Type': 'application/json' } - req.write(JSON.stringify(data, 2, null)); - req.end(); - }, 50); + }, function (err, resp) { + if (err) { return; } + resp.on('data', function () {}); + }); + var os = require('os'); + var data = { + address: opts.email + // greenlock-security is transactional and security only + , list: opts.communityMember ? (opts.name + '@ppl.family') : 'greenlock-security@ppl.family' + , action: opts.action // reg | renew + , package: opts.name + // hashed for privacy, but so we can still get some telemetry and inform users + // if abnormal things are happening (like several registrations for the same domain each day) + , domain: (opts.domains||[]).map(function (d) { + return require('crypto').createHash('sha1').update(d).digest('base64') + .replace(/\//g, '_').replace(/\+/g, '-').replace(/=/g, ''); + }).join(',') + }; + if (false !== opts.telemetry) { + data.arch = process.arch || os.arch(); + data.platform = process.platform || os.platform(); + data.release = os.release(); + data.version = opts.version; + data.node = process.version; + } + req.write(JSON.stringify(data, 2, null)); + req.end(); } -module.exports.add = addCommunityMember; +function delay(ms) { + return new Promise(function (resolve) { + return setTimeout(resolve, ms); + }); +} + +module.exports.add = function (opts) { + return delay(50).then(() => { + return addCommunityMember(opts); + }) + .catch(function (ex) { + /* ignore */ + }) +} if (require.main === module) { //addCommunityMember('greenlock-express.js', 'reg', 'coolaj86+test42@gmail.com', ['coolaj86.com'], true); diff --git a/lib/core.js b/lib/core.js index eeed781..adee10b 100644 --- a/lib/core.js +++ b/lib/core.js @@ -558,20 +558,18 @@ module.exports.create = function (gl) { if (!certs || !utils.certHasDomain(certs, args.domain)) { // There is no cert available if (false !== args.securityUpdates && !args._communityMemberAdded) { - try { - // We will notify all greenlock users of mandatory and security updates - // We'll keep track of versions and os so we can make sure things work well - // { name, version, email, domains, action, communityMember, telemetry } - require('./community').add({ - name: args._communityPackage - , version: args._communityPackageVersion - , email: args.email - , domains: args.domains || args.servernames - , action: 'reg' - , communityMember: args.communityMember - , telemetry: args.telemetry - }); - } catch(e) { /* ignore */ } + // We will notify all greenlock users of mandatory and security updates + // We'll keep track of versions and os so we can make sure things work well + // { name, version, email, domains, action, communityMember, telemetry } + require('./community').add({ + name: args._communityPackage + , version: args._communityPackageVersion + , email: args.email + , domains: args.domains || args.servernames + , action: 'reg' + , communityMember: args.communityMember + , telemetry: args.telemetry + }); args._communityMemberAdded = true; } return core.certificates.registerAsync(args); @@ -580,20 +578,18 @@ module.exports.create = function (gl) { if (core.certificates._isRenewable(args, certs)) { // it's time to renew the available cert if (false !== args.securityUpdates && !args._communityMemberAdded) { - try { - // We will notify all greenlock users of mandatory and security updates - // We'll keep track of versions and os so we can make sure things work well - // { name, version, email, domains, action, communityMember, telemetry } - require('./community').add({ - name: args._communityPackage - , version: args._communityPackageVersion - , email: args.email - , domains: args.domains || args.servernames - , action: 'renew' - , communityMember: args.communityMember - , telemetry: args.telemetry - }); - } catch(e) { /* ignore */ } + // We will notify all greenlock users of mandatory and security updates + // We'll keep track of versions and os so we can make sure things work well + // { name, version, email, domains, action, communityMember, telemetry } + require('./community').add({ + name: args._communityPackage + , version: args._communityPackageVersion + , email: args.email + , domains: args.domains || args.servernames + , action: 'renew' + , communityMember: args.communityMember + , telemetry: args.telemetry + }); args._communityMemberAdded = true; } certs.renewing = core.certificates.renewAsync(args, certs);