https
express server läuft jetzt mit https
This commit is contained in:
parent
5589b0df3f
commit
fd947bd852
41
express-server/LICENSE
Normal file
41
express-server/LICENSE
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
Copyright 2017 AJ ONeal
|
||||||
|
|
||||||
|
This is open source software; you can redistribute it and/or modify it under the
|
||||||
|
terms of either:
|
||||||
|
|
||||||
|
a) the "MIT License"
|
||||||
|
b) the "Apache-2.0 License"
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
Apache-2.0 License Summary
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
75
express-server/examples/demo.js
Normal file
75
express-server/examples/demo.js
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
// npm install spdy@3.x
|
||||||
|
|
||||||
|
//var Greenlock = require('greenlock-express')
|
||||||
|
var Greenlock = require('../');
|
||||||
|
|
||||||
|
var greenlock = Greenlock.create({
|
||||||
|
|
||||||
|
// Let's Encrypt v2 is ACME draft 11
|
||||||
|
version: 'draft-11'
|
||||||
|
|
||||||
|
, server: 'https://acme-v02.api.letsencrypt.org/directory'
|
||||||
|
// Note: If at first you don't succeed, stop and switch to staging
|
||||||
|
// https://acme-staging-v02.api.letsencrypt.org/directory
|
||||||
|
|
||||||
|
// You MUST change this to a valid email address
|
||||||
|
, email: 'jon@example.com'
|
||||||
|
|
||||||
|
// You MUST NOT build clients that accept the ToS without asking the user
|
||||||
|
, agreeTos: true
|
||||||
|
|
||||||
|
// You MUST change these to valid domains
|
||||||
|
// NOTE: all domains will validated and listed on the certificate
|
||||||
|
, approvedDomains: [ 'example.com', 'www.example.com' ]
|
||||||
|
|
||||||
|
// You MUST have access to write to directory where certs are saved
|
||||||
|
// ex: /home/foouser/acme/etc
|
||||||
|
, configDir: '~/.config/acme/'
|
||||||
|
|
||||||
|
// Get notified of important updates and help me make greenlock better
|
||||||
|
, communityMember: true
|
||||||
|
|
||||||
|
//, debug: true
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////
|
||||||
|
// http-01 Challenges //
|
||||||
|
////////////////////////
|
||||||
|
|
||||||
|
// http-01 challenge happens over http/1.1, not http2
|
||||||
|
var redirectHttps = require('redirect-https')();
|
||||||
|
var acmeChallengeHandler = greenlock.middleware(function (req, res) {
|
||||||
|
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
||||||
|
res.end('<h1>Hello, ⚠️ Insecure World!</h1><a>Visit Secure Site</a>'
|
||||||
|
+ '<script>document.querySelector("a").href=window.location.href.replace(/^http/i, "https");</script>'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
require('http').createServer(acmeChallengeHandler).listen(80, function () {
|
||||||
|
console.log("Listening for ACME http-01 challenges on", this.address());
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////
|
||||||
|
// http2 via SPDY h2 //
|
||||||
|
////////////////////////
|
||||||
|
|
||||||
|
// spdy is a drop-in replacement for the https API
|
||||||
|
var spdyOptions = Object.assign({}, greenlock.tlsOptions);
|
||||||
|
spdyOptions.spdy = { protocols: [ 'h2', 'http/1.1' ], plain: false };
|
||||||
|
var server = require('spdy').createServer(spdyOptions, require('express')().use('/', function (req, res) {
|
||||||
|
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
||||||
|
res.end('<h1>Hello, 🔐 Secure World!</h1>');
|
||||||
|
}));
|
||||||
|
server.on('error', function (err) {
|
||||||
|
console.error(err);
|
||||||
|
});
|
||||||
|
server.on('listening', function () {
|
||||||
|
console.log("Listening for SPDY/http2/https requests on", this.address());
|
||||||
|
});
|
||||||
|
server.listen(443);
|
29
express-server/examples/force-renew.js
Normal file
29
express-server/examples/force-renew.js
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
//require('greenlock-express')
|
||||||
|
require('../').create({
|
||||||
|
|
||||||
|
// Let's Encrypt v2 is ACME draft 11
|
||||||
|
version: 'draft-11'
|
||||||
|
|
||||||
|
, server: 'https://acme-v02.api.letsencrypt.org/directory'
|
||||||
|
// Note: If at first you don't succeed, stop and switch to staging
|
||||||
|
// https://acme-staging-v02.api.letsencrypt.org/directory
|
||||||
|
|
||||||
|
, email: 'john.doe@example.com'
|
||||||
|
|
||||||
|
, agreeTos: true
|
||||||
|
|
||||||
|
, approvedDomains: [ 'example.com', 'www.example.com' ]
|
||||||
|
|
||||||
|
, app: require('express')().use('/', function (req, res) {
|
||||||
|
res.end('Hello, World!');
|
||||||
|
})
|
||||||
|
|
||||||
|
, renewWithin: (91 * 24 * 60 * 60 * 1000)
|
||||||
|
, renewBy: (90 * 24 * 60 * 60 * 1000)
|
||||||
|
|
||||||
|
// Get notified of important updates and help me make greenlock better
|
||||||
|
, communityMember: true
|
||||||
|
, debug: true
|
||||||
|
}).listen(80, 443);
|
74
express-server/examples/http2.js
Normal file
74
express-server/examples/http2.js
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
//var Greenlock = require('greenlock-express')
|
||||||
|
var Greenlock = require('../');
|
||||||
|
|
||||||
|
var greenlock = Greenlock.create({
|
||||||
|
|
||||||
|
// Let's Encrypt v2 is ACME draft 11
|
||||||
|
version: 'draft-11'
|
||||||
|
|
||||||
|
, server: 'https://acme-v02.api.letsencrypt.org/directory'
|
||||||
|
// Note: If at first you don't succeed, stop and switch to staging
|
||||||
|
// https://acme-staging-v02.api.letsencrypt.org/directory
|
||||||
|
|
||||||
|
// You MUST change this to a valid email address
|
||||||
|
, email: 'jon@example.com'
|
||||||
|
|
||||||
|
// You MUST NOT build clients that accept the ToS without asking the user
|
||||||
|
, agreeTos: true
|
||||||
|
|
||||||
|
// You MUST change these to valid domains
|
||||||
|
// NOTE: all domains will validated and listed on the certificate
|
||||||
|
, approvedDomains: [ 'example.com', 'www.example.com' ]
|
||||||
|
|
||||||
|
// You MUST have access to write to directory where certs are saved
|
||||||
|
// ex: /home/foouser/acme/etc
|
||||||
|
, configDir: '~/.config/acme/'
|
||||||
|
|
||||||
|
// Get notified of important updates and help me make greenlock better
|
||||||
|
, communityMember: true
|
||||||
|
|
||||||
|
//, debug: true
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////
|
||||||
|
// http-01 Challenges //
|
||||||
|
////////////////////////
|
||||||
|
|
||||||
|
// http-01 challenge happens over http/1.1, not http2
|
||||||
|
var redirectHttps = require('redirect-https')();
|
||||||
|
var acmeChallengeHandler = greenlock.middleware(redirectHttps);
|
||||||
|
require('http').createServer(acmeChallengeHandler).listen(80, function () {
|
||||||
|
console.log("Listening for ACME http-01 challenges on", this.address());
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////
|
||||||
|
// node.js' http2 api //
|
||||||
|
////////////////////////
|
||||||
|
|
||||||
|
// http2 is a new API with which you would use hapi or koa, not express
|
||||||
|
var server = require('http2').createSecureServer(greenlock.tlsOptions);
|
||||||
|
server.on('error', function (err) {
|
||||||
|
console.error(err);
|
||||||
|
});
|
||||||
|
// WARNING: Because the middleware don't handle this API style,
|
||||||
|
// the Host headers are unmodified and potentially dangerous
|
||||||
|
// (ex: Host: Robert'); DROP TABLE Students;)
|
||||||
|
server.on('stream', function (stream, headers) {
|
||||||
|
console.log(headers);
|
||||||
|
stream.respond({
|
||||||
|
'content-type': 'text/html'
|
||||||
|
, ':status': 200
|
||||||
|
});
|
||||||
|
stream.end('Hello, HTTP2 World!');
|
||||||
|
});
|
||||||
|
server.on('listening', function () {
|
||||||
|
console.log("Listening for http2 requests on", this.address());
|
||||||
|
});
|
||||||
|
server.listen(443);
|
15
express-server/examples/my-express-app.js
Normal file
15
express-server/examples/my-express-app.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var express = require('express');
|
||||||
|
var app = express();
|
||||||
|
|
||||||
|
app.use('/', function (req, res) {
|
||||||
|
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
||||||
|
res.end('Hello, World!\n\n💚 🔒.js');
|
||||||
|
});
|
||||||
|
|
||||||
|
// DO NOT DO app.listen() unless we're testing this directly
|
||||||
|
if (require.main === module) { app.listen(3000); }
|
||||||
|
|
||||||
|
// Instead do export the app:
|
||||||
|
module.exports = app;
|
90
express-server/examples/production.js
Normal file
90
express-server/examples/production.js
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
//
|
||||||
|
// My Secure Server
|
||||||
|
//
|
||||||
|
//var greenlock = require('greenlock-express')
|
||||||
|
var greenlock = require('../').create({
|
||||||
|
|
||||||
|
// Let's Encrypt v2 is ACME draft 11
|
||||||
|
// Note: If at first you don't succeed, stop and switch to staging
|
||||||
|
// https://acme-staging-v02.api.letsencrypt.org/directory
|
||||||
|
server: 'https://acme-v02.api.letsencrypt.org/directory'
|
||||||
|
, version: 'draft-11'
|
||||||
|
// You MUST have write access to save certs
|
||||||
|
, configDir: '~/.config/acme/'
|
||||||
|
|
||||||
|
// The previous 'simple' example set these values statically,
|
||||||
|
// but this example uses approveDomains() to set them dynamically
|
||||||
|
//, email: 'none@see.note.above'
|
||||||
|
//, agreeTos: false
|
||||||
|
|
||||||
|
// approveDomains is the right place to check a database for
|
||||||
|
// email addresses with domains and agreements and such
|
||||||
|
, approveDomains: approveDomains
|
||||||
|
|
||||||
|
, app: require('./my-express-app.js')
|
||||||
|
|
||||||
|
// Get notified of important updates and help me make greenlock better
|
||||||
|
, communityMember: true
|
||||||
|
|
||||||
|
//, debug: true
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
var server = greenlock.listen(80, 443);
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// My Secure Database Check
|
||||||
|
//
|
||||||
|
function approveDomains(opts, certs, cb) {
|
||||||
|
|
||||||
|
// Only one domain is listed with *automatic* registration via SNI
|
||||||
|
// (it's an array because managed registration allows for multiple domains,
|
||||||
|
// which was the case in the simple example)
|
||||||
|
console.log(opts.domains);
|
||||||
|
|
||||||
|
// The domains being approved for the first time are listed in opts.domains
|
||||||
|
// Certs being renewed are listed in certs.altnames
|
||||||
|
if (certs) {
|
||||||
|
opts.domains = [certs.subject].concat(certs.altnames);
|
||||||
|
}
|
||||||
|
|
||||||
|
fooCheckDb(opts.domains, function (err, agree, email) {
|
||||||
|
if (err) { cb(err); return; }
|
||||||
|
|
||||||
|
// Services SHOULD automatically accept the ToS and use YOUR email
|
||||||
|
// Clients MUST NOT accept the ToS without asking the user
|
||||||
|
opts.agreeTos = agree;
|
||||||
|
opts.email = email;
|
||||||
|
|
||||||
|
// NOTE: you can also change other options such as `challengeType` and `challenge`
|
||||||
|
// (this would be helpful if you decided you wanted wildcard support as a domain altname)
|
||||||
|
// opts.challengeType = 'http-01';
|
||||||
|
// opts.challenge = require('le-challenge-fs').create({});
|
||||||
|
|
||||||
|
cb(null, { options: opts, certs: certs });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// My User / Domain Database
|
||||||
|
//
|
||||||
|
function fooCheckDb(domains, cb) {
|
||||||
|
// This is an oversimplified example of how we might implement a check in
|
||||||
|
// our database if we have different rules for different users and domains
|
||||||
|
var domains = [ 'example.com', 'www.example.com' ];
|
||||||
|
var userEmail = 'john.doe@example.com';
|
||||||
|
var userAgrees = true;
|
||||||
|
var passCheck = opts.domains.every(function (domain) {
|
||||||
|
return -1 !== domains.indexOf(domain);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!passCheck) {
|
||||||
|
cb(new Error('domain not allowed'));
|
||||||
|
} else {
|
||||||
|
cb(null, userAgrees, userEmail);
|
||||||
|
}
|
||||||
|
}
|
36
express-server/examples/quickstart.js
Normal file
36
express-server/examples/quickstart.js
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var app = require('../app');
|
||||||
|
|
||||||
|
//require('greenlock-express')
|
||||||
|
require('../').create({
|
||||||
|
|
||||||
|
// Let's Encrypt v2 is ACME draft 11
|
||||||
|
version: 'draft-11'
|
||||||
|
|
||||||
|
, server: 'https://acme-v02.api.letsencrypt.org/directory'
|
||||||
|
// Note: If at first you don't succeed, stop and switch to staging
|
||||||
|
// https://acme-staging-v02.api.letsencrypt.org/directory
|
||||||
|
|
||||||
|
// You MUST change this to a valid email address
|
||||||
|
, email: 'lukas.n912@gmail.com'
|
||||||
|
|
||||||
|
// You MUST NOT build clients that accept the ToS without asking the user
|
||||||
|
, agreeTos: true
|
||||||
|
|
||||||
|
// You MUST change these to valid domains
|
||||||
|
// NOTE: all domains will validated and listed on the certificate
|
||||||
|
, approvedDomains: [ 'www.smartshopper.cf', 'smartshopper.cf']
|
||||||
|
|
||||||
|
// You MUST have access to write to directory where certs are saved
|
||||||
|
// ex: /home/foouser/acme/etc
|
||||||
|
, configDir: '~/.config/acme/'
|
||||||
|
|
||||||
|
, app: app
|
||||||
|
|
||||||
|
// Get notified of important updates and help me make greenlock better
|
||||||
|
, communityMember: true
|
||||||
|
|
||||||
|
//, debug: true
|
||||||
|
|
||||||
|
}).listen(7000, 443);
|
95
express-server/examples/remote-access.js
Normal file
95
express-server/examples/remote-access.js
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
//
|
||||||
|
// WARNING: Not for noobs
|
||||||
|
// Try the simple example first
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// This demo is used with tunnel-server.js and tunnel-client.js
|
||||||
|
//
|
||||||
|
|
||||||
|
var email = 'john.doe@gmail.com';
|
||||||
|
var domains = [ 'example.com' ];
|
||||||
|
var agreeLeTos = true;
|
||||||
|
//var secret = "My Little Brony";
|
||||||
|
var secret = require('crypto').randomBytes(16).toString('hex');
|
||||||
|
|
||||||
|
require('../').create({
|
||||||
|
version: 'draft-11'
|
||||||
|
|
||||||
|
, server: 'https://acme-v02.api.letsencrypt.org/directory'
|
||||||
|
// Note: If at first you don't succeed, stop and switch to staging
|
||||||
|
// https://acme-staging-v02.api.letsencrypt.org/directory
|
||||||
|
|
||||||
|
, email: email
|
||||||
|
, agreeTos: agreeLeTos
|
||||||
|
, approveDomains: domains
|
||||||
|
, configDir: '~/.config/acme/'
|
||||||
|
, app: remoteAccess(secret)
|
||||||
|
// Get notified of important updates and help me make greenlock better
|
||||||
|
, communityMember: true
|
||||||
|
//, debug: true
|
||||||
|
}).listen(3000, 8443);
|
||||||
|
|
||||||
|
|
||||||
|
function remoteAccess(secret) {
|
||||||
|
var express = require('express');
|
||||||
|
var basicAuth = require('express-basic-auth');
|
||||||
|
var serveIndex = require('serve-index');
|
||||||
|
|
||||||
|
var rootIndex = serveIndex('/', { hidden: true, icons: true, view: 'details' });
|
||||||
|
var rootFs = express.static('/', { dotfiles: 'allow', redirect: true, index: false });
|
||||||
|
|
||||||
|
var userIndex = serveIndex(require('os').homedir(), { hidden: true, icons: true, view: 'details' });
|
||||||
|
var userFs = express.static(require('os').homedir(), { dotfiles: 'allow', redirect: true, index: false });
|
||||||
|
|
||||||
|
var app = express();
|
||||||
|
var realm = 'Login Required';
|
||||||
|
|
||||||
|
var myAuth = basicAuth({
|
||||||
|
users: { 'root': secret, 'user': secret }
|
||||||
|
, challenge: true
|
||||||
|
, realm: realm
|
||||||
|
, unauthorizedResponse: function (/*req*/) {
|
||||||
|
return 'Unauthorized <a href="/">Home</a>';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
app.get('/', function (req, res) {
|
||||||
|
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
||||||
|
res.end(
|
||||||
|
'<a href="/browse/">View Files</a>'
|
||||||
|
+ ' | '
|
||||||
|
+ '<a href="/logout/">Logout</a>'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
app.use('/logout', function (req, res) {
|
||||||
|
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
||||||
|
res.setHeader('WWW-Authenticate', 'Basic realm="' + realm + '"');
|
||||||
|
res.statusCode = 401;
|
||||||
|
//res.setHeader('Location', '/');
|
||||||
|
res.end('Logged out | <a href="/">Home</a>');
|
||||||
|
});
|
||||||
|
app.use('/browse', myAuth);
|
||||||
|
app.use('/browse', function (req, res, next) {
|
||||||
|
if ('root' === req.auth.user) { rootFs(req, res, function () { rootIndex(req, res, next); }); return; }
|
||||||
|
if ('user' === req.auth.user) { userFs(req, res, function () { userIndex(req, res, next); }); return; }
|
||||||
|
res.end('Sad Panda');
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('');
|
||||||
|
console.log('');
|
||||||
|
console.log('Usernames are\n');
|
||||||
|
console.log('\troot');
|
||||||
|
console.log('\tuser');
|
||||||
|
console.log('');
|
||||||
|
console.log('Password (for both) is\n');
|
||||||
|
console.log('\t' + secret);
|
||||||
|
console.log('');
|
||||||
|
console.log("Shhhh... It's a secret to everybody!");
|
||||||
|
console.log('');
|
||||||
|
console.log('');
|
||||||
|
|
||||||
|
return app;
|
||||||
|
}
|
68
express-server/examples/spdy.js
Normal file
68
express-server/examples/spdy.js
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
// npm install spdy@3.x
|
||||||
|
|
||||||
|
//var Greenlock = require('greenlock-express')
|
||||||
|
var Greenlock = require('../');
|
||||||
|
|
||||||
|
var greenlock = Greenlock.create({
|
||||||
|
|
||||||
|
// Let's Encrypt v2 is ACME draft 11
|
||||||
|
version: 'draft-11'
|
||||||
|
|
||||||
|
, server: 'https://acme-v02.api.letsencrypt.org/directory'
|
||||||
|
// Note: If at first you don't succeed, stop and switch to staging
|
||||||
|
// https://acme-staging-v02.api.letsencrypt.org/directory
|
||||||
|
|
||||||
|
// You MUST change this to a valid email address
|
||||||
|
, email: 'jon@example.com'
|
||||||
|
|
||||||
|
// You MUST NOT build clients that accept the ToS without asking the user
|
||||||
|
, agreeTos: true
|
||||||
|
|
||||||
|
// You MUST change these to valid domains
|
||||||
|
// NOTE: all domains will validated and listed on the certificate
|
||||||
|
, approvedDomains: [ 'example.com', 'www.example.com' ]
|
||||||
|
|
||||||
|
// You MUST have access to write to directory where certs are saved
|
||||||
|
// ex: /home/foouser/acme/etc
|
||||||
|
, configDir: '~/.config/acme/' // MUST have write access
|
||||||
|
|
||||||
|
// Get notified of important updates and help me make greenlock better
|
||||||
|
, communityMember: true
|
||||||
|
|
||||||
|
//, debug: true
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////
|
||||||
|
// http-01 Challenges //
|
||||||
|
////////////////////////
|
||||||
|
|
||||||
|
// http-01 challenge happens over http/1.1, not http2
|
||||||
|
var redirectHttps = require('redirect-https')();
|
||||||
|
var acmeChallengeHandler = greenlock.middleware(redirectHttps);
|
||||||
|
require('http').createServer(acmeChallengeHandler).listen(80, function () {
|
||||||
|
console.log("Listening for ACME http-01 challenges on", this.address());
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////
|
||||||
|
// http2 via SPDY h2 //
|
||||||
|
////////////////////////
|
||||||
|
|
||||||
|
// spdy is a drop-in replacement for the https API
|
||||||
|
var spdyOptions = Object.assign({}, greenlock.tlsOptions);
|
||||||
|
spdyOptions.spdy = { protocols: [ 'h2', 'http/1.1' ], plain: false };
|
||||||
|
var myApp = require('./my-express-app.js');
|
||||||
|
var server = require('spdy').createServer(spdyOptions, myApp);
|
||||||
|
server.on('error', function (err) {
|
||||||
|
console.error(err);
|
||||||
|
});
|
||||||
|
server.on('listening', function () {
|
||||||
|
console.log("Listening for SPDY/http2/https requests on", this.address());
|
||||||
|
});
|
||||||
|
server.listen(443);
|
114
express-server/examples/vhost.js
Normal file
114
express-server/examples/vhost.js
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
///////////////////
|
||||||
|
// vhost example //
|
||||||
|
///////////////////
|
||||||
|
|
||||||
|
//
|
||||||
|
// virtual hosting example
|
||||||
|
//
|
||||||
|
|
||||||
|
// The prefix where sites go by name.
|
||||||
|
// For example: whatever.com may live in /srv/www/whatever.com, thus /srv/www is our path
|
||||||
|
var srv = '/srv/www/';
|
||||||
|
|
||||||
|
var path = require('path');
|
||||||
|
var fs = require('fs');
|
||||||
|
var finalhandler = require('finalhandler');
|
||||||
|
var serveStatic = require('serve-static');
|
||||||
|
|
||||||
|
//var glx = require('greenlock-express')
|
||||||
|
var glx = require('../').create({
|
||||||
|
|
||||||
|
version: 'draft-11' // Let's Encrypt v2 is ACME draft 11
|
||||||
|
|
||||||
|
, server: 'https://acme-v02.api.letsencrypt.org/directory' // If at first you don't succeed, stop and switch to staging
|
||||||
|
// https://acme-staging-v02.api.letsencrypt.org/directory
|
||||||
|
|
||||||
|
, configDir: '~/.config/acme/' // You MUST have access to write to directory where certs
|
||||||
|
// are saved. ex: /home/foouser/.config/acme
|
||||||
|
|
||||||
|
, approveDomains: myApproveDomains // Greenlock's wraps around tls.SNICallback. Check the
|
||||||
|
// domain name here and reject invalid ones
|
||||||
|
|
||||||
|
, app: myVhostApp // Any node-style http app (i.e. express, koa, hapi, rill)
|
||||||
|
|
||||||
|
/* CHANGE TO A VALID EMAIL */
|
||||||
|
, email:'jon@example.com' // Email for Let's Encrypt account and Greenlock Security
|
||||||
|
, agreeTos: true // Accept Let's Encrypt ToS
|
||||||
|
, communityMember: true // Join Greenlock to get important updates, no spam
|
||||||
|
|
||||||
|
//, debug: true
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
var server = glx.listen(80, 443);
|
||||||
|
server.on('listening', function () {
|
||||||
|
console.info(server.type + " listening on", server.address());
|
||||||
|
});
|
||||||
|
|
||||||
|
// [SECURITY]
|
||||||
|
// Since v2.4.0+ Greenlock proactively protects against
|
||||||
|
// SQL injection and timing attacks by rejecting invalid domain names,
|
||||||
|
// but it's up to you to make sure that you accept opts.domain BEFORE
|
||||||
|
// an attempt is made to issue a certificate for it.
|
||||||
|
function myApproveDomains(opts, certs, cb) {
|
||||||
|
|
||||||
|
// In this example the filesystem is our "database".
|
||||||
|
// We check in /srv/www/ for opts.domain (i.e. "example.com") and only proceed if it exists.
|
||||||
|
console.log(opts.domain);
|
||||||
|
|
||||||
|
// Check that the hosting domain exists on the file system.
|
||||||
|
var hostdir = path.join(srv, opts.domain);
|
||||||
|
fs.readdir(hostdir, function (err, nodes) {
|
||||||
|
var e;
|
||||||
|
if (err || !nodes) {
|
||||||
|
e = new Error("rejecting '" + opts.domains[0] + "' because '" + hostdir + "' could not be read");
|
||||||
|
console.error(e);
|
||||||
|
console.error(err);
|
||||||
|
cb(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// You could put a variety of configuration details alongside the vhost folder
|
||||||
|
// For example, /srv/www/example.com.json could describe the following:
|
||||||
|
|
||||||
|
// If you have multiple domains grouped together, you can list them on the same certificate
|
||||||
|
// opts.domains = [ 'example.com', 'www.example.com', 'api.example.com', 'sso.example.com' ]
|
||||||
|
|
||||||
|
// You can also change other options on-the-fly
|
||||||
|
// (approveDomains is called after the in-memory certificates cache is checked, but before any ACME requests)
|
||||||
|
|
||||||
|
// opts.email = "jon@example.com"
|
||||||
|
// opts.agreeTos = true;
|
||||||
|
// opts.challengeType = 'http-01';
|
||||||
|
// opts.challenge = require('le-challenge-fs').create({});
|
||||||
|
cb(null, { options: opts, certs: certs });
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// [SECURITY]
|
||||||
|
// Since v2.4.0+ Greenlock Express will proactively protect against
|
||||||
|
// SQL injection and timing attacks by rejecting invalid domain names
|
||||||
|
// in Host headers.
|
||||||
|
// It will also make them lowercase and protect against "domain fronting".
|
||||||
|
// However, it's up to you to make sure you actually have a domain to serve :)
|
||||||
|
var servers = {};
|
||||||
|
function myVhostApp(req, res) {
|
||||||
|
var hostname = req.headers.host;
|
||||||
|
var srvpath = path.join(srv, hostname);
|
||||||
|
console.log('vhost for', req.headers.host);
|
||||||
|
|
||||||
|
if (!servers[hostname]) {
|
||||||
|
try {
|
||||||
|
fs.accessSync(srvpath);
|
||||||
|
servers[hostname] = serveStatic(srvpath, { redirect: true });
|
||||||
|
} catch(e) {
|
||||||
|
finalhandler(req, res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
servers[hostname](req, res, finalhandler(req, res));
|
||||||
|
}
|
40
express-server/examples/websockets.js
Normal file
40
express-server/examples/websockets.js
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////
|
||||||
|
// Greenlock Setup //
|
||||||
|
////////////////////////
|
||||||
|
|
||||||
|
//var Greenlock = require('greenlock-express');
|
||||||
|
var Greenlock = require('../');
|
||||||
|
var greenlock = Greenlock.create({
|
||||||
|
|
||||||
|
// Let's Encrypt v2 is ACME draft 11
|
||||||
|
// Note: If at first you don't succeed, stop and switch to staging
|
||||||
|
// https://acme-staging-v02.api.letsencrypt.org/directory
|
||||||
|
server: 'https://acme-v02.api.letsencrypt.org/directory'
|
||||||
|
, version: 'draft-11'
|
||||||
|
, configDir: '~/.config/acme/'
|
||||||
|
, app: require('./my-express-app.js')
|
||||||
|
|
||||||
|
// You MUST change these to a valid email and domains
|
||||||
|
, email: 'john.doe@example.com'
|
||||||
|
, approvedDomains: [ 'example.com', 'www.example.com' ]
|
||||||
|
, agreeTos: true
|
||||||
|
|
||||||
|
// Get notified of important updates and help me make greenlock better
|
||||||
|
, communityMember: true
|
||||||
|
, telemetry: true
|
||||||
|
//, debug: true
|
||||||
|
});
|
||||||
|
|
||||||
|
var server = greenlock.listen(80, 443);
|
||||||
|
|
||||||
|
var WebSocket = require('ws');
|
||||||
|
var ws = new WebSocket.Server({ server: server });
|
||||||
|
ws.on('connection', function (ws, req) {
|
||||||
|
// inspect req.headers.authorization (or cookies) for session info
|
||||||
|
ws.send("[Secure Echo Server] Hello!\nAuth: '" + (req.headers.authorization || 'none') + "'\n"
|
||||||
|
+ "Cookie: '" + (req.headers.cookie || 'none') + "'\n");
|
||||||
|
ws.on('message', function (data) { ws.send(data); });
|
||||||
|
});
|
159
express-server/index.js
Normal file
159
express-server/index.js
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var PromiseA;
|
||||||
|
try {
|
||||||
|
PromiseA = require('bluebird');
|
||||||
|
} catch(e) {
|
||||||
|
PromiseA = global.Promise;
|
||||||
|
}
|
||||||
|
|
||||||
|
// opts.approveDomains(options, certs, cb)
|
||||||
|
module.exports.create = function (opts) {
|
||||||
|
// accept all defaults for greenlock.challenges, greenlock.store, greenlock.middleware
|
||||||
|
if (!opts._communityPackage) {
|
||||||
|
opts._communityPackage = 'greenlock-express.js';
|
||||||
|
opts._communityPackageVersion = require('./package.json').version;
|
||||||
|
}
|
||||||
|
|
||||||
|
function explainError(e) {
|
||||||
|
console.error('Error:' + e.message);
|
||||||
|
if ('EACCES' === e.errno) {
|
||||||
|
console.error("You don't have prmission to access '" + e.address + ":" + e.port + "'.");
|
||||||
|
console.error("You probably need to use \"sudo\" or \"sudo setcap 'cap_net_bind_service=+ep' $(which node)\"");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ('EADDRINUSE' === e.errno) {
|
||||||
|
console.error("'" + e.address + ":" + e.port + "' is already being used by some other program.");
|
||||||
|
console.error("You probably need to stop that program or restart your computer.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.error(e.code + ": '" + e.address + ":" + e.port + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
function _listen(plainPort, plain) {
|
||||||
|
if (!plainPort) { plainPort = 80; }
|
||||||
|
|
||||||
|
var parts = String(plainPort).split(':');
|
||||||
|
var p = parts.pop();
|
||||||
|
var addr = parts.join(':').replace(/^\[/, '').replace(/\]$/, '');
|
||||||
|
var args = [];
|
||||||
|
var httpType;
|
||||||
|
var server;
|
||||||
|
var validHttpPort = (parseInt(p, 10) >= 0);
|
||||||
|
|
||||||
|
function tryPlain() {
|
||||||
|
server = require('http').createServer(
|
||||||
|
greenlock.middleware.sanitizeHost(greenlock.middleware(require('redirect-https')()))
|
||||||
|
);
|
||||||
|
httpType = 'http';
|
||||||
|
}
|
||||||
|
|
||||||
|
function trySecure() {
|
||||||
|
var https;
|
||||||
|
try {
|
||||||
|
https = require('spdy');
|
||||||
|
greenlock.tlsOptions.spdy = { protocols: [ 'h2', 'http/1.1' ], plain: false };
|
||||||
|
httpType = 'http2 (spdy/h2)';
|
||||||
|
} catch(e) {
|
||||||
|
https = require('https');
|
||||||
|
httpType = 'https';
|
||||||
|
}
|
||||||
|
server = https.createServer(
|
||||||
|
greenlock.tlsOptions
|
||||||
|
, greenlock.middleware.sanitizeHost(function (req, res) {
|
||||||
|
try {
|
||||||
|
greenlock.app(req, res);
|
||||||
|
} catch(e) {
|
||||||
|
console.error("[error] [greenlock.app] Your HTTP handler had an uncaught error:");
|
||||||
|
console.error(e);
|
||||||
|
try {
|
||||||
|
res.statusCode = 500;
|
||||||
|
res.end("Internal Server Error: [Greenlock] HTTP exception logged for user-provided handler.");
|
||||||
|
} catch(e) {
|
||||||
|
// ignore
|
||||||
|
// (headers may have already been sent, etc)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
server.type = httpType;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (addr) { args[1] = addr; }
|
||||||
|
if (!validHttpPort && !/(\/)|(\\\\)/.test(p)) {
|
||||||
|
console.warn("'" + p + "' doesn't seem to be a valid port number, socket path, or pipe");
|
||||||
|
}
|
||||||
|
if (plain) { tryPlain(); } else { trySecure(); }
|
||||||
|
|
||||||
|
var promise = new PromiseA(function (resolve) {
|
||||||
|
args[0] = p;
|
||||||
|
args.push(function () { resolve(server); });
|
||||||
|
server.listen.apply(server, args).on('error', function (e) {
|
||||||
|
if (server.listenerCount('error') < 2) {
|
||||||
|
console.warn("Did not successfully create http server and bind to port '" + p + "':");
|
||||||
|
explainError(e);
|
||||||
|
process.exit(41);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
promise.server = server;
|
||||||
|
return promise;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: 'greenlock' is just 'opts' renamed
|
||||||
|
var greenlock = require('greenlock').create(opts);
|
||||||
|
|
||||||
|
if (!opts.app) {
|
||||||
|
opts.app = function (req, res) {
|
||||||
|
res.end("Hello, World!\nWith Love,\nGreenlock for Express.js");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
opts.listen = function (plainPort, port, fnPlain, fn) {
|
||||||
|
var promises = [];
|
||||||
|
var server;
|
||||||
|
var plainServer;
|
||||||
|
|
||||||
|
// If there is only one handler for the `listening` (i.e. TCP bound) event
|
||||||
|
// then we want to use it as HTTPS (backwards compat)
|
||||||
|
if (!fn) {
|
||||||
|
fn = fnPlain;
|
||||||
|
fnPlain = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
promises.push(_listen(plainPort, true));
|
||||||
|
promises.push(_listen(port, false));
|
||||||
|
|
||||||
|
server = promises[1].server;
|
||||||
|
plainServer = promises[0].server;
|
||||||
|
|
||||||
|
PromiseA.all(promises).then(function () {
|
||||||
|
// Report plain http status
|
||||||
|
if ('function' === typeof fnPlain) {
|
||||||
|
fnPlain.apply(plainServer);
|
||||||
|
} else if (!fn && !plainServer.listenerCount('listening') && !server.listenerCount('listening')) {
|
||||||
|
console.info('[:' + (plainServer.address().port || plainServer.address())
|
||||||
|
+ "] Handling ACME challenges and redirecting to " + server.type);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Report h2/https status
|
||||||
|
if ('function' === typeof fn) {
|
||||||
|
fn.apply(server);
|
||||||
|
} else if (!server.listenerCount('listening')) {
|
||||||
|
console.info('[:' + (server.address().port || server.address()) + "] Serving " + server.type);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
server.unencrypted = plainServer;
|
||||||
|
return server;
|
||||||
|
};
|
||||||
|
opts.middleware.acme = function (opts) {
|
||||||
|
return greenlock.middleware.sanitizeHost(greenlock.middleware(require('redirect-https')(opts)));
|
||||||
|
};
|
||||||
|
opts.middleware.secure = function (app) {
|
||||||
|
return greenlock.middleware.sanitizeHost(app);
|
||||||
|
};
|
||||||
|
|
||||||
|
return greenlock;
|
||||||
|
};
|
52
express-server/node_modules/.bin/certpem
generated
vendored
Normal file
52
express-server/node_modules/.bin/certpem
generated
vendored
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var certpem = require('../').certpem;
|
||||||
|
var path = require('path');
|
||||||
|
var filepath = (process.cwd() + path.sep + 'cert.pem');
|
||||||
|
var debug = false;
|
||||||
|
var json;
|
||||||
|
var cert;
|
||||||
|
|
||||||
|
if (/--debug/.test(process.argv[2]) || /--debug/.test(process.argv[3])) {
|
||||||
|
debug = true;
|
||||||
|
}
|
||||||
|
if (/--json/.test(process.argv[2]) || /--json/.test(process.argv[3])) {
|
||||||
|
json = true;
|
||||||
|
}
|
||||||
|
if (process.argv[2] && !/^--/.test(process.argv[2])) {
|
||||||
|
filepath = process.argv[2];
|
||||||
|
}
|
||||||
|
if (process.argv[3] && !/^--/.test(process.argv[3])) {
|
||||||
|
filepath = process.argv[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filepath.length > 256) {
|
||||||
|
cert = filepath;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
cert = require('fs').readFileSync(filepath, 'ascii');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug) {
|
||||||
|
console.info(JSON.stringify(certpem.debug(cert), null, ' '));
|
||||||
|
} else {
|
||||||
|
var c = certpem.info(cert);
|
||||||
|
|
||||||
|
if (json) {
|
||||||
|
console.info(JSON.stringify(c, null, ' '));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.info('');
|
||||||
|
|
||||||
|
console.info('Certificate for', c.subject);
|
||||||
|
console.info('');
|
||||||
|
console.info('Altnames:', c.altnames.join(', '));
|
||||||
|
console.info('');
|
||||||
|
console.info('Issued at', new Date(c.issuedAt));
|
||||||
|
console.info('Expires at', new Date(c.expiresAt));
|
||||||
|
|
||||||
|
console.info('');
|
||||||
|
}
|
33
express-server/node_modules/.bin/mkdirp
generated
vendored
Normal file
33
express-server/node_modules/.bin/mkdirp
generated
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
var mkdirp = require('../');
|
||||||
|
var minimist = require('minimist');
|
||||||
|
var fs = require('fs');
|
||||||
|
|
||||||
|
var argv = minimist(process.argv.slice(2), {
|
||||||
|
alias: { m: 'mode', h: 'help' },
|
||||||
|
string: [ 'mode' ]
|
||||||
|
});
|
||||||
|
if (argv.help) {
|
||||||
|
fs.createReadStream(__dirname + '/usage.txt').pipe(process.stdout);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var paths = argv._.slice();
|
||||||
|
var mode = argv.mode ? parseInt(argv.mode, 8) : undefined;
|
||||||
|
|
||||||
|
(function next () {
|
||||||
|
if (paths.length === 0) return;
|
||||||
|
var p = paths.shift();
|
||||||
|
|
||||||
|
if (mode === undefined) mkdirp(p, cb)
|
||||||
|
else mkdirp(p, mode, cb)
|
||||||
|
|
||||||
|
function cb (err) {
|
||||||
|
if (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
else next();
|
||||||
|
}
|
||||||
|
})();
|
35
express-server/node_modules/.bin/rsa-keygen-js
generated
vendored
Normal file
35
express-server/node_modules/.bin/rsa-keygen-js
generated
vendored
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var RSA = require('../').RSA;
|
||||||
|
var path = require('path');
|
||||||
|
var fs = require('fs');
|
||||||
|
|
||||||
|
var bitlen = 2048;
|
||||||
|
var exp = 65537;
|
||||||
|
var opts = { public: true, pem: true };
|
||||||
|
var cwd = process.cwd();
|
||||||
|
var privkeyPath = path.join(cwd, 'privkey.pem');
|
||||||
|
var pubkeyPath = path.join(cwd, 'pubkey.pem');
|
||||||
|
|
||||||
|
if (fs.existsSync(privkeyPath)) {
|
||||||
|
console.error(privkeyPath, "already exists");
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
RSA.generateKeypair(bitlen, exp, opts, function (err, keypair) {
|
||||||
|
console.info('');
|
||||||
|
console.info('');
|
||||||
|
|
||||||
|
fs.writeFileSync(privkeyPath, keypair.privateKeyPem, 'ascii');
|
||||||
|
console.info(privkeyPath + ':');
|
||||||
|
console.info('');
|
||||||
|
console.info(keypair.privateKeyPem);
|
||||||
|
|
||||||
|
console.info('');
|
||||||
|
|
||||||
|
fs.writeFileSync(pubkeyPath, keypair.publicKeyPem, 'ascii');
|
||||||
|
console.info(pubkeyPath + ':');
|
||||||
|
console.info('');
|
||||||
|
console.info(keypair.publicKeyPem);
|
||||||
|
});
|
41
express-server/node_modules/@coolaj86/urequest/LICENSE
generated
vendored
Normal file
41
express-server/node_modules/@coolaj86/urequest/LICENSE
generated
vendored
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
Copyright 2018 AJ ONeal
|
||||||
|
|
||||||
|
This is open source software; you can redistribute it and/or modify it under the
|
||||||
|
terms of either:
|
||||||
|
|
||||||
|
a) the "MIT License"
|
||||||
|
b) the "Apache-2.0 License"
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
Apache-2.0 License Summary
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
339
express-server/node_modules/@coolaj86/urequest/README.md
generated
vendored
Normal file
339
express-server/node_modules/@coolaj86/urequest/README.md
generated
vendored
Normal file
@ -0,0 +1,339 @@
|
|||||||
|
# µRequest - Minimalist HTTP client
|
||||||
|
|
||||||
|
A lightweight alternative to (and drop-in replacement for) request.
|
||||||
|
|
||||||
|
Written from scratch.
|
||||||
|
|
||||||
|
## Super simple to use
|
||||||
|
|
||||||
|
µRequest is designed to be a drop-in replacement for request. It supports HTTPS and follows redirects by default.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install --save @coolaj86/urequest
|
||||||
|
```
|
||||||
|
|
||||||
|
```js
|
||||||
|
var request = require('@coolaj86/urequest');
|
||||||
|
request('http://www.google.com', function (error, response, body) {
|
||||||
|
console.log('error:', error); // Print the error if one occurred
|
||||||
|
console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
|
||||||
|
console.log('body:', body); // Print the HTML for the Google homepage.
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Table of contents
|
||||||
|
|
||||||
|
- [Forms](#forms)
|
||||||
|
- [HTTP Authentication](#http-authentication)
|
||||||
|
- [Custom HTTP Headers](#custom-http-headers)
|
||||||
|
- [Unix Domain Sockets](#unix-domain-sockets)
|
||||||
|
- [**All Available Options**](#requestoptions-callback)
|
||||||
|
|
||||||
|
## Forms
|
||||||
|
|
||||||
|
`urequest` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads.
|
||||||
|
<!-- For `multipart/related` refer to the `multipart` API. -->
|
||||||
|
|
||||||
|
#### application/x-www-form-urlencoded (URL-Encoded Forms)
|
||||||
|
|
||||||
|
URL-encoded forms are simple.
|
||||||
|
|
||||||
|
```js
|
||||||
|
request.post('http://service.com/upload', {form:{key:'value'}})
|
||||||
|
// or
|
||||||
|
request.post({url:'http://service.com/upload', form: {key:'value'}}, function(err,httpResponse,body){ /* ... */ })
|
||||||
|
```
|
||||||
|
<!--
|
||||||
|
// or
|
||||||
|
request.post('http://service.com/upload').form({key:'value'})
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
#### multipart/form-data (Multipart Form Uploads)
|
||||||
|
|
||||||
|
For `multipart/form-data` we use the [form-data](https://github.com/form-data/form-data) library by [@felixge](https://github.com/felixge). For the most cases, you can pass your upload form data via the `formData` option.
|
||||||
|
|
||||||
|
|
||||||
|
```js
|
||||||
|
var formData = {
|
||||||
|
// Pass a simple key-value pair
|
||||||
|
my_field: 'my_value',
|
||||||
|
// Pass data via Buffers
|
||||||
|
my_buffer: Buffer.from([1, 2, 3]),
|
||||||
|
// Pass data via Streams
|
||||||
|
my_file: fs.createReadStream(__dirname + '/unicycle.jpg'),
|
||||||
|
// Pass multiple values /w an Array
|
||||||
|
attachments: [
|
||||||
|
fs.createReadStream(__dirname + '/attachment1.jpg'),
|
||||||
|
fs.createReadStream(__dirname + '/attachment2.jpg')
|
||||||
|
],
|
||||||
|
// Pass optional meta-data with an 'options' object with style: {value: DATA, options: OPTIONS}
|
||||||
|
// Use case: for some types of streams, you'll need to provide "file"-related information manually.
|
||||||
|
// See the `form-data` README for more information about options: https://github.com/form-data/form-data
|
||||||
|
custom_file: {
|
||||||
|
value: fs.createReadStream('/dev/urandom'),
|
||||||
|
options: {
|
||||||
|
filename: 'topsecret.jpg',
|
||||||
|
contentType: 'image/jpeg'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
request.post({url:'http://service.com/upload', formData: formData}, function optionalCallback(err, httpResponse, body) {
|
||||||
|
if (err) {
|
||||||
|
return console.error('upload failed:', err);
|
||||||
|
}
|
||||||
|
console.log('Upload successful! Server responded with:', body);
|
||||||
|
});
|
||||||
|
```
|
||||||
|
<!--
|
||||||
|
|
||||||
|
For advanced cases, you can access the form-data object itself via `r.form()`. This can be modified until the request is fired on the next cycle of the event-loop. (Note that this calling `form()` will clear the currently set form data for that request.)
|
||||||
|
|
||||||
|
```js
|
||||||
|
// NOTE: Advanced use-case, for normal use see 'formData' usage above
|
||||||
|
var r = request.post('http://service.com/upload', function optionalCallback(err, httpResponse, body) {...})
|
||||||
|
var form = r.form();
|
||||||
|
form.append('my_field', 'my_value');
|
||||||
|
form.append('my_buffer', Buffer.from([1, 2, 3]));
|
||||||
|
form.append('custom_file', fs.createReadStream(__dirname + '/unicycle.jpg'), {filename: 'unicycle.jpg'});
|
||||||
|
```
|
||||||
|
-->
|
||||||
|
|
||||||
|
See the [form-data README](https://github.com/form-data/form-data) for more information & examples.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## HTTP Authentication
|
||||||
|
|
||||||
|
<!--
|
||||||
|
request.get('http://some.server.com/').auth('username', 'password', false);
|
||||||
|
// or
|
||||||
|
request.get('http://some.server.com/').auth(null, null, true, 'bearerToken');
|
||||||
|
// or
|
||||||
|
-->
|
||||||
|
```js
|
||||||
|
request.get('http://some.server.com/', {
|
||||||
|
'auth': {
|
||||||
|
'user': 'username',
|
||||||
|
'pass': 'password',
|
||||||
|
'sendImmediately': false
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// or
|
||||||
|
request.get('http://some.server.com/', {
|
||||||
|
'auth': {
|
||||||
|
'bearer': 'bearerToken'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
If passed as an option, `auth` should be a hash containing values:
|
||||||
|
|
||||||
|
- `user` || `username`
|
||||||
|
- `pass` || `password`
|
||||||
|
- `bearer` (optional)
|
||||||
|
|
||||||
|
<!--
|
||||||
|
- `sendImmediately` (optional)
|
||||||
|
|
||||||
|
The method form takes parameters
|
||||||
|
`auth(username, password, sendImmediately, bearer)`.
|
||||||
|
|
||||||
|
`sendImmediately` defaults to `true`, which causes a basic or bearer
|
||||||
|
authentication header to be sent. If `sendImmediately` is `false`, then
|
||||||
|
`request` will retry with a proper authentication header after receiving a
|
||||||
|
`401` response from the server (which must contain a `WWW-Authenticate` header
|
||||||
|
indicating the required authentication method).
|
||||||
|
-->
|
||||||
|
|
||||||
|
Note that you can also specify basic authentication using the URL itself, as
|
||||||
|
detailed in [RFC 1738](http://www.ietf.org/rfc/rfc1738.txt). Simply pass the
|
||||||
|
`user:password` before the host with an `@` sign:
|
||||||
|
|
||||||
|
```js
|
||||||
|
var username = 'username',
|
||||||
|
password = 'password',
|
||||||
|
url = 'http://' + username + ':' + password + '@some.server.com';
|
||||||
|
|
||||||
|
request({url: url}, function (error, response, body) {
|
||||||
|
// Do more stuff with 'body' here
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Digest authentication is supported, but it only works with `sendImmediately`
|
||||||
|
set to `false`; otherwise `request` will send basic authentication on the
|
||||||
|
initial request, which will probably cause the request to fail.
|
||||||
|
-->
|
||||||
|
|
||||||
|
Bearer authentication is supported, and is activated when the `bearer` value is
|
||||||
|
available. The value may be either a `String` or a `Function` returning a
|
||||||
|
`String`. Using a function to supply the bearer token is particularly useful if
|
||||||
|
used in conjunction with `defaults` to allow a single function to supply the
|
||||||
|
last known token at the time of sending a request, or to compute one on the fly.
|
||||||
|
|
||||||
|
[back to top](#table-of-contents)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Custom HTTP Headers
|
||||||
|
|
||||||
|
HTTP Headers, such as `User-Agent`, can be set in the `options` object.
|
||||||
|
In the example below, we call the github API to find out the number
|
||||||
|
of stars and forks for the request repository. This requires a
|
||||||
|
custom `User-Agent` header as well as https.
|
||||||
|
|
||||||
|
```js
|
||||||
|
var request = require('request');
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
url: 'https://api.github.com/repos/request/request',
|
||||||
|
headers: {
|
||||||
|
'User-Agent': 'request'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function callback(error, response, body) {
|
||||||
|
if (!error && response.statusCode == 200) {
|
||||||
|
var info = JSON.parse(body);
|
||||||
|
console.log(info.stargazers_count + " Stars");
|
||||||
|
console.log(info.forks_count + " Forks");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
request(options, callback);
|
||||||
|
```
|
||||||
|
|
||||||
|
[back to top](#table-of-contents)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## UNIX Domain Sockets
|
||||||
|
|
||||||
|
`urequest` supports making requests to [UNIX Domain Sockets](https://en.wikipedia.org/wiki/Unix_domain_socket). To make one, use the following URL scheme:
|
||||||
|
|
||||||
|
```js
|
||||||
|
/* Pattern */ 'http://unix:SOCKET:PATH'
|
||||||
|
/* Example */ request.get('http://unix:/absolute/path/to/unix.socket:/request/path')
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: The `SOCKET` path is assumed to be absolute to the root of the host file system.
|
||||||
|
|
||||||
|
[back to top](#table-of-contents)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## request(options, callback)
|
||||||
|
|
||||||
|
The first argument can be either a `url` or an `options` object. The only required option is `uri`; all others are optional.
|
||||||
|
|
||||||
|
- `uri` || `url` - fully qualified uri or a parsed url object from `url.parse()`
|
||||||
|
- `method` - http method (default: `"GET"`)
|
||||||
|
- `headers` - http headers (default: `{}`)
|
||||||
|
|
||||||
|
<!-- TODO
|
||||||
|
- `baseUrl` - fully qualified uri string used as the base url. Most useful with `request.defaults`, for example when you want to do many requests to the same domain. If `baseUrl` is `https://example.com/api/`, then requesting `/end/point?test=true` will fetch `https://example.com/api/end/point?test=true`. When `baseUrl` is given, `uri` must also be a string.
|
||||||
|
-->
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
- `body` - entity body for PATCH, POST and PUT requests. Must be a `Buffer`, `String` or `ReadStream`. If `json` is `true`, then `body` must be a JSON-serializable object.
|
||||||
|
- `json` - sets `body` to JSON representation of value and adds `Content-type: application/json` header. Additionally, parses the response body as JSON.
|
||||||
|
|
||||||
|
<!-- TODO
|
||||||
|
- `form` - when passed an object or a querystring, this sets `body` to a querystring representation of value, and adds `Content-type: application/x-www-form-urlencoded` header. When passed no options, a `FormData` instance is returned (and is piped to request). See "Forms" section above.
|
||||||
|
- `formData` - data to pass for a `multipart/form-data` request. See
|
||||||
|
[Forms](#forms) section above.
|
||||||
|
- `multipart` - array of objects which contain their own headers and `body`
|
||||||
|
attributes. Sends a `multipart/related` request. See [Forms](#forms) section
|
||||||
|
above.
|
||||||
|
- Alternatively you can pass in an object `{chunked: false, data: []}` where
|
||||||
|
`chunked` is used to specify whether the request is sent in
|
||||||
|
[chunked transfer encoding](https://en.wikipedia.org/wiki/Chunked_transfer_encoding)
|
||||||
|
In non-chunked requests, data items with body streams are not allowed.
|
||||||
|
- `preambleCRLF` - append a newline/CRLF before the boundary of your `multipart/form-data` request.
|
||||||
|
- `postambleCRLF` - append a newline/CRLF at the end of the boundary of your `multipart/form-data` request.
|
||||||
|
- `jsonReviver` - a [reviver function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) that will be passed to `JSON.parse()` when parsing a JSON response body.
|
||||||
|
- `jsonReplacer` - a [replacer function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) that will be passed to `JSON.stringify()` when stringifying a JSON request body.
|
||||||
|
-->
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
- `followRedirect` - follow HTTP 3xx responses as redirects (default: `true`). This property can also be implemented as function which gets `response` object as a single argument and should return `true` if redirects should continue or `false` otherwise.
|
||||||
|
- `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects (default: `false`)
|
||||||
|
- `followOriginalHttpMethod` - by default we redirect to HTTP method GET. you can enable this property to redirect to the original HTTP method (default: `false`)
|
||||||
|
- `maxRedirects` - the maximum number of redirects to follow (default: `10`)
|
||||||
|
- `removeRefererHeader` - removes the referer header when a redirect happens (default: `false`). **Note:** if true, referer header set in the initial request is preserved during redirect chain.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
- `encoding` - encoding to be used on `setEncoding` of response data. If `null`, the `body` is returned as a `Buffer`. Anything else **(including the default value of `undefined`)** will be passed as the [encoding](http://nodejs.org/api/buffer.html#buffer_buffer) parameter to `toString()` (meaning this is effectively `utf8` by default). (**Note:** if you expect binary data, you should set `encoding: null`.)
|
||||||
|
|
||||||
|
<!-- TODO
|
||||||
|
- `gzip` - if `true`, add an `Accept-Encoding` header to request compressed content encodings from the server (if not already present) and decode supported content encodings in the response. **Note:** Automatic decoding of the response content is performed on the body data returned through `request` (both through the `request` stream and passed to the callback function) but is not performed on the `response` stream (available from the `response` event) which is the unmodified `http.IncomingMessage` object which may contain compressed data. See example below.
|
||||||
|
- `jar` - if `true`, remember cookies for future use (or define your custom cookie jar; see examples section)
|
||||||
|
-->
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Convenience methods
|
||||||
|
|
||||||
|
There are also shorthand methods for different HTTP METHODs and some other conveniences.
|
||||||
|
|
||||||
|
### request.defaults(options)
|
||||||
|
|
||||||
|
This method **returns a wrapper** around the normal request API that defaults
|
||||||
|
to whatever options you pass to it.
|
||||||
|
|
||||||
|
**Note:** `request.defaults()` **does not** modify the global request API;
|
||||||
|
instead, it **returns a wrapper** that has your default settings applied to it.
|
||||||
|
|
||||||
|
**Note:** You can call `.defaults()` on the wrapper that is returned from
|
||||||
|
`request.defaults` to add/override defaults that were previously defaulted.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
```js
|
||||||
|
//requests using baseRequest() will set the 'x-token' header
|
||||||
|
var baseRequest = request.defaults({
|
||||||
|
headers: {'x-token': 'my-token'}
|
||||||
|
})
|
||||||
|
|
||||||
|
//requests using specialRequest() will include the 'x-token' header set in
|
||||||
|
//baseRequest and will also include the 'special' header
|
||||||
|
var specialRequest = baseRequest.defaults({
|
||||||
|
headers: {special: 'special value'}
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### request.METHOD()
|
||||||
|
|
||||||
|
These HTTP method convenience functions act just like `request()` but with a default method already set for you:
|
||||||
|
|
||||||
|
- *request.get()*: Defaults to `method: "GET"`.
|
||||||
|
- *request.post()*: Defaults to `method: "POST"`.
|
||||||
|
- *request.put()*: Defaults to `method: "PUT"`.
|
||||||
|
- *request.patch()*: Defaults to `method: "PATCH"`.
|
||||||
|
- *request.del() / request.delete()*: Defaults to `method: "DELETE"`.
|
||||||
|
- *request.head()*: Defaults to `method: "HEAD"`.
|
||||||
|
- *request.options()*: Defaults to `method: "OPTIONS"`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Debugging
|
||||||
|
|
||||||
|
There are at least <!--three--> two ways to debug the operation of `request`:
|
||||||
|
|
||||||
|
1. Launch the node process like `NODE_DEBUG=urequest node script.js`
|
||||||
|
(`lib,request,otherlib` works too).
|
||||||
|
|
||||||
|
2. Set `require('@coolaj86/urequest').debug = true` at any time (this does the same thing
|
||||||
|
as #1).
|
||||||
|
|
||||||
|
<!-- TODO
|
||||||
|
3. Use the [request-debug module](https://github.com/request/request-debug) to
|
||||||
|
view request and response headers and bodies.
|
||||||
|
|
||||||
|
[back to top](#table-of-contents)
|
||||||
|
-->
|
||||||
|
|
||||||
|
[back to top](#table-of-contents)
|
425
express-server/node_modules/@coolaj86/urequest/index.js
generated
vendored
Normal file
425
express-server/node_modules/@coolaj86/urequest/index.js
generated
vendored
Normal file
@ -0,0 +1,425 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var http = require('http');
|
||||||
|
var https = require('https');
|
||||||
|
var url = require('url');
|
||||||
|
|
||||||
|
function debug() {
|
||||||
|
if (module.exports.debug) {
|
||||||
|
console.log.apply(console, arguments);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function mergeOrDelete(defaults, updates) {
|
||||||
|
Object.keys(defaults).forEach(function (key) {
|
||||||
|
if (!(key in updates)) {
|
||||||
|
updates[key] = defaults[key];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// neither accept the prior default nor define an explicit value
|
||||||
|
// CRDT probs...
|
||||||
|
if ('undefined' === typeof updates[key]) {
|
||||||
|
delete updates[key];
|
||||||
|
} else if ('object' === typeof defaults[key] && 'object' === typeof updates[key]) {
|
||||||
|
updates[key] = mergeOrDelete(defaults[key], updates[key]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return updates;
|
||||||
|
}
|
||||||
|
|
||||||
|
// retrieves an existing header, case-sensitive
|
||||||
|
function getHeaderName(reqOpts, header) {
|
||||||
|
var headerNames = {};
|
||||||
|
Object.keys(reqOpts.headers).forEach(function (casedName) {
|
||||||
|
headerNames[casedName.toLowerCase()] = casedName;
|
||||||
|
});
|
||||||
|
// returns the key, which in erroneous cases could be an empty string
|
||||||
|
return headerNames[header.toLowerCase()];
|
||||||
|
}
|
||||||
|
// returns whether or not a header exists, case-insensitive
|
||||||
|
function hasHeader(reqOpts, header) {
|
||||||
|
return 'undefined' !== typeof getHeaderName(reqOpts, header);
|
||||||
|
}
|
||||||
|
|
||||||
|
function toJSONifier(keys) {
|
||||||
|
|
||||||
|
return function () {
|
||||||
|
var obj = {};
|
||||||
|
var me = this;
|
||||||
|
|
||||||
|
keys.forEach(function (key) {
|
||||||
|
if (me[key] && 'function' === typeof me[key].toJSON) {
|
||||||
|
obj[key] = me[key].toJSON();
|
||||||
|
} else {
|
||||||
|
obj[key] = me[key];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function setDefaults(defs) {
|
||||||
|
defs = defs || {};
|
||||||
|
|
||||||
|
function urequestHelper(opts, cb) {
|
||||||
|
debug("\n[urequest] processed options:");
|
||||||
|
debug(opts);
|
||||||
|
|
||||||
|
function onResponse(resp) {
|
||||||
|
var followRedirect;
|
||||||
|
|
||||||
|
Object.keys(defs).forEach(function (key) {
|
||||||
|
if (key in opts && 'undefined' !== typeof opts[key]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
opts[key] = defs[key];
|
||||||
|
});
|
||||||
|
followRedirect = opts.followRedirect;
|
||||||
|
|
||||||
|
resp.toJSON = toJSONifier([ 'statusCode', 'body', 'headers', 'request' ]);
|
||||||
|
|
||||||
|
resp.request = req;
|
||||||
|
resp.request.uri = url.parse(opts.url);
|
||||||
|
//resp.request.method = opts.method;
|
||||||
|
resp.request.headers = finalOpts.headers;
|
||||||
|
resp.request.toJSON = toJSONifier([ 'uri', 'method', 'headers' ]);
|
||||||
|
|
||||||
|
if (followRedirect && resp.headers.location && -1 !== [ 301, 302, 307, 308 ].indexOf(resp.statusCode)) {
|
||||||
|
debug('Following redirect: ' + resp.headers.location);
|
||||||
|
if ('GET' !== opts.method && !opts.followAllRedirects) {
|
||||||
|
followRedirect = false;
|
||||||
|
}
|
||||||
|
if (opts._redirectCount >= opts.maxRedirects) {
|
||||||
|
followRedirect = false;
|
||||||
|
}
|
||||||
|
if ('function' === opts.followRedirect) {
|
||||||
|
if (!opts.followRedirect(resp)) {
|
||||||
|
followRedirect = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (followRedirect) {
|
||||||
|
if (!opts.followOriginalHttpMethod) {
|
||||||
|
opts.method = 'GET';
|
||||||
|
opts.body = null;
|
||||||
|
delete opts.headers[getHeaderName(opts, 'Content-Length')];
|
||||||
|
delete opts.headers[getHeaderName(opts, 'Transfer-Encoding')];
|
||||||
|
}
|
||||||
|
if (opts.removeRefererHeader && opts.headers) {
|
||||||
|
delete opts.headers.referer;
|
||||||
|
}
|
||||||
|
// TODO needs baseUrl, maybe test for host / socketPath?
|
||||||
|
opts.url = resp.headers.location;
|
||||||
|
opts.uri = url.parse(opts.url);
|
||||||
|
return urequestHelper(opts, cb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (null === opts.encoding) {
|
||||||
|
resp._body = [];
|
||||||
|
} else {
|
||||||
|
resp.body = '';
|
||||||
|
}
|
||||||
|
resp._bodyLength = 0;
|
||||||
|
resp.on('data', function (chunk) {
|
||||||
|
if ('string' === typeof resp.body) {
|
||||||
|
resp.body += chunk.toString(opts.encoding);
|
||||||
|
} else {
|
||||||
|
resp._body.push(chunk);
|
||||||
|
resp._bodyLength += chunk.length;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
resp.on('end', function () {
|
||||||
|
if ('string' !== typeof resp.body) {
|
||||||
|
if (1 === resp._body.length) {
|
||||||
|
resp.body = resp._body[0];
|
||||||
|
} else {
|
||||||
|
resp.body = Buffer.concat(resp._body, resp._bodyLength);
|
||||||
|
}
|
||||||
|
resp._body = null;
|
||||||
|
}
|
||||||
|
if (opts.json && 'string' === typeof resp.body) {
|
||||||
|
// TODO I would parse based on Content-Type
|
||||||
|
// but request.js doesn't do that.
|
||||||
|
try {
|
||||||
|
resp.body = JSON.parse(resp.body);
|
||||||
|
} catch(e) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
debug("\n[urequest] resp.toJSON():");
|
||||||
|
debug(resp.toJSON());
|
||||||
|
cb(null, resp, resp.body);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var req;
|
||||||
|
var finalOpts = {};
|
||||||
|
var _body;
|
||||||
|
var MyFormData;
|
||||||
|
var form;
|
||||||
|
var formHeaders;
|
||||||
|
var requester;
|
||||||
|
|
||||||
|
if (opts.body) {
|
||||||
|
if (true === opts.json) {
|
||||||
|
_body = JSON.stringify(opts.body);
|
||||||
|
} else {
|
||||||
|
_body = opts.body;
|
||||||
|
}
|
||||||
|
} else if (opts.json && true !== opts.json) {
|
||||||
|
_body = JSON.stringify(opts.json);
|
||||||
|
} else if (opts.form) {
|
||||||
|
_body = Object.keys(opts.form).filter(function (key) {
|
||||||
|
if ('undefined' !== typeof opts.form[key]) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}).map(function (key) {
|
||||||
|
return encodeURIComponent(key) + '=' + encodeURIComponent(String(opts.form[key]));
|
||||||
|
}).join('&');
|
||||||
|
opts.headers['Content-Type'] = 'application/x-www-form-urlencoded';
|
||||||
|
}
|
||||||
|
if ('string' === typeof _body) {
|
||||||
|
_body = Buffer.from(_body);
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.keys(opts.uri).forEach(function (key) {
|
||||||
|
finalOpts[key] = opts.uri[key];
|
||||||
|
});
|
||||||
|
finalOpts.method = opts.method;
|
||||||
|
finalOpts.headers = JSON.parse(JSON.stringify(opts.headers));
|
||||||
|
if (_body) {
|
||||||
|
// Most APIs expect (or require) Content-Length except in the case of multipart uploads
|
||||||
|
// Transfer-Encoding: Chunked (the default) is generally only well-supported downstream
|
||||||
|
finalOpts.headers['Content-Length'] = _body.byteLength || _body.length;
|
||||||
|
}
|
||||||
|
if (opts.auth) {
|
||||||
|
// if opts.uri specifies auth it will be parsed by url.parse and passed directly to the http module
|
||||||
|
if ('string' !== typeof opts.auth) {
|
||||||
|
opts.auth = (opts.auth.user||opts.auth.username||'') + ':' + (opts.auth.pass||opts.auth.password||'');
|
||||||
|
}
|
||||||
|
if ('string' === typeof opts.auth) {
|
||||||
|
finalOpts.auth = opts.auth;
|
||||||
|
}
|
||||||
|
if (false === opts.sendImmediately) {
|
||||||
|
console.warn("[Warn] setting `sendImmediately: false` is not yet supported. Please open an issue if this is an important feature that you need.");
|
||||||
|
}
|
||||||
|
if (opts.bearer) {
|
||||||
|
// having a shortcut for base64 encoding makes sense, but this? Eh, whatevs...
|
||||||
|
finalOpts.header.Authorization = 'Bearer: ' + opts.bearer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (opts.formData) {
|
||||||
|
try {
|
||||||
|
MyFormData = opts.FormData || require('form-data');
|
||||||
|
// potential options https://github.com/felixge/node-combined-stream/blob/master/lib/combined_stream.js#L7-L15
|
||||||
|
} catch(e) {
|
||||||
|
console.error("urequest does not include extra dependencies by default");
|
||||||
|
console.error("if you need to use 'form-data' you may install it, like so:");
|
||||||
|
console.error(" npm install --save form-data");
|
||||||
|
cb(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
form = new MyFormData();
|
||||||
|
Object.keys(opts.formData).forEach(function (key) {
|
||||||
|
function add(key, data, opts) {
|
||||||
|
if (data.value) { opts = data.options; data = data.value; }
|
||||||
|
form.append(key, data, opts);
|
||||||
|
}
|
||||||
|
if (Array.isArray(opts.formData[key])) {
|
||||||
|
opts.formData[key].forEach(function (data) {
|
||||||
|
add(key, data);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
add(key, opts.formData[key]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch(e) {
|
||||||
|
cb(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
formHeaders = form.getHeaders();
|
||||||
|
Object.keys(formHeaders).forEach(function (header) {
|
||||||
|
finalOpts.headers[header] = formHeaders[header];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO support unix sockets
|
||||||
|
if ('https:' === finalOpts.protocol) {
|
||||||
|
// https://nodejs.org/api/https.html#https_https_request_options_callback
|
||||||
|
debug("\n[urequest] https.request(opts):");
|
||||||
|
debug(finalOpts);
|
||||||
|
requester = https;
|
||||||
|
} else if ('http:' === finalOpts.protocol) {
|
||||||
|
// https://nodejs.org/api/http.html#http_http_request_options_callback
|
||||||
|
debug("\n[urequest] http.request(opts):");
|
||||||
|
debug(finalOpts);
|
||||||
|
requester = http;
|
||||||
|
} else {
|
||||||
|
cb(new Error("unknown protocol: '" + opts.uri.protocol + "'"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (form) {
|
||||||
|
debug("\n[urequest] '" + finalOpts.method + "' (request) form");
|
||||||
|
debug(formHeaders);
|
||||||
|
// generally uploads don't use Chunked Encoding (some systems have issues with it)
|
||||||
|
// and I don't want to do the work to calculate the content-lengths. This seems to work.
|
||||||
|
req = form.submit(finalOpts, function (err, resp) {
|
||||||
|
if (err) { cb(err); return; }
|
||||||
|
onResponse(resp);
|
||||||
|
resp.resume();
|
||||||
|
});
|
||||||
|
//req = requester.request(finalOpts, onResponse);
|
||||||
|
//req.on('error', cb);
|
||||||
|
//form.pipe(req);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
req = requester.request(finalOpts, onResponse);
|
||||||
|
req.on('error', cb);
|
||||||
|
|
||||||
|
if (_body) {
|
||||||
|
debug("\n[urequest] '" + finalOpts.method + "' (request) body");
|
||||||
|
debug(_body);
|
||||||
|
// used for chunked encoding
|
||||||
|
//req.write(_body);
|
||||||
|
// used for known content-length
|
||||||
|
req.end(_body);
|
||||||
|
} else {
|
||||||
|
req.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseUrl(str) {
|
||||||
|
var obj = url.parse(str);
|
||||||
|
var paths;
|
||||||
|
if ('unix' !== (obj.hostname||obj.host||'').toLowerCase()) {
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
obj.href = null;
|
||||||
|
obj.hostname = obj.host = null;
|
||||||
|
|
||||||
|
paths = (obj.pathname||obj.path||'').split(':');
|
||||||
|
|
||||||
|
obj.socketPath = paths.shift();
|
||||||
|
obj.pathname = obj.path = paths.join(':');
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
function urequest(opts, cb) {
|
||||||
|
debug("\n[urequest] received options:");
|
||||||
|
debug(opts);
|
||||||
|
var reqOpts = {};
|
||||||
|
// request.js behavior:
|
||||||
|
// encoding: null + json ? unknown
|
||||||
|
// json => attempt to parse, fail silently
|
||||||
|
// encoding => buffer.toString(encoding)
|
||||||
|
// null === encoding => Buffer.concat(buffers)
|
||||||
|
if ('string' === typeof opts) {
|
||||||
|
opts = { url: opts };
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports._keys.forEach(function (key) {
|
||||||
|
if (key in opts && 'undefined' !== typeof opts[key]) {
|
||||||
|
reqOpts[key] = opts[key];
|
||||||
|
} else if (key in defs) {
|
||||||
|
reqOpts[key] = defs[key];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// TODO url.resolve(defs.baseUrl, opts.url);
|
||||||
|
if ('string' === typeof opts.url || 'string' === typeof opts.uri) {
|
||||||
|
if ('string' === typeof opts.url) {
|
||||||
|
reqOpts.url = opts.url;
|
||||||
|
reqOpts.uri = parseUrl(opts.url);
|
||||||
|
} else if ('string' === typeof opts.uri) {
|
||||||
|
reqOpts.url = opts.uri;
|
||||||
|
reqOpts.uri = parseUrl(opts.uri);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ('object' === typeof opts.uri) {
|
||||||
|
reqOpts.url = url.format(opts.uri);
|
||||||
|
reqOpts.uri = opts.uri;
|
||||||
|
//reqOpts.uri = url.parse(reqOpts.uri);
|
||||||
|
} else if ('object' === typeof opts.url) {
|
||||||
|
reqOpts.url = url.format(opts.url);
|
||||||
|
reqOpts.uri = opts.url;
|
||||||
|
//reqOpts.uri = url.parse(reqOpts.url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opts.body || 'string' === typeof opts.json || opts.form || opts.formData) {
|
||||||
|
// TODO this is probably a deviation from request's API
|
||||||
|
// need to check and probably eliminate it
|
||||||
|
reqOpts.method = (reqOpts.method || 'POST').toUpperCase();
|
||||||
|
} else {
|
||||||
|
reqOpts.method = (reqOpts.method || 'GET').toUpperCase();
|
||||||
|
}
|
||||||
|
if (!reqOpts.headers) {
|
||||||
|
reqOpts.headers = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
// crazy case for easier testing
|
||||||
|
if (!hasHeader(reqOpts, 'CoNTeNT-TyPe')) {
|
||||||
|
if ((true === reqOpts.json && reqOpts.body)
|
||||||
|
|| (true !== reqOpts.json && reqOpts.json)) {
|
||||||
|
reqOpts.headers['Content-Type'] = 'application/json';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return urequestHelper(reqOpts, cb);
|
||||||
|
}
|
||||||
|
|
||||||
|
urequest.defaults = function (_defs) {
|
||||||
|
_defs = mergeOrDelete(defs, _defs);
|
||||||
|
return setDefaults(_defs);
|
||||||
|
};
|
||||||
|
[ 'get', 'put', 'post', 'patch', 'delete', 'head', 'options' ].forEach(function (method) {
|
||||||
|
urequest[method] = function (obj) {
|
||||||
|
if ('string' === typeof obj) {
|
||||||
|
obj = { url: obj };
|
||||||
|
}
|
||||||
|
obj.method = method.toUpperCase();
|
||||||
|
urequest(obj);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
urequest.del = urequest.delete;
|
||||||
|
|
||||||
|
return urequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
var _defaults = {
|
||||||
|
sendImmediately: true
|
||||||
|
, method: 'GET'
|
||||||
|
, headers: {}
|
||||||
|
, useQuerystring: false
|
||||||
|
, followRedirect: true
|
||||||
|
, followAllRedirects: false
|
||||||
|
, followOriginalHttpMethod: false
|
||||||
|
, maxRedirects: 10
|
||||||
|
, removeRefererHeader: false
|
||||||
|
//, encoding: undefined
|
||||||
|
, gzip: false
|
||||||
|
//, body: undefined
|
||||||
|
//, json: undefined
|
||||||
|
};
|
||||||
|
module.exports = setDefaults(_defaults);
|
||||||
|
|
||||||
|
module.exports._keys = Object.keys(_defaults).concat([
|
||||||
|
'encoding'
|
||||||
|
, 'body'
|
||||||
|
, 'json'
|
||||||
|
, 'form'
|
||||||
|
, 'auth'
|
||||||
|
, 'formData'
|
||||||
|
, 'FormData'
|
||||||
|
]);
|
||||||
|
module.exports.debug = (-1 !== (process.env.NODE_DEBUG||'').split(/\s+/g).indexOf('urequest'));
|
||||||
|
|
||||||
|
debug("DEBUG ON for urequest");
|
90
express-server/node_modules/@coolaj86/urequest/package.json
generated
vendored
Normal file
90
express-server/node_modules/@coolaj86/urequest/package.json
generated
vendored
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
{
|
||||||
|
"_args": [
|
||||||
|
[
|
||||||
|
"@coolaj86/urequest@^1.3.6",
|
||||||
|
"/nodeapps/https-test/greenlock-express.js/node_modules/acme-v2"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"_from": "@coolaj86/urequest@>=1.3.6 <2.0.0",
|
||||||
|
"_id": "@coolaj86/urequest@1.3.6",
|
||||||
|
"_inCache": true,
|
||||||
|
"_installable": true,
|
||||||
|
"_location": "/@coolaj86/urequest",
|
||||||
|
"_nodeVersion": "10.6.0",
|
||||||
|
"_npmOperationalInternal": {
|
||||||
|
"host": "s3://npm-registry-packages",
|
||||||
|
"tmp": "tmp/urequest_1.3.6_1531386792567_0.12131716051599817"
|
||||||
|
},
|
||||||
|
"_npmUser": {
|
||||||
|
"email": "coolaj86@gmail.com",
|
||||||
|
"name": "coolaj86"
|
||||||
|
},
|
||||||
|
"_npmVersion": "6.1.0",
|
||||||
|
"_phantomChildren": {},
|
||||||
|
"_requested": {
|
||||||
|
"name": "@coolaj86/urequest",
|
||||||
|
"raw": "@coolaj86/urequest@^1.3.6",
|
||||||
|
"rawSpec": "^1.3.6",
|
||||||
|
"scope": "@coolaj86",
|
||||||
|
"spec": ">=1.3.6 <2.0.0",
|
||||||
|
"type": "range"
|
||||||
|
},
|
||||||
|
"_requiredBy": [
|
||||||
|
"/acme-v2"
|
||||||
|
],
|
||||||
|
"_resolved": "https://registry.npmjs.org/@coolaj86/urequest/-/urequest-1.3.6.tgz",
|
||||||
|
"_shasum": "e962d62000d7786a3920e5ef2c863223353b2e7f",
|
||||||
|
"_shrinkwrap": null,
|
||||||
|
"_spec": "@coolaj86/urequest@^1.3.6",
|
||||||
|
"_where": "/nodeapps/https-test/greenlock-express.js/node_modules/acme-v2",
|
||||||
|
"author": {
|
||||||
|
"email": "coolaj86@gmail.com",
|
||||||
|
"name": "AJ ONeal",
|
||||||
|
"url": "https://coolaj86.com/"
|
||||||
|
},
|
||||||
|
"dependencies": {},
|
||||||
|
"description": "A lightweight drop-in replacement for request",
|
||||||
|
"devDependencies": {},
|
||||||
|
"directories": {
|
||||||
|
"example": "examples"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"fileCount": 4,
|
||||||
|
"integrity": "sha512-9rBXLFSb5D19opGeXdD/WuiFJsA4Pk2r8VUGEAeUZUxB1a2zB47K85BKAx3Gy9i4nZwg22ejlJA+q9DVrpQlbA==",
|
||||||
|
"npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbRxuoCRA9TVsSAnZWagAApwoP/1j5hEoPiQ8KUaczLwxA\ndecbvvUHz5ePW/gpccAfZkjlQzJozZx+PUlpJGFE2ees6lmSjtoW3kq8bAQU\n/BOtmSGUy1VLmDsj1hJ2NVRXSxa9B7ujUzfbxUgL8zOe0/c/rnx3/gEsRg0I\nML9GyogGHbvVx86EdFLYvAo5Gnc6xpFnid/a5Dr7F60C4ACUakDt1jyeEVug\n6CqgU3I/Zw+7NUKWJebPvo7XxLuHi39ScrSMCNRfwEpXWTMpNW+Doz/2PTxv\nTuCXxktRyOjV6tGTv/aMaNqVVdkm2KQEmFfnukrspzEmopmovBMoIhalE0c9\nRwkuGANODSa6Fy6Fu1wU/RbNwgllTxHp+jYFKstenSw8b8/BOqz4P5kWHIAU\nZTd0vLXzY6yTWX7kPEMmq1wt3ydQmckcUzh3+3jIQSjoVZ2aNL+4y1ng/42P\nxQBktUzEUEawl2vSupTN7W6oFcTRHlQxbtQezZjeT5wyz5HWQF7j9s7JQIOO\nnha56Z22hQrmvkXqzDv9cOD3d/lWVWVYOx/PEEVyQVb+ITf21jWLpYu6XCUO\n5LwfK4c+bwJIjyB9I7cYUvxEPhDoXgS0/mft3jqo/WjS+zAOGQA2896PCCrf\n709nMBUAO1cmO2RXpJVU3iqXsfaT5F1IUJl7P0Wgo3bG0ZlCKJ+89z8WPY+h\nyhQm\r\n=ibEw\r\n-----END PGP SIGNATURE-----\r\n",
|
||||||
|
"shasum": "e962d62000d7786a3920e5ef2c863223353b2e7f",
|
||||||
|
"tarball": "https://registry.npmjs.org/@coolaj86/urequest/-/urequest-1.3.6.tgz",
|
||||||
|
"unpackedSize": 28820
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"lib"
|
||||||
|
],
|
||||||
|
"gitHead": "49daa68225e6f53685125ef9ccd0183221ed1b68",
|
||||||
|
"keywords": [
|
||||||
|
"alternative",
|
||||||
|
"call",
|
||||||
|
"http",
|
||||||
|
"https",
|
||||||
|
"lightweight",
|
||||||
|
"request"
|
||||||
|
],
|
||||||
|
"license": "(MIT OR Apache-2.0)",
|
||||||
|
"main": "index.js",
|
||||||
|
"maintainers": [
|
||||||
|
{
|
||||||
|
"name": "coolaj86",
|
||||||
|
"email": "coolaj86@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "@coolaj86/urequest",
|
||||||
|
"optionalDependencies": {},
|
||||||
|
"readme": "ERROR: No README data found!",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.ppl.family/ppl/urequest.js.git"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"version": "1.3.6"
|
||||||
|
}
|
18
express-server/node_modules/acme-v2/.jshintrc
generated
vendored
Normal file
18
express-server/node_modules/acme-v2/.jshintrc
generated
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{ "node": true
|
||||||
|
, "browser": true
|
||||||
|
, "jquery": true
|
||||||
|
, "globals": { "angular": true, "Promise": true }
|
||||||
|
|
||||||
|
, "indent": 2
|
||||||
|
, "onevar": true
|
||||||
|
, "laxcomma": true
|
||||||
|
, "laxbreak": true
|
||||||
|
, "curly": true
|
||||||
|
, "nonbsp": true
|
||||||
|
|
||||||
|
, "eqeqeq": true
|
||||||
|
, "immed": true
|
||||||
|
, "undef": true
|
||||||
|
, "unused": true
|
||||||
|
, "latedef": true
|
||||||
|
}
|
41
express-server/node_modules/acme-v2/LICENSE
generated
vendored
Normal file
41
express-server/node_modules/acme-v2/LICENSE
generated
vendored
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
Copyright 2018 AJ ONeal
|
||||||
|
|
||||||
|
This is open source software; you can redistribute it and/or modify it under the
|
||||||
|
terms of either:
|
||||||
|
|
||||||
|
a) the "MIT License"
|
||||||
|
b) the "Apache-2.0 License"
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
Apache-2.0 License Summary
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
221
express-server/node_modules/acme-v2/README.md
generated
vendored
Normal file
221
express-server/node_modules/acme-v2/README.md
generated
vendored
Normal file
@ -0,0 +1,221 @@
|
|||||||
|
| Sponsored by [ppl](https://ppl.family)
|
||||||
|
| **acme-v2.js** ([npm](https://www.npmjs.com/package/acme-v2))
|
||||||
|
| [acme-v2-cli.js](https://git.coolaj86.com/coolaj86/acme-v2-cli.js)
|
||||||
|
| [greenlock.js](https://git.coolaj86.com/coolaj86/greenlock.js)
|
||||||
|
| [goldilocks.js](https://git.coolaj86.com/coolaj86/goldilocks.js)
|
||||||
|
|
|
||||||
|
|
||||||
|
acme-v2.js
|
||||||
|
==========
|
||||||
|
|
||||||
|
A framework for building Let's Encrypt v2 (ACME draft 11) clients, successor to `le-acme-core.js`.
|
||||||
|
Built [by request](https://git.coolaj86.com/coolaj86/greenlock.js/issues/5#issuecomment-8).
|
||||||
|
|
||||||
|
## Looking for Quick 'n' Easy™?
|
||||||
|
|
||||||
|
If you're looking for an *ACME-enabled webserver*, try [goldilocks.js](https://git.coolaj86.com/coolaj86/goldilocks.js).
|
||||||
|
If you're looking to *build a webserver*, try [greenlock.js](https://git.coolaj86.com/coolaj86/greenlock.js).
|
||||||
|
|
||||||
|
* [greenlock.js](https://git.coolaj86.com/coolaj86/greenlock.js)
|
||||||
|
* [goldilocks.js](https://git.coolaj86.com/coolaj86/goldilocks.js)
|
||||||
|
|
||||||
|
## How to build ACME clients
|
||||||
|
|
||||||
|
As this is intended to build ACME clients, there is not a simple 2-line example.
|
||||||
|
|
||||||
|
I'd recommend first running the example CLI client with a test domain and then investigating the files used for that example:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node examples/cli.js
|
||||||
|
```
|
||||||
|
|
||||||
|
The example cli has the following prompts:
|
||||||
|
|
||||||
|
```
|
||||||
|
What web address(es) would you like to get certificates for? (ex: example.com,*.example.com)
|
||||||
|
What challenge will you be testing today? http-01 or dns-01? [http-01]
|
||||||
|
What email should we use? (optional)
|
||||||
|
What API style would you like to test? v1-compat or promise? [v1-compat]
|
||||||
|
|
||||||
|
Put the string 'mBfh0SqaAV3MOK3B6cAhCbIReAyDuwuxlO1Sl70x6bM.VNAzCR4THe4czVzo9piNn73B1ZXRLaB2CESwJfKkvRM' into a file at 'example.com/.well-known/acme-challenge/mBfh0SqaAV3MOK3B6cAhCbIReAyDuwuxlO1Sl70x6bM'
|
||||||
|
|
||||||
|
echo 'mBfh0SqaAV3MOK3B6cAhCbIReAyDuwuxlO1Sl70x6bM.VNAzCR4THe4czVzo9piNn73B1ZXRLaB2CESwJfKkvRM' > 'example.com/.well-known/acme-challenge/mBfh0SqaAV3MOK3B6cAhCbIReAyDuwuxlO1Sl70x6bM'
|
||||||
|
|
||||||
|
Then hit the 'any' key to continue...
|
||||||
|
```
|
||||||
|
|
||||||
|
When you've completed the challenge you can hit a key to continue the process.
|
||||||
|
|
||||||
|
If you place the certificate you receive back in `tests/fullchain.pem`
|
||||||
|
you can then test it with `examples/https-server.js`.
|
||||||
|
|
||||||
|
```
|
||||||
|
examples/cli.js
|
||||||
|
examples/genkeypair.js
|
||||||
|
tests/compat.js
|
||||||
|
examples/https-server.js
|
||||||
|
examples/http-server.js
|
||||||
|
```
|
||||||
|
|
||||||
|
## Let's Encrypt Directory URLs
|
||||||
|
|
||||||
|
```
|
||||||
|
# Production URL
|
||||||
|
https://acme-v02.api.letsencrypt.org/directory
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
# Staging URL
|
||||||
|
https://acme-staging-v02.api.letsencrypt.org/directory
|
||||||
|
```
|
||||||
|
|
||||||
|
## Two API versions, Two Implementations
|
||||||
|
|
||||||
|
This library (acme-v2.js) supports ACME [*draft 11*](https://tools.ietf.org/html/draft-ietf-acme-acme-11),
|
||||||
|
otherwise known as Let's Encrypt v2 (or v02).
|
||||||
|
|
||||||
|
* ACME draft 11
|
||||||
|
* Let's Encrypt v2
|
||||||
|
* Let's Encrypt v02
|
||||||
|
|
||||||
|
The predecessor (le-acme-core) supports Let's Encrypt v1 (or v01), which was a
|
||||||
|
[hodge-podge of various drafts](https://github.com/letsencrypt/boulder/blob/master/docs/acme-divergences.md)
|
||||||
|
of the ACME spec early on.
|
||||||
|
|
||||||
|
* ACME early draft
|
||||||
|
* Let's Encrypt v1
|
||||||
|
* Let's Encrypt v01
|
||||||
|
|
||||||
|
This library maintains compatibility with le-acme-core so that it can be used as a **drop-in replacement**
|
||||||
|
and requires **no changes to existing code**,
|
||||||
|
but also provides an updated API more congruent with draft 11.
|
||||||
|
|
||||||
|
## le-acme-core-compatible API (recommended)
|
||||||
|
|
||||||
|
Status: Stable, Locked, Bugfix-only
|
||||||
|
|
||||||
|
See Full Documentation at <https://git.coolaj86.com/coolaj86/le-acme-core.js>
|
||||||
|
|
||||||
|
```
|
||||||
|
var RSA = require('rsa-compat').RSA;
|
||||||
|
var acme = require('acme-v2/compat.js').ACME.create({ RSA: RSA });
|
||||||
|
|
||||||
|
//
|
||||||
|
// Use exactly the same as le-acme-core
|
||||||
|
//
|
||||||
|
```
|
||||||
|
|
||||||
|
## Promise API (dev)
|
||||||
|
|
||||||
|
Status: Almost stable, but **not semver locked**
|
||||||
|
|
||||||
|
This API is a simple evolution of le-acme-core,
|
||||||
|
but tries to provide a better mapping to the new draft 11 APIs.
|
||||||
|
|
||||||
|
```
|
||||||
|
// Create Instance (Dependency Injection)
|
||||||
|
var ACME = require('acme-v2').ACME.create({
|
||||||
|
RSA: require('rsa-compat').RSA
|
||||||
|
|
||||||
|
// other overrides
|
||||||
|
, request: require('request')
|
||||||
|
, promisify: require('util').promisify
|
||||||
|
|
||||||
|
// used for constructing user-agent
|
||||||
|
, os: require('os')
|
||||||
|
, process: require('process')
|
||||||
|
|
||||||
|
// used for overriding the default user-agent
|
||||||
|
, userAgent: 'My custom UA String'
|
||||||
|
, getUserAgentString: function (deps) { return 'My custom UA String'; }
|
||||||
|
|
||||||
|
|
||||||
|
// don't try to validate challenges locally
|
||||||
|
, skipChallengeTest: false
|
||||||
|
// ask if the certificate can be issued up to 10 times before failing
|
||||||
|
, retryPoll: 8
|
||||||
|
// ask if the certificate has been validated up to 6 times before cancelling
|
||||||
|
, retryPending: 4
|
||||||
|
// Wait 1000ms between retries
|
||||||
|
, retryInterval: 1000
|
||||||
|
// Wait 10,000ms after deauthorizing a challenge before retrying
|
||||||
|
, deauthWait: 10 * 1000
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// Discover Directory URLs
|
||||||
|
ACME.init(acmeDirectoryUrl) // returns Promise<acmeUrls={keyChange,meta,newAccount,newNonce,newOrder,revokeCert}>
|
||||||
|
|
||||||
|
|
||||||
|
// Accounts
|
||||||
|
ACME.accounts.create(options) // returns Promise<regr> registration data
|
||||||
|
|
||||||
|
{ email: '<email>' // valid email (server checks MX records)
|
||||||
|
, accountKeypair: { // privateKeyPem or privateKeyJwt
|
||||||
|
privateKeyPem: '<ASCII PEM>'
|
||||||
|
}
|
||||||
|
, agreeToTerms: fn (tosUrl) {} // returns Promise with tosUrl
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Registration
|
||||||
|
ACME.certificates.create(options) // returns Promise<pems={ privkey (key), cert, chain (ca) }>
|
||||||
|
|
||||||
|
{ newAuthzUrl: '<url>' // specify acmeUrls.newAuthz
|
||||||
|
, newCertUrl: '<url>' // specify acmeUrls.newCert
|
||||||
|
|
||||||
|
, domainKeypair: {
|
||||||
|
privateKeyPem: '<ASCII PEM>'
|
||||||
|
}
|
||||||
|
, accountKeypair: {
|
||||||
|
privateKeyPem: '<ASCII PEM>'
|
||||||
|
}
|
||||||
|
, domains: [ 'example.com' ]
|
||||||
|
|
||||||
|
, setChallenge: fn (hostname, key, val) // return Promise
|
||||||
|
, removeChallenge: fn (hostname, key) // return Promise
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Helpers & Stuff
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Constants
|
||||||
|
ACME.challengePrefixes['http-01'] // '/.well-known/acme-challenge'
|
||||||
|
ACME.challengePrefixes['dns-01'] // '_acme-challenge'
|
||||||
|
```
|
||||||
|
|
||||||
|
Changelog
|
||||||
|
---------
|
||||||
|
|
||||||
|
* v1.0.5 - cleanup logging
|
||||||
|
* v1.0.4 - v6- compat use `promisify` from node's util or bluebird
|
||||||
|
* v1.0.3 - documentation cleanup
|
||||||
|
* v1.0.2
|
||||||
|
* use `options.contact` to provide raw contact array
|
||||||
|
* made `options.email` optional
|
||||||
|
* file cleanup
|
||||||
|
* v1.0.1
|
||||||
|
* Compat API is ready for use
|
||||||
|
* Eliminate debug logging
|
||||||
|
* Apr 10, 2018 - tested backwards-compatibility using greenlock.js
|
||||||
|
* Apr 5, 2018 - export http and dns challenge tests
|
||||||
|
* Apr 5, 2018 - test http and dns challenges (success and failure)
|
||||||
|
* Apr 5, 2018 - test subdomains and its wildcard
|
||||||
|
* Apr 5, 2018 - test two subdomains
|
||||||
|
* Apr 5, 2018 - test wildcard
|
||||||
|
* Apr 5, 2018 - completely match api for acme v1 (le-acme-core.js)
|
||||||
|
* Mar 21, 2018 - *mostly* matches le-acme-core.js API
|
||||||
|
* Mar 21, 2018 - can now accept values (not hard coded)
|
||||||
|
* Mar 20, 2018 - SUCCESS - got a test certificate (hard-coded)
|
||||||
|
* Mar 20, 2018 - download certificate
|
||||||
|
* Mar 20, 2018 - poll for status
|
||||||
|
* Mar 20, 2018 - finalize order (submit csr)
|
||||||
|
* Mar 20, 2018 - generate domain keypair
|
||||||
|
* Mar 20, 2018 - respond to challenges
|
||||||
|
* Mar 16, 2018 - get challenges
|
||||||
|
* Mar 16, 2018 - new order
|
||||||
|
* Mar 15, 2018 - create account
|
||||||
|
* Mar 15, 2018 - generate account keypair
|
||||||
|
* Mar 15, 2018 - get nonce
|
||||||
|
* Mar 15, 2018 - get directory
|
77
express-server/node_modules/acme-v2/compat.js
generated
vendored
Normal file
77
express-server/node_modules/acme-v2/compat.js
generated
vendored
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
'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;
|
68
express-server/node_modules/acme-v2/examples/cli.js
generated
vendored
Normal file
68
express-server/node_modules/acme-v2/examples/cli.js
generated
vendored
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var RSA = require('rsa-compat').RSA;
|
||||||
|
var readline = require('readline');
|
||||||
|
var rl = readline.createInterface({
|
||||||
|
input: process.stdin,
|
||||||
|
output: process.stdout
|
||||||
|
});
|
||||||
|
|
||||||
|
require('./genkeypair.js');
|
||||||
|
|
||||||
|
function getWeb() {
|
||||||
|
rl.question('What web address(es) would you like to get certificates for? (ex: example.com,*.example.com) ', function (web) {
|
||||||
|
web = (web||'').trim().split(/,/g);
|
||||||
|
if (!web[0]) { getWeb(); return; }
|
||||||
|
|
||||||
|
if (web.some(function (w) { return '*' === w[0]; })) {
|
||||||
|
console.log('Wildcard domains must use dns-01');
|
||||||
|
getEmail(web, 'dns-01');
|
||||||
|
} else {
|
||||||
|
getChallengeType(web);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getChallengeType(web) {
|
||||||
|
rl.question('What challenge will you be testing today? http-01 or dns-01? [http-01] ', function (chType) {
|
||||||
|
chType = (chType||'').trim();
|
||||||
|
if (!chType) { chType = 'http-01'; }
|
||||||
|
|
||||||
|
getEmail(web, chType);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getEmail(web, chType) {
|
||||||
|
rl.question('What email should we use? (optional) ', function (email) {
|
||||||
|
email = (email||'').trim();
|
||||||
|
if (!email) { email = null; }
|
||||||
|
|
||||||
|
getApiStyle(web, chType, email);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getApiStyle(web, chType, email) {
|
||||||
|
var defaultStyle = 'compat';
|
||||||
|
rl.question('What API style would you like to test? v1-compat or promise? [v1-compat] ', function (apiStyle) {
|
||||||
|
apiStyle = (apiStyle||'').trim();
|
||||||
|
if (!apiStyle) { apiStyle = 'v1-compat'; }
|
||||||
|
|
||||||
|
rl.close();
|
||||||
|
|
||||||
|
var RSA = require('rsa-compat').RSA;
|
||||||
|
var accountKeypair = RSA.import({ privateKeyPem: require('fs').readFileSync(__dirname + '/../tests/account.privkey.pem') });
|
||||||
|
var domainKeypair = RSA.import({ privateKeyPem: require('fs').readFileSync(__dirname + '/../tests/privkey.pem') });
|
||||||
|
var directoryUrl = 'https://acme-staging-v02.api.letsencrypt.org/directory';
|
||||||
|
|
||||||
|
if ('promise' === apiStyle) {
|
||||||
|
require('../tests/promise.js').run(directoryUrl, RSA, web, chType, email, accountKeypair, domainKeypair);
|
||||||
|
} else if ('cb' === apiStyle) {
|
||||||
|
require('../tests/cb.js').run(directoryUrl, RSA, web, chType, email, accountKeypair, domainKeypair);
|
||||||
|
} else {
|
||||||
|
if ('v1-compat' !== apiStyle) { console.warn("Didn't understand '" + apiStyle + "', using 'v1-compat' instead..."); }
|
||||||
|
require('../tests/compat.js').run(directoryUrl, RSA, web, chType, email, accountKeypair, domainKeypair);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getWeb();
|
22
express-server/node_modules/acme-v2/examples/genkeypair.js
generated
vendored
Normal file
22
express-server/node_modules/acme-v2/examples/genkeypair.js
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
var RSA = require('rsa-compat').RSA;
|
||||||
|
var fs = require('fs');
|
||||||
|
|
||||||
|
if (!fs.existsSync(__dirname + '/../tests/account.privkey.pem')) {
|
||||||
|
RSA.generateKeypair(2048, 65537, {}, function (err, keypair) {
|
||||||
|
console.log(keypair);
|
||||||
|
var privkeyPem = RSA.exportPrivatePem(keypair)
|
||||||
|
console.log(privkeyPem);
|
||||||
|
|
||||||
|
fs.writeFileSync(__dirname + '/../tests/account.privkey.pem', privkeyPem);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!fs.existsSync(__dirname + '/../tests/privkey.pem')) {
|
||||||
|
RSA.generateKeypair(2048, 65537, {}, function (err, keypair) {
|
||||||
|
console.log(keypair);
|
||||||
|
var privkeyPem = RSA.exportPrivatePem(keypair)
|
||||||
|
console.log(privkeyPem);
|
||||||
|
|
||||||
|
fs.writeFileSync(__dirname + '/../tests/privkey.pem', privkeyPem);
|
||||||
|
});
|
||||||
|
}
|
7
express-server/node_modules/acme-v2/examples/http-server.js
generated
vendored
Normal file
7
express-server/node_modules/acme-v2/examples/http-server.js
generated
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var http = require('http');
|
||||||
|
var express = require('express');
|
||||||
|
var server = http.createServer(express.static('../tests')).listen(80, function () {
|
||||||
|
console.log('Listening on', this.address());
|
||||||
|
});
|
11
express-server/node_modules/acme-v2/examples/https-server.js
generated
vendored
Normal file
11
express-server/node_modules/acme-v2/examples/https-server.js
generated
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var https = require('https');
|
||||||
|
var server = https.createServer({
|
||||||
|
key: require('fs').readFileSync('../tests/privkey.pem')
|
||||||
|
, cert: require('fs').readFileSync('../tests/fullchain.pem')
|
||||||
|
}, function (req, res) {
|
||||||
|
res.end("Hello, World!");
|
||||||
|
}).listen(443, function () {
|
||||||
|
console.log('Listening on', this.address());
|
||||||
|
});
|
719
express-server/node_modules/acme-v2/node.js
generated
vendored
Normal file
719
express-server/node_modules/acme-v2/node.js
generated
vendored
Normal file
@ -0,0 +1,719 @@
|
|||||||
|
/*!
|
||||||
|
* acme-v2.js
|
||||||
|
* Copyright(c) 2018 AJ ONeal <aj@ppl.family> https://ppl.family
|
||||||
|
* Apache-2.0 OR MIT (and hence also MPL 2.0)
|
||||||
|
*/
|
||||||
|
'use strict';
|
||||||
|
/* globals Promise */
|
||||||
|
|
||||||
|
var ACME = module.exports.ACME = {};
|
||||||
|
|
||||||
|
ACME.formatPemChain = function formatPemChain(str) {
|
||||||
|
return str.trim().replace(/[\r\n]+/g, '\n').replace(/\-\n\-/g, '-\n\n-') + '\n';
|
||||||
|
};
|
||||||
|
ACME.splitPemChain = function splitPemChain(str) {
|
||||||
|
return str.trim().split(/[\r\n]{2,}/g).map(function (str) {
|
||||||
|
return str + '\n';
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
ACME.challengePrefixes = {
|
||||||
|
'http-01': '/.well-known/acme-challenge'
|
||||||
|
, 'dns-01': '_acme-challenge'
|
||||||
|
};
|
||||||
|
ACME.challengeTests = {
|
||||||
|
'http-01': function (me, auth) {
|
||||||
|
var url = 'http://' + auth.hostname + ACME.challengePrefixes['http-01'] + '/' + auth.token;
|
||||||
|
return me._request({ url: url }).then(function (resp) {
|
||||||
|
var err;
|
||||||
|
|
||||||
|
if (auth.keyAuthorization === resp.body.toString('utf8').trim()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = new Error(
|
||||||
|
"Error: Failed HTTP-01 Dry Run.\n"
|
||||||
|
+ "curl '" + url + "' does not return '" + auth.keyAuthorization + "'\n"
|
||||||
|
+ "See https://git.coolaj86.com/coolaj86/acme-v2.js/issues/4"
|
||||||
|
);
|
||||||
|
err.code = 'E_FAIL_DRY_CHALLENGE';
|
||||||
|
return Promise.reject(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
, 'dns-01': function (me, auth) {
|
||||||
|
var hostname = ACME.challengePrefixes['dns-01'] + '.' + auth.hostname;
|
||||||
|
return me._dig({
|
||||||
|
type: 'TXT'
|
||||||
|
, name: hostname
|
||||||
|
}).then(function (ans) {
|
||||||
|
var err;
|
||||||
|
|
||||||
|
if (ans.answer.some(function (txt) {
|
||||||
|
return auth.dnsAuthorization === txt.data[0];
|
||||||
|
})) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = new Error(
|
||||||
|
"Error: Failed DNS-01 Dry Run.\n"
|
||||||
|
+ "dig TXT '" + hostname + "' does not return '" + auth.dnsAuthorization + "'\n"
|
||||||
|
+ "See https://git.coolaj86.com/coolaj86/acme-v2.js/issues/4"
|
||||||
|
);
|
||||||
|
err.code = 'E_FAIL_DRY_CHALLENGE';
|
||||||
|
return Promise.reject(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ACME._getUserAgentString = function (deps) {
|
||||||
|
var uaDefaults = {
|
||||||
|
pkg: "Greenlock/" + deps.pkg.version
|
||||||
|
, os: "(" + deps.os.type() + "; " + deps.process.arch + " " + deps.os.platform() + " " + deps.os.release() + ")"
|
||||||
|
, node: "Node.js/" + deps.process.version
|
||||||
|
, user: ''
|
||||||
|
};
|
||||||
|
|
||||||
|
var userAgent = [];
|
||||||
|
|
||||||
|
//Object.keys(currentUAProps)
|
||||||
|
Object.keys(uaDefaults).forEach(function (key) {
|
||||||
|
if (uaDefaults[key]) {
|
||||||
|
userAgent.push(uaDefaults[key]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return userAgent.join(' ').trim();
|
||||||
|
};
|
||||||
|
ACME._directory = function (me) {
|
||||||
|
return me._request({ url: me.directoryUrl, json: true });
|
||||||
|
};
|
||||||
|
ACME._getNonce = function (me) {
|
||||||
|
if (me._nonce) { return new Promise(function (resolve) { resolve(me._nonce); return; }); }
|
||||||
|
return me._request({ method: 'HEAD', url: me._directoryUrls.newNonce }).then(function (resp) {
|
||||||
|
me._nonce = resp.toJSON().headers['replay-nonce'];
|
||||||
|
return me._nonce;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
// ACME RFC Section 7.3 Account Creation
|
||||||
|
/*
|
||||||
|
{
|
||||||
|
"protected": base64url({
|
||||||
|
"alg": "ES256",
|
||||||
|
"jwk": {...},
|
||||||
|
"nonce": "6S8IqOGY7eL2lsGoTZYifg",
|
||||||
|
"url": "https://example.com/acme/new-account"
|
||||||
|
}),
|
||||||
|
"payload": base64url({
|
||||||
|
"termsOfServiceAgreed": true,
|
||||||
|
"onlyReturnExisting": false,
|
||||||
|
"contact": [
|
||||||
|
"mailto:cert-admin@example.com",
|
||||||
|
"mailto:admin@example.com"
|
||||||
|
]
|
||||||
|
}),
|
||||||
|
"signature": "RZPOnYoPs1PhjszF...-nh6X1qtOFPB519I"
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
ACME._registerAccount = function (me, options) {
|
||||||
|
if (me.debug) { console.debug('[acme-v2] accounts.create'); }
|
||||||
|
|
||||||
|
return ACME._getNonce(me).then(function () {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
|
||||||
|
function agree(tosUrl) {
|
||||||
|
var err;
|
||||||
|
if (me._tos !== tosUrl) {
|
||||||
|
err = new Error("You must agree to the ToS at '" + me._tos + "'");
|
||||||
|
err.code = "E_AGREE_TOS";
|
||||||
|
reject(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var jwk = me.RSA.exportPublicJwk(options.accountKeypair);
|
||||||
|
var contact;
|
||||||
|
if (options.contact) {
|
||||||
|
contact = options.contact.slice(0);
|
||||||
|
} else if (options.email) {
|
||||||
|
contact = [ 'mailto:' + options.email ];
|
||||||
|
}
|
||||||
|
var body = {
|
||||||
|
termsOfServiceAgreed: tosUrl === me._tos
|
||||||
|
, onlyReturnExisting: false
|
||||||
|
, contact: contact
|
||||||
|
};
|
||||||
|
if (options.externalAccount) {
|
||||||
|
body.externalAccountBinding = me.RSA.signJws(
|
||||||
|
options.externalAccount.secret
|
||||||
|
, undefined
|
||||||
|
, { alg: "HS256"
|
||||||
|
, kid: options.externalAccount.id
|
||||||
|
, url: me._directoryUrls.newAccount
|
||||||
|
}
|
||||||
|
, Buffer.from(JSON.stringify(jwk))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
var payload = JSON.stringify(body);
|
||||||
|
var jws = me.RSA.signJws(
|
||||||
|
options.accountKeypair
|
||||||
|
, undefined
|
||||||
|
, { nonce: me._nonce
|
||||||
|
, alg: 'RS256'
|
||||||
|
, url: me._directoryUrls.newAccount
|
||||||
|
, jwk: jwk
|
||||||
|
}
|
||||||
|
, Buffer.from(payload)
|
||||||
|
);
|
||||||
|
|
||||||
|
delete jws.header;
|
||||||
|
if (me.debug) { console.debug('[acme-v2] accounts.create JSON body:'); }
|
||||||
|
if (me.debug) { console.debug(jws); }
|
||||||
|
me._nonce = null;
|
||||||
|
return me._request({
|
||||||
|
method: 'POST'
|
||||||
|
, url: me._directoryUrls.newAccount
|
||||||
|
, headers: { 'Content-Type': 'application/jose+json' }
|
||||||
|
, json: jws
|
||||||
|
}).then(function (resp) {
|
||||||
|
var account = resp.body;
|
||||||
|
|
||||||
|
if (2 !== Math.floor(resp.statusCode / 100)) {
|
||||||
|
throw new Error('account error: ' + JSON.stringify(body));
|
||||||
|
}
|
||||||
|
|
||||||
|
me._nonce = resp.toJSON().headers['replay-nonce'];
|
||||||
|
var location = resp.toJSON().headers.location;
|
||||||
|
// the account id url
|
||||||
|
me._kid = location;
|
||||||
|
if (me.debug) { console.debug('[DEBUG] new account location:'); }
|
||||||
|
if (me.debug) { console.debug(location); }
|
||||||
|
if (me.debug) { console.debug(resp.toJSON()); }
|
||||||
|
|
||||||
|
/*
|
||||||
|
{
|
||||||
|
contact: ["mailto:jon@example.com"],
|
||||||
|
orders: "https://some-url",
|
||||||
|
status: 'valid'
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
if (!account) { account = { _emptyResponse: true, key: {} }; }
|
||||||
|
// https://git.coolaj86.com/coolaj86/acme-v2.js/issues/8
|
||||||
|
if (!account.key) { account.key = {}; }
|
||||||
|
account.key.kid = me._kid;
|
||||||
|
return account;
|
||||||
|
}).then(resolve, reject);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (me.debug) { console.debug('[acme-v2] agreeToTerms'); }
|
||||||
|
if (1 === options.agreeToTerms.length) {
|
||||||
|
// newer promise API
|
||||||
|
return options.agreeToTerms(me._tos).then(agree, reject);
|
||||||
|
}
|
||||||
|
else if (2 === options.agreeToTerms.length) {
|
||||||
|
// backwards compat cb API
|
||||||
|
return options.agreeToTerms(me._tos, function (err, tosUrl) {
|
||||||
|
if (!err) { agree(tosUrl); return; }
|
||||||
|
reject(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
reject(new Error('agreeToTerms has incorrect function signature.'
|
||||||
|
+ ' Should be fn(tos) { return Promise<tos>; }'));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
POST /acme/new-order HTTP/1.1
|
||||||
|
Host: example.com
|
||||||
|
Content-Type: application/jose+json
|
||||||
|
|
||||||
|
{
|
||||||
|
"protected": base64url({
|
||||||
|
"alg": "ES256",
|
||||||
|
"kid": "https://example.com/acme/acct/1",
|
||||||
|
"nonce": "5XJ1L3lEkMG7tR6pA00clA",
|
||||||
|
"url": "https://example.com/acme/new-order"
|
||||||
|
}),
|
||||||
|
"payload": base64url({
|
||||||
|
"identifiers": [{"type:"dns","value":"example.com"}],
|
||||||
|
"notBefore": "2016-01-01T00:00:00Z",
|
||||||
|
"notAfter": "2016-01-08T00:00:00Z"
|
||||||
|
}),
|
||||||
|
"signature": "H6ZXtGjTZyUnPeKn...wEA4TklBdh3e454g"
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
ACME._getChallenges = function (me, options, auth) {
|
||||||
|
if (me.debug) { console.debug('\n[DEBUG] getChallenges\n'); }
|
||||||
|
return me._request({ method: 'GET', url: auth, json: true }).then(function (resp) {
|
||||||
|
return resp.body;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
ACME._wait = function wait(ms) {
|
||||||
|
return new Promise(function (resolve) {
|
||||||
|
setTimeout(resolve, (ms || 1100));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
// https://tools.ietf.org/html/draft-ietf-acme-acme-10#section-7.5.1
|
||||||
|
ACME._postChallenge = function (me, options, identifier, ch) {
|
||||||
|
var RETRY_INTERVAL = me.retryInterval || 1000;
|
||||||
|
var DEAUTH_INTERVAL = me.deauthWait || 10 * 1000;
|
||||||
|
var MAX_POLL = me.retryPoll || 8;
|
||||||
|
var MAX_PEND = me.retryPending || 4;
|
||||||
|
var count = 0;
|
||||||
|
|
||||||
|
var thumbprint = me.RSA.thumbprint(options.accountKeypair);
|
||||||
|
var keyAuthorization = ch.token + '.' + thumbprint;
|
||||||
|
// keyAuthorization = token || '.' || base64url(JWK_Thumbprint(accountKey))
|
||||||
|
// /.well-known/acme-challenge/:token
|
||||||
|
var auth = {
|
||||||
|
identifier: identifier
|
||||||
|
, hostname: identifier.value
|
||||||
|
, type: ch.type
|
||||||
|
, token: ch.token
|
||||||
|
, thumbprint: thumbprint
|
||||||
|
, keyAuthorization: keyAuthorization
|
||||||
|
, dnsAuthorization: me.RSA.utils.toWebsafeBase64(
|
||||||
|
require('crypto').createHash('sha256').update(keyAuthorization).digest('base64')
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
/*
|
||||||
|
POST /acme/authz/1234 HTTP/1.1
|
||||||
|
Host: example.com
|
||||||
|
Content-Type: application/jose+json
|
||||||
|
|
||||||
|
{
|
||||||
|
"protected": base64url({
|
||||||
|
"alg": "ES256",
|
||||||
|
"kid": "https://example.com/acme/acct/1",
|
||||||
|
"nonce": "xWCM9lGbIyCgue8di6ueWQ",
|
||||||
|
"url": "https://example.com/acme/authz/1234"
|
||||||
|
}),
|
||||||
|
"payload": base64url({
|
||||||
|
"status": "deactivated"
|
||||||
|
}),
|
||||||
|
"signature": "srX9Ji7Le9bjszhu...WTFdtujObzMtZcx4"
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
function deactivate() {
|
||||||
|
var jws = me.RSA.signJws(
|
||||||
|
options.accountKeypair
|
||||||
|
, undefined
|
||||||
|
, { nonce: me._nonce, alg: 'RS256', url: ch.url, kid: me._kid }
|
||||||
|
, Buffer.from(JSON.stringify({ "status": "deactivated" }))
|
||||||
|
);
|
||||||
|
me._nonce = null;
|
||||||
|
return me._request({
|
||||||
|
method: 'POST'
|
||||||
|
, url: ch.url
|
||||||
|
, headers: { 'Content-Type': 'application/jose+json' }
|
||||||
|
, json: jws
|
||||||
|
}).then(function (resp) {
|
||||||
|
if (me.debug) { console.debug('[acme-v2.js] deactivate:'); }
|
||||||
|
if (me.debug) { console.debug(resp.headers); }
|
||||||
|
if (me.debug) { console.debug(resp.body); }
|
||||||
|
if (me.debug) { console.debug(); }
|
||||||
|
|
||||||
|
me._nonce = resp.toJSON().headers['replay-nonce'];
|
||||||
|
if (me.debug) { console.debug('deactivate challenge: resp.body:'); }
|
||||||
|
if (me.debug) { console.debug(resp.body); }
|
||||||
|
return ACME._wait(DEAUTH_INTERVAL);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function pollStatus() {
|
||||||
|
if (count >= MAX_POLL) {
|
||||||
|
return Promise.reject(new Error("[acme-v2] stuck in bad pending/processing state"));
|
||||||
|
}
|
||||||
|
|
||||||
|
count += 1;
|
||||||
|
|
||||||
|
if (me.debug) { console.debug('\n[DEBUG] statusChallenge\n'); }
|
||||||
|
return me._request({ method: 'GET', url: ch.url, json: true }).then(function (resp) {
|
||||||
|
|
||||||
|
if ('processing' === resp.body.status) {
|
||||||
|
if (me.debug) { console.debug('poll: again'); }
|
||||||
|
return ACME._wait(RETRY_INTERVAL).then(pollStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This state should never occur
|
||||||
|
if ('pending' === resp.body.status) {
|
||||||
|
if (count >= MAX_PEND) {
|
||||||
|
return ACME._wait(RETRY_INTERVAL).then(deactivate).then(testChallenge);
|
||||||
|
}
|
||||||
|
if (me.debug) { console.debug('poll: again'); }
|
||||||
|
return ACME._wait(RETRY_INTERVAL).then(testChallenge);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ('valid' === resp.body.status) {
|
||||||
|
if (me.debug) { console.debug('poll: valid'); }
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (1 === options.removeChallenge.length) {
|
||||||
|
options.removeChallenge(auth).then(function () {}, function () {});
|
||||||
|
} else if (2 === options.removeChallenge.length) {
|
||||||
|
options.removeChallenge(auth, function (err) { return err; });
|
||||||
|
} else {
|
||||||
|
options.removeChallenge(identifier.value, ch.token, function () {});
|
||||||
|
}
|
||||||
|
} catch(e) {}
|
||||||
|
return resp.body;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!resp.body.status) {
|
||||||
|
console.error("[acme-v2] (E_STATE_EMPTY) empty challenge state:");
|
||||||
|
}
|
||||||
|
else if ('invalid' === resp.body.status) {
|
||||||
|
console.error("[acme-v2] (E_STATE_INVALID) challenge state: '" + resp.body.status + "'");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
console.error("[acme-v2] (E_STATE_UKN) challenge state: '" + resp.body.status + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.reject(new Error("[acme-v2] [error] unacceptable challenge state '" + resp.body.status + "'"));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function respondToChallenge() {
|
||||||
|
var jws = me.RSA.signJws(
|
||||||
|
options.accountKeypair
|
||||||
|
, undefined
|
||||||
|
, { nonce: me._nonce, alg: 'RS256', url: ch.url, kid: me._kid }
|
||||||
|
, Buffer.from(JSON.stringify({ }))
|
||||||
|
);
|
||||||
|
me._nonce = null;
|
||||||
|
return me._request({
|
||||||
|
method: 'POST'
|
||||||
|
, url: ch.url
|
||||||
|
, headers: { 'Content-Type': 'application/jose+json' }
|
||||||
|
, json: jws
|
||||||
|
}).then(function (resp) {
|
||||||
|
if (me.debug) { console.debug('[acme-v2.js] challenge accepted!'); }
|
||||||
|
if (me.debug) { console.debug(resp.headers); }
|
||||||
|
if (me.debug) { console.debug(resp.body); }
|
||||||
|
if (me.debug) { console.debug(); }
|
||||||
|
|
||||||
|
me._nonce = resp.toJSON().headers['replay-nonce'];
|
||||||
|
if (me.debug) { console.debug('respond to challenge: resp.body:'); }
|
||||||
|
if (me.debug) { console.debug(resp.body); }
|
||||||
|
return ACME._wait(RETRY_INTERVAL).then(pollStatus);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function testChallenge() {
|
||||||
|
// TODO put check dns / http checks here?
|
||||||
|
// http-01: GET https://example.org/.well-known/acme-challenge/{{token}} => {{keyAuth}}
|
||||||
|
// dns-01: TXT _acme-challenge.example.org. => "{{urlSafeBase64(sha256(keyAuth))}}"
|
||||||
|
|
||||||
|
if (me.debug) {console.debug('\n[DEBUG] postChallenge\n'); }
|
||||||
|
//if (me.debug) console.debug('\n[DEBUG] stop to fix things\n'); return;
|
||||||
|
|
||||||
|
return ACME._wait(RETRY_INTERVAL).then(function () {
|
||||||
|
if (!me.skipChallengeTest) {
|
||||||
|
return ACME.challengeTests[ch.type](me, auth);
|
||||||
|
}
|
||||||
|
}).then(respondToChallenge);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (1 === options.setChallenge.length) {
|
||||||
|
options.setChallenge(auth).then(testChallenge).then(resolve, reject);
|
||||||
|
} else if (2 === options.setChallenge.length) {
|
||||||
|
options.setChallenge(auth, function (err) {
|
||||||
|
if(err) {
|
||||||
|
reject(err);
|
||||||
|
} else {
|
||||||
|
testChallenge().then(resolve, reject);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
var challengeCb = function(err) {
|
||||||
|
if(err) {
|
||||||
|
reject(err);
|
||||||
|
} else {
|
||||||
|
testChallenge().then(resolve, reject);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Object.keys(auth).forEach(function (key) {
|
||||||
|
challengeCb[key] = auth[key];
|
||||||
|
});
|
||||||
|
options.setChallenge(identifier.value, ch.token, keyAuthorization, challengeCb);
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
reject(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
ACME._finalizeOrder = function (me, options, validatedDomains) {
|
||||||
|
if (me.debug) { console.debug('finalizeOrder:'); }
|
||||||
|
var csr = me.RSA.generateCsrWeb64(options.domainKeypair, validatedDomains);
|
||||||
|
var body = { csr: csr };
|
||||||
|
var payload = JSON.stringify(body);
|
||||||
|
|
||||||
|
function pollCert() {
|
||||||
|
var jws = me.RSA.signJws(
|
||||||
|
options.accountKeypair
|
||||||
|
, undefined
|
||||||
|
, { nonce: me._nonce, alg: 'RS256', url: me._finalize, kid: me._kid }
|
||||||
|
, Buffer.from(payload)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (me.debug) { console.debug('finalize:', me._finalize); }
|
||||||
|
me._nonce = null;
|
||||||
|
return me._request({
|
||||||
|
method: 'POST'
|
||||||
|
, url: me._finalize
|
||||||
|
, headers: { 'Content-Type': 'application/jose+json' }
|
||||||
|
, json: jws
|
||||||
|
}).then(function (resp) {
|
||||||
|
// https://tools.ietf.org/html/draft-ietf-acme-acme-12#section-7.1.3
|
||||||
|
// Possible values are: "pending" => ("invalid" || "ready") => "processing" => "valid"
|
||||||
|
me._nonce = resp.toJSON().headers['replay-nonce'];
|
||||||
|
|
||||||
|
if (me.debug) { console.debug('order finalized: resp.body:'); }
|
||||||
|
if (me.debug) { console.debug(resp.body); }
|
||||||
|
|
||||||
|
if ('valid' === resp.body.status) {
|
||||||
|
me._expires = resp.body.expires;
|
||||||
|
me._certificate = resp.body.certificate;
|
||||||
|
|
||||||
|
return resp.body; // return order
|
||||||
|
}
|
||||||
|
|
||||||
|
if ('processing' === resp.body.status) {
|
||||||
|
return ACME._wait().then(pollCert);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (me.debug) { console.debug("Error: bad status:\n" + JSON.stringify(resp.body, null, 2)); }
|
||||||
|
|
||||||
|
if ('pending' === resp.body.status) {
|
||||||
|
return Promise.reject(new Error(
|
||||||
|
"Did not finalize order: status 'pending'."
|
||||||
|
+ " Best guess: You have not accepted at least one challenge for each domain." + "\n\n"
|
||||||
|
+ JSON.stringify(resp.body, null, 2)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ('invalid' === resp.body.status) {
|
||||||
|
return Promise.reject(new Error(
|
||||||
|
"Did not finalize order: status 'invalid'."
|
||||||
|
+ " Best guess: One or more of the domain challenges could not be verified"
|
||||||
|
+ " (or the order was canceled)." + "\n\n"
|
||||||
|
+ JSON.stringify(resp.body, null, 2)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ('ready' === resp.body.status) {
|
||||||
|
return Promise.reject(new Error(
|
||||||
|
"Did not finalize order: status 'ready'."
|
||||||
|
+ " Hmmm... this state shouldn't be possible here. That was the last state."
|
||||||
|
+ " This one should at least be 'processing'." + "\n\n"
|
||||||
|
+ JSON.stringify(resp.body, null, 2) + "\n\n"
|
||||||
|
+ "Please open an issue at https://git.coolaj86.com/coolaj86/acme-v2.js"
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.reject(new Error(
|
||||||
|
"Didn't finalize order: Unhandled status '" + resp.body.status + "'."
|
||||||
|
+ " This is not one of the known statuses...\n\n"
|
||||||
|
+ JSON.stringify(resp.body, null, 2) + "\n\n"
|
||||||
|
+ "Please open an issue at https://git.coolaj86.com/coolaj86/acme-v2.js"
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return pollCert();
|
||||||
|
};
|
||||||
|
ACME._getCertificate = function (me, options) {
|
||||||
|
if (me.debug) { console.debug('[acme-v2] DEBUG get cert 1'); }
|
||||||
|
|
||||||
|
if (!options.challengeTypes) {
|
||||||
|
if (!options.challengeType) {
|
||||||
|
return Promise.reject(new Error("challenge type must be specified"));
|
||||||
|
}
|
||||||
|
options.challengeTypes = [ options.challengeType ];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!me._kid) {
|
||||||
|
if (options.accountKid) {
|
||||||
|
me._kid = options.accountKid;
|
||||||
|
} else {
|
||||||
|
//return Promise.reject(new Error("must include KeyID"));
|
||||||
|
return ACME._registerAccount(me, options).then(function () {
|
||||||
|
return ACME._getCertificate(me, options);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (me.debug) { console.debug('[acme-v2] certificates.create'); }
|
||||||
|
return ACME._getNonce(me).then(function () {
|
||||||
|
var body = {
|
||||||
|
identifiers: options.domains.map(function (hostname) {
|
||||||
|
return { type: "dns" , value: hostname };
|
||||||
|
})
|
||||||
|
//, "notBefore": "2016-01-01T00:00:00Z"
|
||||||
|
//, "notAfter": "2016-01-08T00:00:00Z"
|
||||||
|
};
|
||||||
|
|
||||||
|
var payload = JSON.stringify(body);
|
||||||
|
var jws = me.RSA.signJws(
|
||||||
|
options.accountKeypair
|
||||||
|
, undefined
|
||||||
|
, { nonce: me._nonce, alg: 'RS256', url: me._directoryUrls.newOrder, kid: me._kid }
|
||||||
|
, Buffer.from(payload)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (me.debug) { console.debug('\n[DEBUG] newOrder\n'); }
|
||||||
|
me._nonce = null;
|
||||||
|
return me._request({
|
||||||
|
method: 'POST'
|
||||||
|
, url: me._directoryUrls.newOrder
|
||||||
|
, headers: { 'Content-Type': 'application/jose+json' }
|
||||||
|
, json: jws
|
||||||
|
}).then(function (resp) {
|
||||||
|
me._nonce = resp.toJSON().headers['replay-nonce'];
|
||||||
|
var location = resp.toJSON().headers.location;
|
||||||
|
var auths;
|
||||||
|
if (me.debug) { console.debug(location); } // the account id url
|
||||||
|
if (me.debug) { console.debug(resp.toJSON()); }
|
||||||
|
me._authorizations = resp.body.authorizations;
|
||||||
|
me._order = location;
|
||||||
|
me._finalize = resp.body.finalize;
|
||||||
|
//if (me.debug) console.debug('[DEBUG] finalize:', me._finalize); return;
|
||||||
|
|
||||||
|
if (!me._authorizations) {
|
||||||
|
console.error("[acme-v2.js] authorizations were not fetched:");
|
||||||
|
console.error(resp.body);
|
||||||
|
return Promise.reject(new Error("authorizations were not fetched"));
|
||||||
|
}
|
||||||
|
if (me.debug) { console.debug("[acme-v2] POST newOrder has authorizations"); }
|
||||||
|
|
||||||
|
//return resp.body;
|
||||||
|
auths = me._authorizations.slice(0);
|
||||||
|
|
||||||
|
function next() {
|
||||||
|
var authUrl = auths.shift();
|
||||||
|
if (!authUrl) { return; }
|
||||||
|
|
||||||
|
return ACME._getChallenges(me, options, authUrl).then(function (results) {
|
||||||
|
// var domain = options.domains[i]; // results.identifier.value
|
||||||
|
var chType = options.challengeTypes.filter(function (chType) {
|
||||||
|
return results.challenges.some(function (ch) {
|
||||||
|
return ch.type === chType;
|
||||||
|
});
|
||||||
|
})[0];
|
||||||
|
|
||||||
|
var challenge = results.challenges.filter(function (ch) {
|
||||||
|
if (chType === ch.type) {
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
})[0];
|
||||||
|
|
||||||
|
if (!challenge) {
|
||||||
|
return Promise.reject(new Error("Server didn't offer any challenge we can handle."));
|
||||||
|
}
|
||||||
|
|
||||||
|
return ACME._postChallenge(me, options, results.identifier, challenge);
|
||||||
|
}).then(function () {
|
||||||
|
return next();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return next().then(function () {
|
||||||
|
if (me.debug) { console.debug("[getCertificate] next.then"); }
|
||||||
|
var validatedDomains = body.identifiers.map(function (ident) {
|
||||||
|
return ident.value;
|
||||||
|
});
|
||||||
|
|
||||||
|
return ACME._finalizeOrder(me, options, validatedDomains);
|
||||||
|
}).then(function (order) {
|
||||||
|
if (me.debug) { console.debug('acme-v2: order was finalized'); }
|
||||||
|
return me._request({ method: 'GET', url: me._certificate, json: true }).then(function (resp) {
|
||||||
|
if (me.debug) { console.debug('acme-v2: csr submitted and cert received:'); }
|
||||||
|
// https://github.com/certbot/certbot/issues/5721
|
||||||
|
var certsarr = ACME.splitPemChain(ACME.formatPemChain((resp.body||'')));
|
||||||
|
// cert, chain, fullchain, privkey, /*TODO, subject, altnames, issuedAt, expiresAt */
|
||||||
|
var certs = {
|
||||||
|
expires: order.expires
|
||||||
|
, identifiers: order.identifiers
|
||||||
|
//, authorizations: order.authorizations
|
||||||
|
, cert: certsarr.shift()
|
||||||
|
//, privkey: privkeyPem
|
||||||
|
, chain: certsarr.join('\n')
|
||||||
|
};
|
||||||
|
if (me.debug) { console.debug(certs); }
|
||||||
|
return certs;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
ACME.create = function create(me) {
|
||||||
|
if (!me) { me = {}; }
|
||||||
|
// me.debug = true;
|
||||||
|
me.challengePrefixes = ACME.challengePrefixes;
|
||||||
|
me.RSA = me.RSA || require('rsa-compat').RSA;
|
||||||
|
me.request = me.request || require('@coolaj86/urequest');
|
||||||
|
me._dig = function (query) {
|
||||||
|
// TODO use digd.js
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
var dns = require('dns');
|
||||||
|
dns.resolveTxt(query.name, function (err, records) {
|
||||||
|
if (err) { reject(err); return; }
|
||||||
|
|
||||||
|
resolve({
|
||||||
|
answer: records.map(function (rr) {
|
||||||
|
return {
|
||||||
|
data: rr
|
||||||
|
};
|
||||||
|
})
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
me.promisify = me.promisify || require('util').promisify /*node v8+*/ || require('bluebird').promisify /*node v6*/;
|
||||||
|
|
||||||
|
|
||||||
|
if ('function' !== typeof me.getUserAgentString) {
|
||||||
|
me.pkg = me.pkg || require('./package.json');
|
||||||
|
me.os = me.os || require('os');
|
||||||
|
me.process = me.process || require('process');
|
||||||
|
me.userAgent = ACME._getUserAgentString(me);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getRequest(opts) {
|
||||||
|
if (!opts) { opts = {}; }
|
||||||
|
|
||||||
|
return me.request.defaults({
|
||||||
|
headers: {
|
||||||
|
'User-Agent': opts.userAgent || me.userAgent || me.getUserAgentString(me)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if ('function' !== typeof me._request) {
|
||||||
|
me._request = me.promisify(getRequest({}));
|
||||||
|
}
|
||||||
|
|
||||||
|
me.init = function (_directoryUrl) {
|
||||||
|
me.directoryUrl = me.directoryUrl || _directoryUrl;
|
||||||
|
return ACME._directory(me).then(function (resp) {
|
||||||
|
me._directoryUrls = resp.body;
|
||||||
|
me._tos = me._directoryUrls.meta.termsOfService;
|
||||||
|
return me._directoryUrls;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
me.accounts = {
|
||||||
|
create: function (options) {
|
||||||
|
return ACME._registerAccount(me, options);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
me.certificates = {
|
||||||
|
create: function (options) {
|
||||||
|
return ACME._getCertificate(me, options);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return me;
|
||||||
|
};
|
102
express-server/node_modules/acme-v2/package.json
generated
vendored
Normal file
102
express-server/node_modules/acme-v2/package.json
generated
vendored
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
{
|
||||||
|
"_args": [
|
||||||
|
[
|
||||||
|
"acme-v2@^1.2.0",
|
||||||
|
"/nodeapps/https-test/greenlock-express.js/node_modules/greenlock"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"_from": "acme-v2@>=1.2.0 <2.0.0",
|
||||||
|
"_id": "acme-v2@1.2.1",
|
||||||
|
"_inCache": true,
|
||||||
|
"_installable": true,
|
||||||
|
"_location": "/acme-v2",
|
||||||
|
"_nodeVersion": "10.6.0",
|
||||||
|
"_npmOperationalInternal": {
|
||||||
|
"host": "s3://npm-registry-packages",
|
||||||
|
"tmp": "tmp/acme-v2_1.2.1_1534465950183_0.44524737605461473"
|
||||||
|
},
|
||||||
|
"_npmUser": {
|
||||||
|
"email": "coolaj86@gmail.com",
|
||||||
|
"name": "coolaj86"
|
||||||
|
},
|
||||||
|
"_npmVersion": "6.1.0",
|
||||||
|
"_phantomChildren": {},
|
||||||
|
"_requested": {
|
||||||
|
"name": "acme-v2",
|
||||||
|
"raw": "acme-v2@^1.2.0",
|
||||||
|
"rawSpec": "^1.2.0",
|
||||||
|
"scope": null,
|
||||||
|
"spec": ">=1.2.0 <2.0.0",
|
||||||
|
"type": "range"
|
||||||
|
},
|
||||||
|
"_requiredBy": [
|
||||||
|
"/acme",
|
||||||
|
"/greenlock"
|
||||||
|
],
|
||||||
|
"_resolved": "https://registry.npmjs.org/acme-v2/-/acme-v2-1.2.1.tgz",
|
||||||
|
"_shasum": "15ef5063b45172e900cfa6f05d608bde590860cc",
|
||||||
|
"_shrinkwrap": null,
|
||||||
|
"_spec": "acme-v2@^1.2.0",
|
||||||
|
"_where": "/nodeapps/https-test/greenlock-express.js/node_modules/greenlock",
|
||||||
|
"author": {
|
||||||
|
"email": "coolaj86@gmail.com",
|
||||||
|
"name": "AJ ONeal",
|
||||||
|
"url": "https://coolaj86.com/"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@coolaj86/urequest": "^1.3.6",
|
||||||
|
"rsa-compat": "^1.5.1"
|
||||||
|
},
|
||||||
|
"description": "Free SSL. A framework for building Let's Encrypt v2 clients, and other ACME v2 (draft 11) clients. Successor to le-acme-core.js",
|
||||||
|
"devDependencies": {},
|
||||||
|
"directories": {},
|
||||||
|
"dist": {
|
||||||
|
"fileCount": 14,
|
||||||
|
"integrity": "sha512-7FRl/vgZpcm7VCOiiAU6ntkclHkkEdCk1uNAkuEA0sZ8R0YX3pBjh066y/QqzEAfmDbbiYr+DYlVhZoHTbmXEQ==",
|
||||||
|
"npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbdhefCRA9TVsSAnZWagAA/XcQAKMNjyd4wCZzld6wlDfC\nr+Mo1CfUugIko2fW6MZ7TGhxPIiVhedC7v/jUxwsZV3oYDdrttTbflkxxoUB\n6ivIdPaTXp/9JXfg0u+2cWrCZufy4d5PQtDDdfrp0GugsUHz/+wrrC2jpCjM\nPRCzGYbwJ7NvEnY5AYU28XI9WL1voCxxxLSjYkPqDjBtGrvcUrghJUsfeqOw\n0gOd3LhSdFunnIV44PTHV4GknAkTUffbpigcfGAtiXfigJ/3xbrjV0k5dpBb\n55q6l+i6Vdvjb8xhYkUO+V7zE/3zZWAaVKHLI+oeVnX/1OrA7tLU05GYj03c\nFaEm57/uS3OQ4atHAy8X6vjXOjuGOoCXpmmNUKZ2whiUHDvsrzEVXhgFAGxb\n9iWghhgwCTn7zPQQKIJdviNEbQXmY+phbG+5mmg2+Z/EHceCi+4t4m/sEoIe\nAzBUTNouU8mMxfWFFDcT8c02LyFanHHsQGC+mtICORZxU8GlCwz7LTU5YLl3\nfkswVaLIYr2Qvlswyf/sJCWCccHgX2j6qlbdNhdV1LBvS1jYmgN83OkmcGTD\nmVyM+lDYqmBkycw29NEAkdZ3LvHsb1t4GOnqDboTOFZll2TSSiaOaLf3yveq\n6beSy/HNuCYzmTxXTeaGPnc1ZwY7iTYZcjTLitzNvKyCwO3Vjiyrtc9Onqx5\n/Yyp\r\n=dHr8\r\n-----END PGP SIGNATURE-----\r\n",
|
||||||
|
"shasum": "15ef5063b45172e900cfa6f05d608bde590860cc",
|
||||||
|
"tarball": "https://registry.npmjs.org/acme-v2/-/acme-v2-1.2.1.tgz",
|
||||||
|
"unpackedSize": 50763
|
||||||
|
},
|
||||||
|
"gitHead": "ca15b8faf0a11b15d9973a9786c652c117d2547d",
|
||||||
|
"homepage": "https://git.coolaj86.com/coolaj86/acme-v2.js",
|
||||||
|
"keywords": [
|
||||||
|
"ACME",
|
||||||
|
"Let's Encrypt",
|
||||||
|
"automated https",
|
||||||
|
"draft-11",
|
||||||
|
"draft-12",
|
||||||
|
"free ssl",
|
||||||
|
"letsencrypt",
|
||||||
|
"tls",
|
||||||
|
"v02",
|
||||||
|
"v2"
|
||||||
|
],
|
||||||
|
"license": "(MIT OR Apache-2.0)",
|
||||||
|
"main": "node.js",
|
||||||
|
"maintainers": [
|
||||||
|
{
|
||||||
|
"name": "coolaj86",
|
||||||
|
"email": "coolaj86@gmail.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ppl",
|
||||||
|
"email": "npm@ppl.family"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "thejshaver",
|
||||||
|
"email": "john@jshaver.net"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "acme-v2",
|
||||||
|
"optionalDependencies": {},
|
||||||
|
"readme": "ERROR: No README data found!",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "ssh://gitea@git.coolaj86.com:22042/coolaj86/acme-v2.js.git"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"version": "1.2.1"
|
||||||
|
}
|
79
express-server/node_modules/acme-v2/tests/cb.js
generated
vendored
Normal file
79
express-server/node_modules/acme-v2/tests/cb.js
generated
vendored
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
module.exports.run = function run(directoryUrl, RSA, web, chType, email, accountKeypair, domainKeypair) {
|
||||||
|
// [ 'test.ppl.family' ] 'coolaj86@gmail.com''http-01'
|
||||||
|
var acme2 = require('../').ACME.create({ RSA: RSA });
|
||||||
|
acme2.init(directoryUrl).then(function () {
|
||||||
|
var options = {
|
||||||
|
agreeToTerms: function (tosUrl, agree) {
|
||||||
|
agree(null, tosUrl);
|
||||||
|
}
|
||||||
|
, setChallenge: function (opts, cb) {
|
||||||
|
var pathname;
|
||||||
|
|
||||||
|
console.log("");
|
||||||
|
console.log('identifier:');
|
||||||
|
console.log(opts.identifier);
|
||||||
|
console.log('hostname:');
|
||||||
|
console.log(opts.hostname);
|
||||||
|
console.log('type:');
|
||||||
|
console.log(opts.type);
|
||||||
|
console.log('token:');
|
||||||
|
console.log(opts.token);
|
||||||
|
console.log('thumbprint:');
|
||||||
|
console.log(opts.thumbprint);
|
||||||
|
console.log('keyAuthorization:');
|
||||||
|
console.log(opts.keyAuthorization);
|
||||||
|
console.log('dnsAuthorization:');
|
||||||
|
console.log(opts.dnsAuthorization);
|
||||||
|
console.log("");
|
||||||
|
|
||||||
|
if ('http-01' === opts.type) {
|
||||||
|
pathname = opts.hostname + acme2.challengePrefixes['http-01'] + "/" + opts.token;
|
||||||
|
console.log("Put the string '" + opts.keyAuthorization + "' into a file at '" + pathname + "'");
|
||||||
|
console.log("echo '" + opts.keyAuthorization + "' > '" + pathname + "'");
|
||||||
|
} else if ('dns-01' === opts.type) {
|
||||||
|
pathname = acme2.challengePrefixes['dns-01'] + "." + opts.hostname.replace(/^\*\./, '');
|
||||||
|
console.log("Put the string '" + opts.dnsAuthorization + "' into the TXT record '" + pathname + "'");
|
||||||
|
console.log("ddig TXT " + pathname + " '" + opts.dnsAuthorization + "'");
|
||||||
|
} else {
|
||||||
|
cb(new Error("[acme-v2] unrecognized challenge type"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log("\nThen hit the 'any' key to continue...");
|
||||||
|
|
||||||
|
function onAny() {
|
||||||
|
console.log("'any' key was hit");
|
||||||
|
process.stdin.pause();
|
||||||
|
process.stdin.removeListener('data', onAny);
|
||||||
|
process.stdin.setRawMode(false);
|
||||||
|
cb();
|
||||||
|
}
|
||||||
|
|
||||||
|
process.stdin.setRawMode(true);
|
||||||
|
process.stdin.resume();
|
||||||
|
process.stdin.on('data', onAny);
|
||||||
|
}
|
||||||
|
, removeChallenge: function (opts, cb) {
|
||||||
|
// hostname, key
|
||||||
|
console.log('[acme-v2] remove challenge', opts.hostname, opts.keyAuthorization);
|
||||||
|
setTimeout(cb, 1 * 1000);
|
||||||
|
}
|
||||||
|
, challengeType: chType
|
||||||
|
, email: email
|
||||||
|
, accountKeypair: accountKeypair
|
||||||
|
, domainKeypair: domainKeypair
|
||||||
|
, domains: web
|
||||||
|
};
|
||||||
|
|
||||||
|
acme2.accounts.create(options).then(function (account) {
|
||||||
|
console.log('[acme-v2] account:');
|
||||||
|
console.log(account);
|
||||||
|
|
||||||
|
acme2.certificates.create(options).then(function (fullchainPem) {
|
||||||
|
console.log('[acme-v2] fullchain.pem:');
|
||||||
|
console.log(fullchainPem);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
68
express-server/node_modules/acme-v2/tests/compat.js
generated
vendored
Normal file
68
express-server/node_modules/acme-v2/tests/compat.js
generated
vendored
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
module.exports.run = function (directoryUrl, RSA, web, chType, email, accountKeypair, domainKeypair) {
|
||||||
|
console.log('[DEBUG] run', web, chType, email);
|
||||||
|
|
||||||
|
var acme2 = require('../compat.js').ACME.create({ RSA: RSA });
|
||||||
|
acme2.getAcmeUrls(acme2.stagingServerUrl, function (err/*, directoryUrls*/) {
|
||||||
|
if (err) { console.log('err 1'); throw err; }
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
agreeToTerms: function (tosUrl, agree) {
|
||||||
|
agree(null, tosUrl);
|
||||||
|
}
|
||||||
|
, setChallenge: function (hostname, token, val, cb) {
|
||||||
|
var pathname;
|
||||||
|
|
||||||
|
if ('http-01' === cb.type) {
|
||||||
|
pathname = hostname + acme2.acmeChallengePrefix + token;
|
||||||
|
console.log("Put the string '" + val /*keyAuthorization*/ + "' into a file at '" + pathname + "'");
|
||||||
|
console.log("echo '" + val /*keyAuthorization*/ + "' > '" + pathname + "'");
|
||||||
|
console.log("\nThen hit the 'any' key to continue...");
|
||||||
|
} else if ('dns-01' === cb.type) {
|
||||||
|
// forwards-backwards compat
|
||||||
|
pathname = acme2.challengePrefixes['dns-01'] + "." + hostname.replace(/^\*\./, '');
|
||||||
|
console.log("Put the string '" + cb.dnsAuthorization + "' into the TXT record '" + pathname + "'");
|
||||||
|
console.log("dig TXT " + pathname + " '" + cb.dnsAuthorization + "'");
|
||||||
|
console.log("\nThen hit the 'any' key to continue...");
|
||||||
|
} else {
|
||||||
|
cb(new Error("[acme-v2] unrecognized challenge type: " + cb.type));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
function onAny() {
|
||||||
|
console.log("'any' key was hit");
|
||||||
|
process.stdin.pause();
|
||||||
|
process.stdin.removeListener('data', onAny);
|
||||||
|
process.stdin.setRawMode(false);
|
||||||
|
cb();
|
||||||
|
}
|
||||||
|
|
||||||
|
process.stdin.setRawMode(true);
|
||||||
|
process.stdin.resume();
|
||||||
|
process.stdin.on('data', onAny);
|
||||||
|
}
|
||||||
|
, removeChallenge: function (hostname, key, cb) {
|
||||||
|
console.log('[DEBUG] remove challenge', hostname, key);
|
||||||
|
setTimeout(cb, 1 * 1000);
|
||||||
|
}
|
||||||
|
, challengeType: chType
|
||||||
|
, email: email
|
||||||
|
, accountKeypair: accountKeypair
|
||||||
|
, domainKeypair: domainKeypair
|
||||||
|
, domains: web
|
||||||
|
};
|
||||||
|
|
||||||
|
acme2.registerNewAccount(options, function (err, account) {
|
||||||
|
if (err) { console.log('err 2'); throw err; }
|
||||||
|
if (options.debug) console.debug('account:');
|
||||||
|
if (options.debug) console.log(account);
|
||||||
|
|
||||||
|
acme2.getCertificate(options, function (err, fullchainPem) {
|
||||||
|
if (err) { console.log('err 3'); throw err; }
|
||||||
|
console.log('[acme-v2] A fullchain.pem:');
|
||||||
|
console.log(fullchainPem);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
77
express-server/node_modules/acme-v2/tests/fullchain-formats.js
generated
vendored
Normal file
77
express-server/node_modules/acme-v2/tests/fullchain-formats.js
generated
vendored
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
/*
|
||||||
|
-----BEGIN CERTIFICATE-----LF
|
||||||
|
xxxLF
|
||||||
|
yyyLF
|
||||||
|
-----END CERTIFICATE-----LF
|
||||||
|
LF
|
||||||
|
-----BEGIN CERTIFICATE-----LF
|
||||||
|
xxxLF
|
||||||
|
yyyLF
|
||||||
|
-----END CERTIFICATE-----LF
|
||||||
|
|
||||||
|
Rules
|
||||||
|
* Only Unix LF (\n) Line endings
|
||||||
|
* Each PEM's lines are separated with \n
|
||||||
|
* Each PEM ends with \n
|
||||||
|
* Each PEM is separated with a \n (just like commas separating an array)
|
||||||
|
*/
|
||||||
|
|
||||||
|
// https://github.com/certbot/certbot/issues/5721#issuecomment-402362709
|
||||||
|
var expected = "----\nxxxx\nyyyy\n----\n\n----\nxxxx\nyyyy\n----\n";
|
||||||
|
var tests = [
|
||||||
|
"----\r\nxxxx\r\nyyyy\r\n----\r\n\r\n----\r\nxxxx\r\nyyyy\r\n----\r\n"
|
||||||
|
, "----\r\nxxxx\r\nyyyy\r\n----\r\n----\r\nxxxx\r\nyyyy\r\n----\r\n"
|
||||||
|
, "----\nxxxx\nyyyy\n----\n\n----\r\nxxxx\r\nyyyy\r\n----"
|
||||||
|
, "----\nxxxx\nyyyy\n----\n----\r\nxxxx\r\nyyyy\r\n----"
|
||||||
|
, "----\nxxxx\nyyyy\n----\n----\nxxxx\nyyyy\n----"
|
||||||
|
, "----\nxxxx\nyyyy\n----\n----\nxxxx\nyyyy\n----\n"
|
||||||
|
, "----\nxxxx\nyyyy\n----\n\n----\nxxxx\nyyyy\n----\n"
|
||||||
|
, "----\nxxxx\nyyyy\n----\r\n----\nxxxx\ryyyy\n----\n"
|
||||||
|
];
|
||||||
|
|
||||||
|
function formatPemChain(str) {
|
||||||
|
return str.trim().replace(/[\r\n]+/g, '\n').replace(/\-\n\-/g, '-\n\n-') + '\n';
|
||||||
|
}
|
||||||
|
function splitPemChain(str) {
|
||||||
|
return str.trim().split(/[\r\n]{2,}/g).map(function (str) {
|
||||||
|
return str + '\n';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
tests.forEach(function (str) {
|
||||||
|
var actual = formatPemChain(str);
|
||||||
|
if (expected !== actual) {
|
||||||
|
console.error('input: ', JSON.stringify(str));
|
||||||
|
console.error('expected:', JSON.stringify(expected));
|
||||||
|
console.error('actual: ', JSON.stringify(actual));
|
||||||
|
throw new Error("did not pass");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (
|
||||||
|
"----\nxxxx\nyyyy\n----\n"
|
||||||
|
!==
|
||||||
|
formatPemChain("\n\n----\r\nxxxx\r\nyyyy\r\n----\n\n")
|
||||||
|
) {
|
||||||
|
throw new Error("Not proper for single cert in chain");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
"--B--\nxxxx\nyyyy\n--E--\n\n--B--\nxxxx\nyyyy\n--E--\n\n--B--\nxxxx\nyyyy\n--E--\n"
|
||||||
|
!==
|
||||||
|
formatPemChain("\n\n\n--B--\nxxxx\nyyyy\n--E--\n\n\n\n--B--\nxxxx\nyyyy\n--E--\n\n\n--B--\nxxxx\nyyyy\n--E--\n\n\n")
|
||||||
|
) {
|
||||||
|
throw new Error("Not proper for three certs in chain");
|
||||||
|
}
|
||||||
|
|
||||||
|
splitPemChain(
|
||||||
|
"--B--\nxxxx\nyyyy\n--E--\n\n--B--\nxxxx\nyyyy\n--E--\n\n--B--\nxxxx\nyyyy\n--E--\n"
|
||||||
|
).forEach(function (str) {
|
||||||
|
if ("--B--\nxxxx\nyyyy\n--E--\n" !== str) {
|
||||||
|
throw new Error("bad thingy");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
console.info('PASS');
|
85
express-server/node_modules/acme-v2/tests/promise.js
generated
vendored
Normal file
85
express-server/node_modules/acme-v2/tests/promise.js
generated
vendored
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
/* global Promise */
|
||||||
|
module.exports.run = function run(directoryUrl, RSA, web, chType, email, accountKeypair, domainKeypair) {
|
||||||
|
var acme2 = require('../').ACME.create({ RSA: RSA });
|
||||||
|
// [ 'test.ppl.family' ] 'coolaj86@gmail.com''http-01'
|
||||||
|
acme2.init(directoryUrl).then(function () {
|
||||||
|
var options = {
|
||||||
|
agreeToTerms: function (tosUrl) {
|
||||||
|
return Promise.resolve(tosUrl);
|
||||||
|
}
|
||||||
|
, setChallenge: function (opts) {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
var pathname;
|
||||||
|
|
||||||
|
console.log("");
|
||||||
|
console.log('identifier:');
|
||||||
|
console.log(opts.identifier);
|
||||||
|
console.log('hostname:');
|
||||||
|
console.log(opts.hostname);
|
||||||
|
console.log('type:');
|
||||||
|
console.log(opts.type);
|
||||||
|
console.log('token:');
|
||||||
|
console.log(opts.token);
|
||||||
|
console.log('thumbprint:');
|
||||||
|
console.log(opts.thumbprint);
|
||||||
|
console.log('keyAuthorization:');
|
||||||
|
console.log(opts.keyAuthorization);
|
||||||
|
console.log('dnsAuthorization:');
|
||||||
|
console.log(opts.dnsAuthorization);
|
||||||
|
console.log("");
|
||||||
|
|
||||||
|
if ('http-01' === opts.type) {
|
||||||
|
pathname = opts.hostname + acme2.challengePrefixes['http-01'] + "/" + opts.token;
|
||||||
|
console.log("Put the string '" + opts.keyAuthorization + "' into a file at '" + pathname + "'");
|
||||||
|
console.log("echo '" + opts.keyAuthorization + "' > '" + pathname + "'");
|
||||||
|
} else if ('dns-01' === opts.type) {
|
||||||
|
pathname = acme2.challengePrefixes['dns-01'] + "." + opts.hostname.replace(/^\*\./, '');
|
||||||
|
console.log("Put the string '" + opts.dnsAuthorization + "' into the TXT record '" + pathname + "'");
|
||||||
|
console.log("dig TXT " + pathname + " '" + opts.dnsAuthorization + "'");
|
||||||
|
} else {
|
||||||
|
reject(new Error("[acme-v2] unrecognized challenge type"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log("\nThen hit the 'any' key to continue...");
|
||||||
|
|
||||||
|
function onAny() {
|
||||||
|
console.log("'any' key was hit");
|
||||||
|
process.stdin.pause();
|
||||||
|
process.stdin.removeListener('data', onAny);
|
||||||
|
process.stdin.setRawMode(false);
|
||||||
|
resolve();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
process.stdin.setRawMode(true);
|
||||||
|
process.stdin.resume();
|
||||||
|
process.stdin.on('data', onAny);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
, removeChallenge: function (opts) {
|
||||||
|
console.log('[acme-v2] remove challenge', opts.hostname, opts.keyAuthorization);
|
||||||
|
return new Promise(function (resolve) {
|
||||||
|
// hostname, key
|
||||||
|
setTimeout(resolve, 1 * 1000);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
, challengeType: chType
|
||||||
|
, email: email
|
||||||
|
, accountKeypair: accountKeypair
|
||||||
|
, domainKeypair: domainKeypair
|
||||||
|
, domains: web
|
||||||
|
};
|
||||||
|
|
||||||
|
acme2.accounts.create(options).then(function (account) {
|
||||||
|
console.log('[acme-v2] account:');
|
||||||
|
console.log(account);
|
||||||
|
|
||||||
|
acme2.certificates.create(options).then(function (fullchainPem) {
|
||||||
|
console.log('[acme-v2] fullchain.pem:');
|
||||||
|
console.log(fullchainPem);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
41
express-server/node_modules/acme/LICENSE
generated
vendored
Normal file
41
express-server/node_modules/acme/LICENSE
generated
vendored
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
Copyright 2018 AJ ONeal
|
||||||
|
|
||||||
|
This is open source software; you can redistribute it and/or modify it under the
|
||||||
|
terms of either:
|
||||||
|
|
||||||
|
a) the "MIT License"
|
||||||
|
b) the "Apache-2.0 License"
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
Apache-2.0 License Summary
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
233
express-server/node_modules/acme/README.md
generated
vendored
Normal file
233
express-server/node_modules/acme/README.md
generated
vendored
Normal file
@ -0,0 +1,233 @@
|
|||||||
|
acme.js
|
||||||
|
==========
|
||||||
|
|
||||||
|
Free SSL for everybody. The bare essentials of the Let's Encrypt v2 (ACME) API.
|
||||||
|
Built for [Greenlock](https://git.coolaj86.com/coolaj86/greenlock-express.js),
|
||||||
|
[by request](https://git.coolaj86.com/coolaj86/greenlock.js/issues/5#issuecomment-8).
|
||||||
|
|
||||||
|
| Sponsored by [ppl](https://ppl.family) |
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
Looking for Quick 'n' Easy™?
|
||||||
|
=======
|
||||||
|
|
||||||
|
This is intented for building ACME API clients in node.js. It is **not** a high-level, fully-integrated solution.
|
||||||
|
|
||||||
|
You may be more interested in one of these:
|
||||||
|
|
||||||
|
* <https://greenlock.domains> Instant SSL Certificates in your Browser
|
||||||
|
* [Greenlock for Web Browsers](https://git.coolaj86.com/coolaj86/greenlock.html) (Browser JavaScript)
|
||||||
|
* [Greenlock for Web Servers](https://git.coolaj86.com/coolaj86/greenlock-cli.js) (Command line, like certbot)
|
||||||
|
* [Greenlock for Express.js](https://git.coolaj86.com/coolaj86/greenlock-express.js) (Automated HTTPS for Express.js apps)
|
||||||
|
* [Greenlock for node.js](https://git.coolaj86.com/coolaj86/greenlock.js) (Automated HTTPS for Proxies, Load-Balances, Servers, CLIs)
|
||||||
|
* [goldilocks.js](https://git.coolaj86.com/coolaj86/goldilocks.js) (A Full-Blown WebServer)
|
||||||
|
|
||||||
|
Demonstration
|
||||||
|
=============
|
||||||
|
|
||||||
|
As this is intended to *build* ACME clients, there is not a simple 2-line example.
|
||||||
|
|
||||||
|
I'd recommend first trying out one of the [Greenlock for Web Servers](https://git.coolaj86.com/coolaj86/greenlock-cli.js)
|
||||||
|
examples, which are guaranteed to work and have great error checking to help you debug.
|
||||||
|
|
||||||
|
Then I'd recommend running the example CLI client with a test domain and then investigating the files used for that example:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://git.coolaj86.com/coolaj86/acme.js.git
|
||||||
|
pushd acme.js/
|
||||||
|
node examples/cli.js
|
||||||
|
```
|
||||||
|
|
||||||
|
The example cli has the following prompts:
|
||||||
|
|
||||||
|
```
|
||||||
|
What web address(es) would you like to get certificates for? (ex: example.com,*.example.com)
|
||||||
|
What challenge will you be testing today? http-01 or dns-01? [http-01]
|
||||||
|
What email should we use? (optional)
|
||||||
|
What directoryUrl should we use? [https://acme-staging-v02.api.letsencrypt.org/directory]
|
||||||
|
|
||||||
|
Put the string 'mBfh0SqaAV3MOK3B6cAhCbIReAyDuwuxlO1Sl70x6bM.VNAzCR4THe4czVzo9piNn73B1ZXRLaB2CESwJfKkvRM' into a file at 'example.com/.well-known/acme-challenge/mBfh0SqaAV3MOK3B6cAhCbIReAyDuwuxlO1Sl70x6bM'
|
||||||
|
|
||||||
|
echo 'mBfh0SqaAV3MOK3B6cAhCbIReAyDuwuxlO1Sl70x6bM.VNAzCR4THe4czVzo9piNn73B1ZXRLaB2CESwJfKkvRM' > 'example.com/.well-known/acme-challenge/mBfh0SqaAV3MOK3B6cAhCbIReAyDuwuxlO1Sl70x6bM'
|
||||||
|
|
||||||
|
Then hit the 'any' key to continue...
|
||||||
|
```
|
||||||
|
|
||||||
|
When you've completed the challenge you can hit a key to continue the process.
|
||||||
|
|
||||||
|
If you place the certificate you receive back in `tests/fullchain.pem`
|
||||||
|
then you can test it with `examples/https-server.js`.
|
||||||
|
|
||||||
|
```
|
||||||
|
examples/cli.js
|
||||||
|
examples/genkeypair.js
|
||||||
|
examples/https-server.js
|
||||||
|
examples/http-server.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Let's Encrypt v2 / ACME draft 11 Support
|
||||||
|
========
|
||||||
|
|
||||||
|
This library (acme.js) supports ACME [*draft 11*](https://tools.ietf.org/html/draft-ietf-acme-acme-11),
|
||||||
|
otherwise known as Let's Encrypt v2 (or v02).
|
||||||
|
|
||||||
|
* ACME draft 11
|
||||||
|
* Let's Encrypt v2
|
||||||
|
* Let's Encrypt v02
|
||||||
|
|
||||||
|
```
|
||||||
|
# Production URL
|
||||||
|
https://acme-v02.api.letsencrypt.org/directory
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
# Staging URL
|
||||||
|
https://acme-staging-v02.api.letsencrypt.org/directory
|
||||||
|
```
|
||||||
|
|
||||||
|
Install
|
||||||
|
=======
|
||||||
|
|
||||||
|
Install via npm
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install --save acme
|
||||||
|
```
|
||||||
|
|
||||||
|
Install via git
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install https://git.coolaj86.com/coolaj86/acme.js.git
|
||||||
|
```
|
||||||
|
|
||||||
|
API
|
||||||
|
===
|
||||||
|
|
||||||
|
This API is an evolution of le-acme-core,
|
||||||
|
but tries to provide a better mapping to the new draft 11 APIs.
|
||||||
|
|
||||||
|
Status: Almost stable, but **not semver locked**.
|
||||||
|
|
||||||
|
Patch versions will not introduce breaking changes,
|
||||||
|
but may introduce lower-level APIs.
|
||||||
|
Minor versions may change return values to include more information.
|
||||||
|
|
||||||
|
### Overview
|
||||||
|
|
||||||
|
```
|
||||||
|
var ACME = require('acme').ACME;
|
||||||
|
|
||||||
|
ACME.create(opts)
|
||||||
|
|
||||||
|
acme.init(acmeDirectoryUrl)
|
||||||
|
acme.accounts.create(opts)
|
||||||
|
acme.certificates.create(opts)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Detailed Explanation
|
||||||
|
|
||||||
|
```
|
||||||
|
var ACME = require('acme').ACME;
|
||||||
|
|
||||||
|
// Create Instance (Dependency Injection)
|
||||||
|
var acme = ACME.create({
|
||||||
|
RSA: require('rsa-compat').RSA
|
||||||
|
|
||||||
|
// other overrides
|
||||||
|
, request: require('request')
|
||||||
|
, promisify: require('util').promisify
|
||||||
|
|
||||||
|
// used for constructing user-agent
|
||||||
|
, os: require('os')
|
||||||
|
, process: require('process')
|
||||||
|
|
||||||
|
// used for overriding the default user-agent
|
||||||
|
, userAgent: 'My custom UA String'
|
||||||
|
, getUserAgentString: function (deps) { return 'My custom UA String'; }
|
||||||
|
|
||||||
|
// don't try to validate challenges locally
|
||||||
|
, skipChallengeTest: false
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// Discover Directory URLs
|
||||||
|
acme.init(acmeDirectoryUrl) // returns Promise<acmeUrls={keyChange,meta,newAccount,newNonce,newOrder,revokeCert}>
|
||||||
|
|
||||||
|
|
||||||
|
// Accounts
|
||||||
|
acme.accounts.create(options) // returns Promise<regr> registration data
|
||||||
|
|
||||||
|
{ email: '<email>' // valid email (server checks MX records)
|
||||||
|
, accountKeypair: { // privateKeyPem or privateKeyJwt
|
||||||
|
privateKeyPem: '<ASCII PEM>'
|
||||||
|
}
|
||||||
|
, agreeToTerms: fn (tosUrl) {} // returns Promise with tosUrl
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Registration
|
||||||
|
acme.certificates.create(options) // returns Promise<pems={ privkey (key), cert, chain (ca) }>
|
||||||
|
|
||||||
|
{ newAuthzUrl: '<url>' // specify acmeUrls.newAuthz
|
||||||
|
, newCertUrl: '<url>' // specify acmeUrls.newCert
|
||||||
|
|
||||||
|
, domainKeypair: {
|
||||||
|
privateKeyPem: '<ASCII PEM>'
|
||||||
|
}
|
||||||
|
, accountKeypair: {
|
||||||
|
privateKeyPem: '<ASCII PEM>'
|
||||||
|
}
|
||||||
|
, domains: [ 'example.com' ]
|
||||||
|
|
||||||
|
, setChallenge: fn (hostname, key, val) // return Promise
|
||||||
|
, removeChallenge: fn (hostname, key) // return Promise
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Helpers & Stuff
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Constants
|
||||||
|
ACME.challengePrefixes['http-01'] // '/.well-known/acme-challenge'
|
||||||
|
ACME.challengePrefixes['dns-01'] // '_acme-challenge'
|
||||||
|
```
|
||||||
|
|
||||||
|
Changelog
|
||||||
|
---------
|
||||||
|
|
||||||
|
* v1.0.9 - update docs
|
||||||
|
* v1.0.8 - rename to acme.js, remove backwards compat
|
||||||
|
* v1.0.7 - improved error handling again, after user testing
|
||||||
|
* v1.0.6 - improved error handling
|
||||||
|
* v1.0.5 - cleanup logging
|
||||||
|
* v1.0.4 - v6- compat use `promisify` from node's util or bluebird
|
||||||
|
* v1.0.3 - documentation cleanup
|
||||||
|
* v1.0.2
|
||||||
|
* use `options.contact` to provide raw contact array
|
||||||
|
* made `options.email` optional
|
||||||
|
* file cleanup
|
||||||
|
* v1.0.1
|
||||||
|
* Compat API is ready for use
|
||||||
|
* Eliminate debug logging
|
||||||
|
* Apr 10, 2018 - tested backwards-compatibility using greenlock.js
|
||||||
|
* Apr 5, 2018 - export http and dns challenge tests
|
||||||
|
* Apr 5, 2018 - test http and dns challenges (success and failure)
|
||||||
|
* Apr 5, 2018 - test subdomains and its wildcard
|
||||||
|
* Apr 5, 2018 - test two subdomains
|
||||||
|
* Apr 5, 2018 - test wildcard
|
||||||
|
* Apr 5, 2018 - completely match api for acme v1 (le-acme-core.js)
|
||||||
|
* Mar 21, 2018 - *mostly* matches le-acme-core.js API
|
||||||
|
* Mar 21, 2018 - can now accept values (not hard coded)
|
||||||
|
* Mar 20, 2018 - SUCCESS - got a test certificate (hard-coded)
|
||||||
|
* Mar 20, 2018 - download certificate
|
||||||
|
* Mar 20, 2018 - poll for status
|
||||||
|
* Mar 20, 2018 - finalize order (submit csr)
|
||||||
|
* Mar 20, 2018 - generate domain keypair
|
||||||
|
* Mar 20, 2018 - respond to challenges
|
||||||
|
* Mar 16, 2018 - get challenges
|
||||||
|
* Mar 16, 2018 - new order
|
||||||
|
* Mar 15, 2018 - create account
|
||||||
|
* Mar 15, 2018 - generate account keypair
|
||||||
|
* Mar 15, 2018 - get nonce
|
||||||
|
* Mar 15, 2018 - get directory
|
64
express-server/node_modules/acme/examples/cli.js
generated
vendored
Normal file
64
express-server/node_modules/acme/examples/cli.js
generated
vendored
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var readline = require('readline');
|
||||||
|
var inquisitor = {};
|
||||||
|
var rl = readline.createInterface({
|
||||||
|
input: process.stdin,
|
||||||
|
output: process.stdout
|
||||||
|
});
|
||||||
|
|
||||||
|
require('./genkeypair.js');
|
||||||
|
|
||||||
|
inquisitor.getWeb = function getWeb() {
|
||||||
|
rl.question('What web address(es) would you like to get certificates for? (ex: example.com,*.example.com) ', function (web) {
|
||||||
|
web = (web||'').trim().split(/,/g);
|
||||||
|
if (!web[0]) { inquisitor.getWeb(); return; }
|
||||||
|
|
||||||
|
if (web.some(function (w) { return '*' === w[0]; })) {
|
||||||
|
console.log('Wildcard domains must use dns-01');
|
||||||
|
inquisitor.getEmail(web, 'dns-01');
|
||||||
|
} else {
|
||||||
|
inquisitor.getChallengeType(web);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
inquisitor.getChallengeType = function getChallengeType(web) {
|
||||||
|
rl.question('What challenge will you be testing today? http-01 or dns-01? [http-01] ', function (chType) {
|
||||||
|
chType = (chType||'').trim();
|
||||||
|
if (!chType) { chType = 'http-01'; }
|
||||||
|
|
||||||
|
inquisitor.getEmail(web, chType);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
inquisitor.getEmail = function getEmail(web, chType) {
|
||||||
|
rl.question('What email should we use? (optional) ', function (email) {
|
||||||
|
email = (email||'').trim();
|
||||||
|
if (!email) { email = null; }
|
||||||
|
|
||||||
|
inquisitor.getDirectoryUrl(web, chType, email);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
inquisitor.getDirectoryUrl = function getDirectoryUrl(web, chType, email) {
|
||||||
|
var defaultDirectoryUrl = 'https://acme-staging-v02.api.letsencrypt.org/directory';
|
||||||
|
rl.question('What directoryUrl should we use? [' + defaultDirectoryUrl + '] ', function (directoryUrl) {
|
||||||
|
directoryUrl = (directoryUrl||'').trim();
|
||||||
|
if (!directoryUrl) { directoryUrl = 'https://acme-staging-v02.api.letsencrypt.org/directory'; }
|
||||||
|
|
||||||
|
inquisitor.run(directoryUrl, web, chType, email);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
inquisitor.run = function run(directoryUrl, web, chType, email) {
|
||||||
|
rl.close();
|
||||||
|
|
||||||
|
var RSA = require('rsa-compat').RSA;
|
||||||
|
var accountKeypair = RSA.import({ privateKeyPem: require('fs').readFileSync(__dirname + '/../tests/account.privkey.pem') });
|
||||||
|
var domainKeypair = RSA.import({ privateKeyPem: require('fs').readFileSync(__dirname + '/../tests/privkey.pem') });
|
||||||
|
|
||||||
|
require('../tests/promise.js').run(directoryUrl, RSA, web, chType, email, accountKeypair, domainKeypair);
|
||||||
|
};
|
||||||
|
|
||||||
|
inquisitor.getWeb();
|
22
express-server/node_modules/acme/examples/genkeypair.js
generated
vendored
Normal file
22
express-server/node_modules/acme/examples/genkeypair.js
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
var RSA = require('rsa-compat').RSA;
|
||||||
|
var fs = require('fs');
|
||||||
|
|
||||||
|
if (!fs.existsSync(__dirname + '/../tests/account.privkey.pem')) {
|
||||||
|
RSA.generateKeypair(2048, 65537, {}, function (err, keypair) {
|
||||||
|
console.log(keypair);
|
||||||
|
var privkeyPem = RSA.exportPrivatePem(keypair)
|
||||||
|
console.log(privkeyPem);
|
||||||
|
|
||||||
|
fs.writeFileSync(__dirname + '/../tests/account.privkey.pem', privkeyPem);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!fs.existsSync(__dirname + '/../tests/privkey.pem')) {
|
||||||
|
RSA.generateKeypair(2048, 65537, {}, function (err, keypair) {
|
||||||
|
console.log(keypair);
|
||||||
|
var privkeyPem = RSA.exportPrivatePem(keypair)
|
||||||
|
console.log(privkeyPem);
|
||||||
|
|
||||||
|
fs.writeFileSync(__dirname + '/../tests/privkey.pem', privkeyPem);
|
||||||
|
});
|
||||||
|
}
|
7
express-server/node_modules/acme/examples/http-server.js
generated
vendored
Normal file
7
express-server/node_modules/acme/examples/http-server.js
generated
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var http = require('http');
|
||||||
|
var express = require('express');
|
||||||
|
var server = http.createServer(express.static('../tests')).listen(80, function () {
|
||||||
|
console.log('Listening on', this.address());
|
||||||
|
});
|
11
express-server/node_modules/acme/examples/https-server.js
generated
vendored
Normal file
11
express-server/node_modules/acme/examples/https-server.js
generated
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var https = require('https');
|
||||||
|
var server = https.createServer({
|
||||||
|
key: require('fs').readFileSync('../tests/privkey.pem')
|
||||||
|
, cert: require('fs').readFileSync('../tests/fullchain.pem')
|
||||||
|
}, function (req, res) {
|
||||||
|
res.end("Hello, World!");
|
||||||
|
}).listen(443, function () {
|
||||||
|
console.log('Listening on', this.address());
|
||||||
|
});
|
3
express-server/node_modules/acme/node.js
generated
vendored
Normal file
3
express-server/node_modules/acme/node.js
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
// For the time being I'm still pulling in my acme-v2 module until I transition over
|
||||||
|
// I export as ".ACME" rather than bare so that this can be compatible with the browser version too
|
||||||
|
module.exports.ACME = require('acme-v2').ACME;
|
109
express-server/node_modules/acme/package.json
generated
vendored
Normal file
109
express-server/node_modules/acme/package.json
generated
vendored
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
{
|
||||||
|
"_args": [
|
||||||
|
[
|
||||||
|
"acme@^1.0.6",
|
||||||
|
"/nodeapps/https-test/greenlock-express.js/node_modules/greenlock"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"_from": "acme@>=1.0.6 <2.0.0",
|
||||||
|
"_id": "acme@1.1.1",
|
||||||
|
"_inCache": true,
|
||||||
|
"_installable": true,
|
||||||
|
"_location": "/acme",
|
||||||
|
"_nodeVersion": "10.2.1",
|
||||||
|
"_npmOperationalInternal": {
|
||||||
|
"host": "s3://npm-registry-packages",
|
||||||
|
"tmp": "tmp/acme_1.1.1_1530693806508_0.5374627943153449"
|
||||||
|
},
|
||||||
|
"_npmUser": {
|
||||||
|
"email": "coolaj86@gmail.com",
|
||||||
|
"name": "coolaj86"
|
||||||
|
},
|
||||||
|
"_npmVersion": "5.6.0",
|
||||||
|
"_phantomChildren": {},
|
||||||
|
"_requested": {
|
||||||
|
"name": "acme",
|
||||||
|
"raw": "acme@^1.0.6",
|
||||||
|
"rawSpec": "^1.0.6",
|
||||||
|
"scope": null,
|
||||||
|
"spec": ">=1.0.6 <2.0.0",
|
||||||
|
"type": "range"
|
||||||
|
},
|
||||||
|
"_requiredBy": [
|
||||||
|
"/greenlock"
|
||||||
|
],
|
||||||
|
"_resolved": "https://registry.npmjs.org/acme/-/acme-1.1.1.tgz",
|
||||||
|
"_shasum": "8831797657303336eb3d3d06f42d6152081f42bf",
|
||||||
|
"_shrinkwrap": null,
|
||||||
|
"_spec": "acme@^1.0.6",
|
||||||
|
"_where": "/nodeapps/https-test/greenlock-express.js/node_modules/greenlock",
|
||||||
|
"author": {
|
||||||
|
"email": "coolaj86@gmail.com",
|
||||||
|
"name": "AJ ONeal",
|
||||||
|
"url": "https://coolaj86.com/"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"acme-v2": "^1.1.0"
|
||||||
|
},
|
||||||
|
"description": "The bare essentials of the ACME (Let's Encrypt v2) API. This is a low-level library for building high-level clients.",
|
||||||
|
"devDependencies": {},
|
||||||
|
"directories": {},
|
||||||
|
"dist": {
|
||||||
|
"fileCount": 9,
|
||||||
|
"integrity": "sha512-CZFTpD2hGSE8dd63vHtvdhabondEhgmpL0wH0weV0pk+I1WH9RVcJbdR6MgoalsUtJW/SaC+OxUDrcjINur1ow==",
|
||||||
|
"npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbPIiuCRA9TVsSAnZWagAAFEcP/34ebMMxTtSVjlKkNxZQ\n80AmVT4ESDenhRX3buCUgWuUAiK0q9K5eTel+Mj7ijElXLFzmA56VdwbaZKr\ng+5WRm3DfXA2/rGOHztLlbBXwO3Gcn6X28SUIg8R6xLrC9Z/KVd5smygOiIY\nqgmjhaDZcMxE9Wehkl6v0fYjsP0KQF6OT19f8YMHOw9m9dIJBLaJFxPVONuT\nu9XLzMnCWmsMhc2T/a+dZAHTZmZYMS0PqnJJ7S8x14+kvEiCaVME1XqSgwHv\nIagQUVICle3CLvyJaS5XnTjbxC6swd8S79IG2lrko6r8bnieonvFdUKg8AHH\n7ejyPyLw6jcruUWn6sf5U/lv0pzMyD3aldDY5udYfkLVUDrJW+xratvGCWgZ\nxwIsk9nQrnft6zhiHSuF/J7c+MRcG0i1DkXmm8gQxph4lI4KlQcfhHz1b8QI\nvGbAhk4qAphaOch0HSmFwPRv3cfEPZ03/IXQanGov2D0OLm2Zf9+BnE3Jq27\nkmrFSKbsm2LZEGK+ei7jPiXErVGP1HQx5oS59+ZAhT1QhaI/J1bha33iiyGg\nsWi5QGCxrIXY8wLgH20e4boOqUMAAkL1m3SPChCVHWl6Z2Xv9is/02oYrSmN\n5d/yb8yO34SykrrnsKx2Sj3z3xXOebdNqCob1pwL1mZC2+ccMEUsTj8GiFSQ\nQNJX\r\n=v/wZ\r\n-----END PGP SIGNATURE-----\r\n",
|
||||||
|
"shasum": "8831797657303336eb3d3d06f42d6152081f42bf",
|
||||||
|
"tarball": "https://registry.npmjs.org/acme/-/acme-1.1.1.tgz",
|
||||||
|
"unpackedSize": 17077
|
||||||
|
},
|
||||||
|
"gitHead": "71ae7393cbf816aa9eef85bfb9722bcee82feefb",
|
||||||
|
"homepage": "https://git.coolaj86.com/coolaj86/acme.js",
|
||||||
|
"keywords": [
|
||||||
|
"11",
|
||||||
|
"Let's Encrypt",
|
||||||
|
"acme",
|
||||||
|
"acme-draft-11",
|
||||||
|
"acme-draft11",
|
||||||
|
"acme-v02",
|
||||||
|
"acme-v2",
|
||||||
|
"acme11",
|
||||||
|
"acme2",
|
||||||
|
"acmev02",
|
||||||
|
"acmev2",
|
||||||
|
"draft",
|
||||||
|
"greenlock",
|
||||||
|
"greenlock2",
|
||||||
|
"https",
|
||||||
|
"letsencrypt",
|
||||||
|
"letsencrypt-v02",
|
||||||
|
"letsencrypt-v2",
|
||||||
|
"letsencrypt2",
|
||||||
|
"letsencryptv02",
|
||||||
|
"letsencryptv2",
|
||||||
|
"ssl",
|
||||||
|
"tls"
|
||||||
|
],
|
||||||
|
"license": "(MIT OR Apache-2.0)",
|
||||||
|
"main": "node.js",
|
||||||
|
"maintainers": [
|
||||||
|
{
|
||||||
|
"name": "coolaj86",
|
||||||
|
"email": "coolaj86@gmail.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "thejshaver",
|
||||||
|
"email": "john@jshaver.net"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "acme",
|
||||||
|
"optionalDependencies": {},
|
||||||
|
"readme": "ERROR: No README data found!",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "ssh://gitea@git.coolaj86.com:22042/coolaj86/acme.js.git"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"version": "1.1.1"
|
||||||
|
}
|
85
express-server/node_modules/acme/tests/promise.js
generated
vendored
Normal file
85
express-server/node_modules/acme/tests/promise.js
generated
vendored
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
/* global Promise */
|
||||||
|
module.exports.run = function run(directoryUrl, RSA, web, chType, email, accountKeypair, domainKeypair) {
|
||||||
|
var acme2 = require('../').ACME.create({ RSA: RSA });
|
||||||
|
// [ 'test.ppl.family' ] 'coolaj86@gmail.com''http-01'
|
||||||
|
acme2.init(directoryUrl).then(function () {
|
||||||
|
var options = {
|
||||||
|
agreeToTerms: function (tosUrl) {
|
||||||
|
return Promise.resolve(tosUrl);
|
||||||
|
}
|
||||||
|
, setChallenge: function (opts) {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
var pathname;
|
||||||
|
|
||||||
|
console.log("");
|
||||||
|
console.log('identifier:');
|
||||||
|
console.log(opts.identifier);
|
||||||
|
console.log('hostname:');
|
||||||
|
console.log(opts.hostname);
|
||||||
|
console.log('type:');
|
||||||
|
console.log(opts.type);
|
||||||
|
console.log('token:');
|
||||||
|
console.log(opts.token);
|
||||||
|
console.log('thumbprint:');
|
||||||
|
console.log(opts.thumbprint);
|
||||||
|
console.log('keyAuthorization:');
|
||||||
|
console.log(opts.keyAuthorization);
|
||||||
|
console.log('dnsAuthorization:');
|
||||||
|
console.log(opts.dnsAuthorization);
|
||||||
|
console.log("");
|
||||||
|
|
||||||
|
if ('http-01' === opts.type) {
|
||||||
|
pathname = opts.hostname + acme2.challengePrefixes['http-01'] + "/" + opts.token;
|
||||||
|
console.log("Put the string '" + opts.keyAuthorization + "' into a file at '" + pathname + "'");
|
||||||
|
console.log("echo '" + opts.keyAuthorization + "' > '" + pathname + "'");
|
||||||
|
} else if ('dns-01' === opts.type) {
|
||||||
|
pathname = acme2.challengePrefixes['dns-01'] + "." + opts.hostname.replace(/^\*\./, '');;
|
||||||
|
console.log("Put the string '" + opts.dnsAuthorization + "' into the TXT record '" + pathname + "'");
|
||||||
|
console.log("ddig TXT " + pathname + " '" + opts.dnsAuthorization + "'");
|
||||||
|
} else {
|
||||||
|
reject(new Error("[acme-v2] unrecognized challenge type"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log("\nThen hit the 'any' key to continue...");
|
||||||
|
|
||||||
|
function onAny() {
|
||||||
|
console.log("'any' key was hit");
|
||||||
|
process.stdin.pause();
|
||||||
|
process.stdin.removeListener('data', onAny);
|
||||||
|
process.stdin.setRawMode(false);
|
||||||
|
resolve();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
process.stdin.setRawMode(true);
|
||||||
|
process.stdin.resume();
|
||||||
|
process.stdin.on('data', onAny);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
, removeChallenge: function (opts) {
|
||||||
|
console.log('[acme-v2] remove challenge', opts.hostname, opts.keyAuthorization);
|
||||||
|
return new Promise(function (resolve) {
|
||||||
|
// hostname, key
|
||||||
|
setTimeout(resolve, 1 * 1000);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
, challengeType: chType
|
||||||
|
, email: email
|
||||||
|
, accountKeypair: accountKeypair
|
||||||
|
, domainKeypair: domainKeypair
|
||||||
|
, domains: web
|
||||||
|
};
|
||||||
|
|
||||||
|
acme2.accounts.create(options).then(function (account) {
|
||||||
|
console.log('[acme-v2] account:');
|
||||||
|
console.log(account);
|
||||||
|
|
||||||
|
acme2.certificates.create(options).then(function (fullchainPem) {
|
||||||
|
console.log('[acme-v2] fullchain.pem:');
|
||||||
|
console.log(fullchainPem);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
63
express-server/node_modules/asn1js/.gitattributes
generated
vendored
Normal file
63
express-server/node_modules/asn1js/.gitattributes
generated
vendored
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
###############################################################################
|
||||||
|
# Set default behavior to automatically normalize line endings.
|
||||||
|
###############################################################################
|
||||||
|
* text=auto
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Set default behavior for command prompt diff.
|
||||||
|
#
|
||||||
|
# This is need for earlier builds of msysgit that does not have it on by
|
||||||
|
# default for csharp files.
|
||||||
|
# Note: This is only used by command line
|
||||||
|
###############################################################################
|
||||||
|
#*.cs diff=csharp
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Set the merge driver for project and solution files
|
||||||
|
#
|
||||||
|
# Merging from the command prompt will add diff markers to the files if there
|
||||||
|
# are conflicts (Merging from VS is not affected by the settings below, in VS
|
||||||
|
# the diff markers are never inserted). Diff markers may cause the following
|
||||||
|
# file extensions to fail to load in VS. An alternative would be to treat
|
||||||
|
# these files as binary and thus will always conflict and require user
|
||||||
|
# intervention with every merge. To do so, just uncomment the entries below
|
||||||
|
###############################################################################
|
||||||
|
#*.sln merge=binary
|
||||||
|
#*.csproj merge=binary
|
||||||
|
#*.vbproj merge=binary
|
||||||
|
#*.vcxproj merge=binary
|
||||||
|
#*.vcproj merge=binary
|
||||||
|
#*.dbproj merge=binary
|
||||||
|
#*.fsproj merge=binary
|
||||||
|
#*.lsproj merge=binary
|
||||||
|
#*.wixproj merge=binary
|
||||||
|
#*.modelproj merge=binary
|
||||||
|
#*.sqlproj merge=binary
|
||||||
|
#*.wwaproj merge=binary
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# behavior for image files
|
||||||
|
#
|
||||||
|
# image files are treated as binary by default.
|
||||||
|
###############################################################################
|
||||||
|
#*.jpg binary
|
||||||
|
#*.png binary
|
||||||
|
#*.gif binary
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# diff behavior for common document formats
|
||||||
|
#
|
||||||
|
# Convert binary document formats to text before diffing them. This feature
|
||||||
|
# is only available from the command line. Turn it on by uncommenting the
|
||||||
|
# entries below.
|
||||||
|
###############################################################################
|
||||||
|
#*.doc diff=astextplain
|
||||||
|
#*.DOC diff=astextplain
|
||||||
|
#*.docx diff=astextplain
|
||||||
|
#*.DOCX diff=astextplain
|
||||||
|
#*.dot diff=astextplain
|
||||||
|
#*.DOT diff=astextplain
|
||||||
|
#*.pdf diff=astextplain
|
||||||
|
#*.PDF diff=astextplain
|
||||||
|
#*.rtf diff=astextplain
|
||||||
|
#*.RTF diff=astextplain
|
156
express-server/node_modules/asn1js/.npmignore
generated
vendored
Normal file
156
express-server/node_modules/asn1js/.npmignore
generated
vendored
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
## Ignore Visual Studio temporary files, build results, and
|
||||||
|
## files generated by popular Visual Studio add-ons.
|
||||||
|
|
||||||
|
# User-specific files
|
||||||
|
*.suo
|
||||||
|
*.user
|
||||||
|
*.sln.docstates
|
||||||
|
|
||||||
|
# Build results
|
||||||
|
|
||||||
|
[Dd]ebug/
|
||||||
|
[Rr]elease/
|
||||||
|
x64/
|
||||||
|
build/
|
||||||
|
[Bb]in/
|
||||||
|
[Oo]bj/
|
||||||
|
|
||||||
|
# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets
|
||||||
|
!packages/*/build/
|
||||||
|
|
||||||
|
# MSTest test Results
|
||||||
|
[Tt]est[Rr]esult*/
|
||||||
|
[Bb]uild[Ll]og.*
|
||||||
|
|
||||||
|
*_i.c
|
||||||
|
*_p.c
|
||||||
|
*.ilk
|
||||||
|
*.meta
|
||||||
|
*.obj
|
||||||
|
*.pch
|
||||||
|
*.pdb
|
||||||
|
*.pgc
|
||||||
|
*.pgd
|
||||||
|
*.rsp
|
||||||
|
*.sbr
|
||||||
|
*.tlb
|
||||||
|
*.tli
|
||||||
|
*.tlh
|
||||||
|
*.tmp
|
||||||
|
*.tmp_proj
|
||||||
|
*.log
|
||||||
|
*.vspscc
|
||||||
|
*.vssscc
|
||||||
|
.builds
|
||||||
|
*.pidb
|
||||||
|
*.log
|
||||||
|
*.scc
|
||||||
|
|
||||||
|
# Visual C++ cache files
|
||||||
|
ipch/
|
||||||
|
*.aps
|
||||||
|
*.ncb
|
||||||
|
*.opensdf
|
||||||
|
*.sdf
|
||||||
|
*.cachefile
|
||||||
|
|
||||||
|
# Visual Studio profiler
|
||||||
|
*.psess
|
||||||
|
*.vsp
|
||||||
|
*.vspx
|
||||||
|
|
||||||
|
# Guidance Automation Toolkit
|
||||||
|
*.gpState
|
||||||
|
|
||||||
|
# ReSharper is a .NET coding add-in
|
||||||
|
_ReSharper*/
|
||||||
|
*.[Rr]e[Ss]harper
|
||||||
|
|
||||||
|
# TeamCity is a build add-in
|
||||||
|
_TeamCity*
|
||||||
|
|
||||||
|
# DotCover is a Code Coverage Tool
|
||||||
|
*.dotCover
|
||||||
|
|
||||||
|
# NCrunch
|
||||||
|
*.ncrunch*
|
||||||
|
.*crunch*.local.xml
|
||||||
|
|
||||||
|
# Installshield output folder
|
||||||
|
[Ee]xpress/
|
||||||
|
|
||||||
|
# DocProject is a documentation generator add-in
|
||||||
|
DocProject/buildhelp/
|
||||||
|
DocProject/Help/*.HxT
|
||||||
|
DocProject/Help/*.HxC
|
||||||
|
DocProject/Help/*.hhc
|
||||||
|
DocProject/Help/*.hhk
|
||||||
|
DocProject/Help/*.hhp
|
||||||
|
DocProject/Help/Html2
|
||||||
|
DocProject/Help/html
|
||||||
|
|
||||||
|
# Click-Once directory
|
||||||
|
publish/
|
||||||
|
|
||||||
|
# Publish Web Output
|
||||||
|
*.Publish.xml
|
||||||
|
|
||||||
|
# NuGet Packages Directory
|
||||||
|
## TODO: If you have NuGet Package Restore enabled, uncomment the next line
|
||||||
|
#packages/
|
||||||
|
|
||||||
|
# Windows Azure Build Output
|
||||||
|
csx
|
||||||
|
*.build.csdef
|
||||||
|
|
||||||
|
# Windows Store app package directory
|
||||||
|
AppPackages/
|
||||||
|
|
||||||
|
# Others
|
||||||
|
sql/
|
||||||
|
*.Cache
|
||||||
|
ClientBin/
|
||||||
|
[Ss]tyle[Cc]op.*
|
||||||
|
~$*
|
||||||
|
*~
|
||||||
|
*.dbmdl
|
||||||
|
*.[Pp]ublish.xml
|
||||||
|
*.pfx
|
||||||
|
*.publishsettings
|
||||||
|
|
||||||
|
# RIA/Silverlight projects
|
||||||
|
Generated_Code/
|
||||||
|
|
||||||
|
# Backup & report files from converting an old project file to a newer
|
||||||
|
# Visual Studio version. Backup files are not needed, because we have git ;-)
|
||||||
|
_UpgradeReport_Files/
|
||||||
|
Backup*/
|
||||||
|
UpgradeLog*.XML
|
||||||
|
UpgradeLog*.htm
|
||||||
|
|
||||||
|
# SQL Server files
|
||||||
|
App_Data/*.mdf
|
||||||
|
App_Data/*.ldf
|
||||||
|
|
||||||
|
|
||||||
|
#LightSwitch generated files
|
||||||
|
GeneratedArtifacts/
|
||||||
|
_Pvt_Extensions/
|
||||||
|
ModelManifest.xml
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# Windows detritus
|
||||||
|
# =========================
|
||||||
|
|
||||||
|
# Windows image file caches
|
||||||
|
Thumbs.db
|
||||||
|
ehthumbs.db
|
||||||
|
|
||||||
|
# Folder config file
|
||||||
|
Desktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
||||||
|
# Mac desktop service store files
|
||||||
|
.DS_Store
|
1
express-server/node_modules/asn1js/CNAME
generated
vendored
Normal file
1
express-server/node_modules/asn1js/CNAME
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
asn1js.org
|
30
express-server/node_modules/asn1js/LICENSE
generated
vendored
Normal file
30
express-server/node_modules/asn1js/LICENSE
generated
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
Copyright (c) 2014, GMO GlobalSign
|
||||||
|
Copyright (c) 2015, Peculiar Ventures
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Author 2014-2015, Yury Strozhevsky
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or
|
||||||
|
other materials provided with the distribution.
|
||||||
|
|
||||||
|
* Neither the name of the copyright holder nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
212
express-server/node_modules/asn1js/README.md
generated
vendored
Normal file
212
express-server/node_modules/asn1js/README.md
generated
vendored
Normal file
@ -0,0 +1,212 @@
|
|||||||
|
## ASN1js
|
||||||
|
|
||||||
|
[](https://raw.githubusercontent.com/GlobalSign/ASN1.js/master/LICENSE)
|
||||||
|
|
||||||
|
Abstract Syntax Notation One (ASN.1) is a standard and notation that describes rules and structures for representing, encoding, transmitting, and decoding data in telecommunications and computer networking. [ASN1js][] is a pure JavaScript library implementing this standard. ASN.1 is the basis of all X.509 related data structures and numerous other protocols used on the web.
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
[ASN1js][] is the first library for [BER][] encoding/decoding in Javascript designed for browser use. [BER][] is the basic encoding rules for [ASN.1][] that all others are based on, [DER][] is the encoding rules used by PKI applications - it is a subset of [BER][]. The [ASN1js][] library was tested against [freely available ASN.1:2008 test suite], with some limitations related to JavaScript language.
|
||||||
|
|
||||||
|
## Features of the library
|
||||||
|
|
||||||
|
* [ASN1js][] is a "base layer" for full-featured JS library [PKIjs][], which is using Web Cryptography API and has all classes, neccessary to work with PKI-related data;
|
||||||
|
* Fully object-oriented library. Inhiritence is using everywhere inside the lib;
|
||||||
|
* Working with HTML5 data objects (ArrayBuffer, Uint8Array etc.);
|
||||||
|
* Working with all ASN.1:2008 types;
|
||||||
|
* Working with [BER][] encoded data;
|
||||||
|
* All types inside the library constantly stores information about all ASN.1 sub blocks (tag block, length block or value block);
|
||||||
|
* User may have access to any byte inside any ASN.1 sub-block;
|
||||||
|
* Any sub-block may have unlimited length, as it described in ASN.1 standard (even "tag block");
|
||||||
|
* Ability to work with ASN.1 string date types (intcluding all "international" strings like UniversalString, BMPString, UTF8String) by passing native JavaScript strings into constuctors. And vice versa - all initially parsed data of ASN.1 string types right after decoding automatically converts into native JavaScript strings;
|
||||||
|
* Same with ASN.1 date-time types: for major types like UTCTime and GeneralizedTime there are automatic convertion between "JS date type - ASN.1 date-time type" + vice versa;
|
||||||
|
* Same with ASN.1 OBJECT-IDENTIFIER (OID) data-type: you can initialize OID by JavaScript string and can get string representation via calling "oid.value_block.toString()";
|
||||||
|
* Working with "easy-to-understand" ASN.1 schemas (pre-defined or built by user);
|
||||||
|
* Has special types to work with ASN.1 schemas:
|
||||||
|
* ANY
|
||||||
|
* CHOICE
|
||||||
|
* REPEATED
|
||||||
|
* User can name any block inside ASN.1 schema and easily get information by name;
|
||||||
|
* Ability to parse internal data inside a primitively encoded data types and automatically validate it against special schema;
|
||||||
|
* All types inside library are dynamic;
|
||||||
|
* All types can be initialized in static or dynamic ways.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// #region How to create new ASN. structures
|
||||||
|
var sequence = new org.pkijs.asn1.SEQUENCE();
|
||||||
|
sequence.value_block.value.push(new org.pkijs.asn1.INTEGER({ value: 1 }));
|
||||||
|
|
||||||
|
var sequence_buffer = sequence.toBER(false); // Encode current sequence to BER (in ArrayBuffer)
|
||||||
|
var current_size = sequence_buffer.byteLength;
|
||||||
|
|
||||||
|
var integer_data = new ArrayBuffer(8);
|
||||||
|
var integer_view = new Uint8Array(integer_data);
|
||||||
|
integer_view[0] = 0x01;
|
||||||
|
integer_view[1] = 0x01;
|
||||||
|
integer_view[2] = 0x01;
|
||||||
|
integer_view[3] = 0x01;
|
||||||
|
integer_view[4] = 0x01;
|
||||||
|
integer_view[5] = 0x01;
|
||||||
|
integer_view[6] = 0x01;
|
||||||
|
integer_view[7] = 0x01;
|
||||||
|
|
||||||
|
sequence.value_block.value.push(new org.pkijs.asn1.INTEGER({
|
||||||
|
is_hex_only: true,
|
||||||
|
value_hex: integer_data
|
||||||
|
})); // Put too long for decoding INTEGER value
|
||||||
|
|
||||||
|
sequence_buffer = sequence.toBER(false);
|
||||||
|
current_size = sequence_buffer.byteLength;
|
||||||
|
// #endregion
|
||||||
|
```
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// #region How to create new ASN.1 structures by calling constuctors with parameters
|
||||||
|
var sequence2 = new org.pkijs.asn1.SEQUENCE({
|
||||||
|
value: [
|
||||||
|
new org.pkijs.asn1.INTEGER({ value: 1 }),
|
||||||
|
new org.pkijs.asn1.INTEGER({
|
||||||
|
is_hex_only: true,
|
||||||
|
value_hex: integer_data
|
||||||
|
}),
|
||||||
|
]
|
||||||
|
});
|
||||||
|
// #endregion
|
||||||
|
```
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// #region How to validate ASN.1 against pre-defined schema
|
||||||
|
var asn1_schema = new org.pkijs.asn1.SEQUENCE({
|
||||||
|
name: "block1",
|
||||||
|
value: [
|
||||||
|
new org.pkijs.asn1.NULL({
|
||||||
|
name: "block2"
|
||||||
|
}),
|
||||||
|
new org.pkijs.asn1.INTEGER({
|
||||||
|
name: "block3",
|
||||||
|
optional: true // This block is absent inside data, but it's "optional". Hence verification against the schema will be passed.
|
||||||
|
})
|
||||||
|
]
|
||||||
|
});
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
var variant1 = org.pkijs.verifySchema(encoded_sequence, asn1_schema); // Verify schema together with decoding of raw data
|
||||||
|
var variant1_verified = variant1.verified;
|
||||||
|
var variant1_result = variant1.result; // Verified decoded data with all block names inside
|
||||||
|
```
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// #region How to use "internal schemas" for primitevely encoded data types
|
||||||
|
var primitive_octetstring = new org.pkijs.asn1.OCTETSTRING({ value_hex: encoded_sequence }); // Create a primitively encoded OCTETSTRING where internal data is an encoded SEQUENCE
|
||||||
|
|
||||||
|
var asn1_schema_internal = new org.pkijs.asn1.OCTETSTRING({
|
||||||
|
name: "outer_block",
|
||||||
|
primitive_schema: new org.pkijs.asn1.SEQUENCE({
|
||||||
|
name: "block1",
|
||||||
|
value: [
|
||||||
|
new org.pkijs.asn1.NULL({
|
||||||
|
name: "block2"
|
||||||
|
})
|
||||||
|
]
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
var variant6 = org.pkijs.compareSchema(primitive_octetstring, primitive_octetstring, asn1_schema_internal);
|
||||||
|
var variant6_verified = variant4.verified;
|
||||||
|
var variant6_block1_tag_num = variant6.result.block1.id_block.tag_number;
|
||||||
|
var variant6_block2_tag_num = variant6.result.block2.id_block.tag_number;
|
||||||
|
// #endregion
|
||||||
|
```
|
||||||
|
|
||||||
|
More examples could be found in "examples" directory or inside [PKIjs][] library.
|
||||||
|
|
||||||
|
## Related source code
|
||||||
|
|
||||||
|
* [C++ ASN1:2008 BER coder/decoder](https://github.com/YuryStrozhevsky/C-plus-plus-ASN.1-2008-coder-decoder) - the "father" of [ASN1js][] project;
|
||||||
|
* [Freely available ASN.1:2008 test suite](https://github.com/YuryStrozhevsky/ASN1-2008-free-test-suite) - the suite which can help you to validate (and better understand) any ASN.1 coder/decoder;
|
||||||
|
|
||||||
|
## Suitability
|
||||||
|
At this time this library should be considered suitable for research and experimentation, futher code and security review is needed before utilization in a production application.
|
||||||
|
|
||||||
|
## How to use ASN1js and PKIjs with Node.js
|
||||||
|
|
||||||
|
**!!! WARNING !!! **
|
||||||
|
**Currently there is no "polyfill" of WebCrypto in Node.js. Thus you will not be able to use signature / verification features of PKIjs in Node.js programs.**
|
||||||
|
|
||||||
|
In order to use [PKIjs][] you will also need [ASN1js][] plus [node.extend](https://www.npmjs.com/package/node.extend) package.
|
||||||
|
```javascript
|
||||||
|
var merge = require("node.extend");
|
||||||
|
|
||||||
|
var common = require("asn1js/org/pkijs/common");
|
||||||
|
var _asn1js = require("asn1js");
|
||||||
|
var _pkijs = require("pkijs");
|
||||||
|
var _x509schema = require("pkijs/org/pkijs/x509_schema");
|
||||||
|
|
||||||
|
// #region Merging function/object declarations for ASN1js and PKIjs
|
||||||
|
var asn1js = merge(true, _asn1js, common);
|
||||||
|
|
||||||
|
var x509schema = merge(true, _x509schema, asn1js);
|
||||||
|
|
||||||
|
var pkijs_1 = merge(true, _pkijs, asn1js);
|
||||||
|
var pkijs = merge(true, pkijs_1, x509schema);
|
||||||
|
// #endregion
|
||||||
|
```
|
||||||
|
|
||||||
|
After that you will ba able to use ASN1js and PKIjs via common way:
|
||||||
|
```javascript
|
||||||
|
// #region Decode and parse X.509 cert
|
||||||
|
var asn1 = pkijs.org.pkijs.fromBER(certBuffer);
|
||||||
|
var cert;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
cert = new pkijs.org.pkijs.simpl.CERT({ schema: asn1.result });
|
||||||
|
}
|
||||||
|
catch(ex)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// #endregion
|
||||||
|
```
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Copyright (c) 2014, [GMO GlobalSign](http://www.globalsign.com/)
|
||||||
|
Copyright (c) 2015, [Peculiar Ventures](http://peculiarventures.com/)
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Author 2014-2015, [Yury Strozhevsky](http://www.strozhevsky.com/).
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
3. Neither the name of the copyright holder nor the names of its contributors
|
||||||
|
may be used to endorse or promote products derived from this software without
|
||||||
|
specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||||
|
OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
[ASN.1]: http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One
|
||||||
|
[ASN1js]: http://asn1js.org/
|
||||||
|
[PKIjs]: http://pkijs.org/
|
||||||
|
[BER]: http://en.wikipedia.org/wiki/X.690#BER_encoding
|
||||||
|
[DER]: http://en.wikipedia.org/wiki/X.690#DER_encoding
|
||||||
|
[freely available ASN.1:2008 test suite]: http://www.strozhevsky.com/free_docs/free_asn1_testsuite_descr.pdf
|
240
express-server/node_modules/asn1js/examples/ASN.1 usage/asn1_usage.js
generated
vendored
Normal file
240
express-server/node_modules/asn1js/examples/ASN.1 usage/asn1_usage.js
generated
vendored
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2014, GMO GlobalSign
|
||||||
|
* Copyright (c) 2015, Peculiar Ventures
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Author 2014-2015, Yury Strozhevsky <www.strozhevsky.com>.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software without
|
||||||
|
* specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||||
|
* OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
//**************************************************************************************
|
||||||
|
function test()
|
||||||
|
{
|
||||||
|
// #region How to create new ASN. structures
|
||||||
|
var sequence = new org.pkijs.asn1.SEQUENCE();
|
||||||
|
sequence.value_block.value.push(new org.pkijs.asn1.INTEGER({ value: 1 }));
|
||||||
|
|
||||||
|
var sequence_buffer = sequence.toBER(false); // Encode current sequence to BER (in ArrayBuffer)
|
||||||
|
var current_size = sequence_buffer.byteLength;
|
||||||
|
|
||||||
|
var integer_data = new ArrayBuffer(8);
|
||||||
|
var integer_view = new Uint8Array(integer_data);
|
||||||
|
integer_view[0] = 0x01;
|
||||||
|
integer_view[1] = 0x01;
|
||||||
|
integer_view[2] = 0x01;
|
||||||
|
integer_view[3] = 0x01;
|
||||||
|
integer_view[4] = 0x01;
|
||||||
|
integer_view[5] = 0x01;
|
||||||
|
integer_view[6] = 0x01;
|
||||||
|
integer_view[7] = 0x01;
|
||||||
|
|
||||||
|
sequence.value_block.value.push(new org.pkijs.asn1.INTEGER({
|
||||||
|
is_hex_only: true,
|
||||||
|
value_hex: integer_data
|
||||||
|
})); // Put too long for decoding INTEGER value
|
||||||
|
|
||||||
|
sequence_buffer = sequence.toBER(false);
|
||||||
|
current_size = sequence_buffer.byteLength;
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
// #region How to create new ASN.1 structures by calling constuctors with parameters
|
||||||
|
var sequence2 = new org.pkijs.asn1.SEQUENCE({
|
||||||
|
value: [
|
||||||
|
new org.pkijs.asn1.INTEGER({ value: 1 }),
|
||||||
|
new org.pkijs.asn1.INTEGER({
|
||||||
|
is_hex_only: true,
|
||||||
|
value_hex: integer_data
|
||||||
|
}),
|
||||||
|
]
|
||||||
|
});
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
// #region How to check that decoded value is too big
|
||||||
|
var big_integer_value;
|
||||||
|
|
||||||
|
var big_integer = new org.pkijs.asn1.INTEGER({
|
||||||
|
is_hex_only: true,
|
||||||
|
value_hex: integer_data
|
||||||
|
});
|
||||||
|
|
||||||
|
if(big_integer.value_block.is_hex_only === false)
|
||||||
|
big_integer_value = big_integer.value_block.value_dec; // Native integer value
|
||||||
|
else
|
||||||
|
big_integer_value = big_integer.value_block.value_hex; // ArrayBuffer
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
// #region How to get ASN.1 structures from raw data (ASN.1 decoding)
|
||||||
|
var encoded_sequence = new ArrayBuffer(4);
|
||||||
|
var encoded_sequence_view = new Uint8Array(encoded_sequence);
|
||||||
|
encoded_sequence_view[0] = 0x30;
|
||||||
|
encoded_sequence_view[1] = 0x02;
|
||||||
|
encoded_sequence_view[2] = 0x05;
|
||||||
|
encoded_sequence_view[3] = 0x00;
|
||||||
|
|
||||||
|
var decoded_asn1 = org.pkijs.fromBER(encoded_sequence);
|
||||||
|
if(decoded_asn1.offset === (-1))
|
||||||
|
return; // Error during decoding
|
||||||
|
|
||||||
|
var decoded_sequence = decoded_asn1.result;
|
||||||
|
|
||||||
|
var internal_value = decoded_sequence.value_block.value[0];
|
||||||
|
var internal_value_tag_number = internal_value.id_block.tag_number; // Value of "5" equal to ASN.1 NULL type
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
// #region How to work with ASN.1 strings
|
||||||
|
var bmp_string_encoded = new ArrayBuffer(16); // This ArrayBuffer consinsts of encoded ASN.1 BMPString with "abc_" + three first chars from Russian alphabet
|
||||||
|
var bmp_string_view = new Uint8Array(bmp_string_encoded);
|
||||||
|
bmp_string_view[0] = 0x1E;
|
||||||
|
bmp_string_view[1] = 0x0E;
|
||||||
|
bmp_string_view[2] = 0x00;
|
||||||
|
bmp_string_view[3] = 0x61;
|
||||||
|
bmp_string_view[4] = 0x00;
|
||||||
|
bmp_string_view[5] = 0x62;
|
||||||
|
bmp_string_view[6] = 0x00;
|
||||||
|
bmp_string_view[7] = 0x63;
|
||||||
|
bmp_string_view[8] = 0x00;
|
||||||
|
bmp_string_view[9] = 0x5F;
|
||||||
|
bmp_string_view[10] = 0x04;
|
||||||
|
bmp_string_view[11] = 0x30;
|
||||||
|
bmp_string_view[12] = 0x04;
|
||||||
|
bmp_string_view[13] = 0x31;
|
||||||
|
bmp_string_view[14] = 0x04;
|
||||||
|
bmp_string_view[15] = 0x32;
|
||||||
|
|
||||||
|
var bmp_string_decoded = org.pkijs.fromBER(bmp_string_encoded);
|
||||||
|
if(bmp_string_decoded.offset === (-1))
|
||||||
|
return; // Error during decoding
|
||||||
|
|
||||||
|
var javascript_string1 = bmp_string_decoded.result.value_block.value;
|
||||||
|
|
||||||
|
var bmp_string = new org.pkijs.asn1.BMPSTRING({ value: "abc_абв" }); // Same with initialization by static JavaScript string
|
||||||
|
var javascript_string2 = bmp_string.value_block.value;
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
// #region How to validate ASN.1 against pre-defined schema
|
||||||
|
var asn1_schema = new org.pkijs.asn1.SEQUENCE({
|
||||||
|
name: "block1",
|
||||||
|
value: [
|
||||||
|
new org.pkijs.asn1.NULL({
|
||||||
|
name: "block2"
|
||||||
|
}),
|
||||||
|
new org.pkijs.asn1.INTEGER({
|
||||||
|
name: "block3",
|
||||||
|
optional: true // This block is absent inside data, but it's "optional". Hence verification against the schema will be passed.
|
||||||
|
})
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
var variant1 = org.pkijs.verifySchema(encoded_sequence, asn1_schema); // Verify schema together with decoding of raw data
|
||||||
|
var variant1_verified = variant1.verified;
|
||||||
|
var variant1_result = variant1.result; // Verified decoded data with all block names inside
|
||||||
|
|
||||||
|
var variant1_block1 = variant1_result.block1;
|
||||||
|
var variant1_block2 = variant1_result.block2;
|
||||||
|
|
||||||
|
var variant2 = org.pkijs.compareSchema(decoded_sequence, decoded_sequence, asn1_schema); // Compare already decoded ASN.1 against pre-defined schema
|
||||||
|
var variant2_verified = variant2.verified;
|
||||||
|
var variant2_result = variant2.result; // Verified decoded data with all block names inside
|
||||||
|
|
||||||
|
var variant2_block1 = variant2_result.block1;
|
||||||
|
var variant2_block2 = variant2_result.block2;
|
||||||
|
|
||||||
|
var asn1_schema_any = new org.pkijs.asn1.SEQUENCE({
|
||||||
|
name: "block1",
|
||||||
|
value: [
|
||||||
|
new org.pkijs.asn1.ANY({ // Special type, for ASN.1 schemas only - will validate schema against any ASN.1 type
|
||||||
|
name: "block2"
|
||||||
|
})
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
decoded_sequence = org.pkijs.fromBER(encoded_sequence).result; // Re-setting "decoded_sequence"
|
||||||
|
|
||||||
|
var variant3 = org.pkijs.compareSchema(decoded_sequence, decoded_sequence, asn1_schema_any);
|
||||||
|
var variant3_verified = variant3.verified;
|
||||||
|
|
||||||
|
var asn1_schema_repeated = new org.pkijs.asn1.SEQUENCE({
|
||||||
|
name: "block1",
|
||||||
|
value: [
|
||||||
|
new org.pkijs.asn1.REPEATED({ // Special type, for ASN.1 schemas only - will check that inside decoded data there are sequence of values with one type only
|
||||||
|
name: "block2_array",
|
||||||
|
value: new org.pkijs.asn1.NULL()
|
||||||
|
})
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
decoded_sequence = org.pkijs.fromBER(encoded_sequence).result; // Re-setting "decoded_sequence"
|
||||||
|
|
||||||
|
var variant4 = org.pkijs.compareSchema(decoded_sequence, decoded_sequence, asn1_schema_repeated);
|
||||||
|
var variant4_verified = variant4.verified;
|
||||||
|
|
||||||
|
var variant4_array = variant4.block2_array; // Array of internal blocks
|
||||||
|
|
||||||
|
var asn1_schema_choice = new org.pkijs.asn1.SEQUENCE({
|
||||||
|
name: "block1",
|
||||||
|
value: [
|
||||||
|
new org.pkijs.asn1.CHOICE({ // Special type, for ASN.1 schemas only - will check ASN.1 data has one of type
|
||||||
|
value: [
|
||||||
|
new org.pkijs.asn1.NULL({
|
||||||
|
name: "block2"
|
||||||
|
}),
|
||||||
|
new org.pkijs.asn1.INTEGER({
|
||||||
|
name: "block2"
|
||||||
|
}),
|
||||||
|
]
|
||||||
|
})
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
decoded_sequence = org.pkijs.fromBER(encoded_sequence).result; // Re-setting "decoded_sequence"
|
||||||
|
|
||||||
|
var variant5 = org.pkijs.compareSchema(decoded_sequence, decoded_sequence, asn1_schema_choice);
|
||||||
|
var variant5_verified = variant4.verified;
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
// #region How to use "internal schemas" for primitevely encoded data types
|
||||||
|
var primitive_octetstring = new org.pkijs.asn1.OCTETSTRING({ value_hex: encoded_sequence }); // Create a primitively encoded OCTETSTRING where internal data is an encoded SEQUENCE
|
||||||
|
|
||||||
|
var asn1_schema_internal = new org.pkijs.asn1.OCTETSTRING({
|
||||||
|
name: "outer_block",
|
||||||
|
primitive_schema: new org.pkijs.asn1.SEQUENCE({
|
||||||
|
name: "block1",
|
||||||
|
value: [
|
||||||
|
new org.pkijs.asn1.NULL({
|
||||||
|
name: "block2"
|
||||||
|
})
|
||||||
|
]
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
var variant6 = org.pkijs.compareSchema(primitive_octetstring, primitive_octetstring, asn1_schema_internal);
|
||||||
|
var variant6_verified = variant4.verified;
|
||||||
|
var variant6_block1_tag_num = variant6.result.block1.id_block.tag_number;
|
||||||
|
var variant6_block2_tag_num = variant6.result.block2.id_block.tag_number;
|
||||||
|
// #endregion
|
||||||
|
}
|
||||||
|
//**************************************************************************************
|
5466
express-server/node_modules/asn1js/org/pkijs/asn1.js
generated
vendored
Normal file
5466
express-server/node_modules/asn1js/org/pkijs/asn1.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1541
express-server/node_modules/asn1js/org/pkijs/common.js
generated
vendored
Normal file
1541
express-server/node_modules/asn1js/org/pkijs/common.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
94
express-server/node_modules/asn1js/package.json
generated
vendored
Normal file
94
express-server/node_modules/asn1js/package.json
generated
vendored
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
{
|
||||||
|
"_args": [
|
||||||
|
[
|
||||||
|
"asn1js@^1.2.12",
|
||||||
|
"/nodeapps/https-test/greenlock-express.js/node_modules/certpem"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"_from": "asn1js@>=1.2.12 <2.0.0",
|
||||||
|
"_id": "asn1js@1.2.12",
|
||||||
|
"_inCache": true,
|
||||||
|
"_installable": true,
|
||||||
|
"_location": "/asn1js",
|
||||||
|
"_nodeVersion": "5.8.0",
|
||||||
|
"_npmOperationalInternal": {
|
||||||
|
"host": "packages-16-east.internal.npmjs.com",
|
||||||
|
"tmp": "tmp/asn1js-1.2.12.tgz_1460549801979_0.2164379085879773"
|
||||||
|
},
|
||||||
|
"_npmUser": {
|
||||||
|
"email": "yury@strozhevsky.com",
|
||||||
|
"name": "yury.strozhevsky"
|
||||||
|
},
|
||||||
|
"_npmVersion": "3.7.3",
|
||||||
|
"_phantomChildren": {},
|
||||||
|
"_requested": {
|
||||||
|
"name": "asn1js",
|
||||||
|
"raw": "asn1js@^1.2.12",
|
||||||
|
"rawSpec": "^1.2.12",
|
||||||
|
"scope": null,
|
||||||
|
"spec": ">=1.2.12 <2.0.0",
|
||||||
|
"type": "range"
|
||||||
|
},
|
||||||
|
"_requiredBy": [
|
||||||
|
"/certpem"
|
||||||
|
],
|
||||||
|
"_resolved": "https://registry.npmjs.org/asn1js/-/asn1js-1.2.12.tgz",
|
||||||
|
"_shasum": "87d5ee797596ae2d2a3cb0247220dc42ffc3f211",
|
||||||
|
"_shrinkwrap": null,
|
||||||
|
"_spec": "asn1js@^1.2.12",
|
||||||
|
"_where": "/nodeapps/https-test/greenlock-express.js/node_modules/certpem",
|
||||||
|
"author": {
|
||||||
|
"email": "yury@strozhevsky.com",
|
||||||
|
"name": "Yury Strozhevsky"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/GlobalSign/ASN1.js/issues"
|
||||||
|
},
|
||||||
|
"contributors": [
|
||||||
|
{
|
||||||
|
"name": "Ryan Hurst",
|
||||||
|
"email": "rmh@unmitigatedrisk.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dependencies": {},
|
||||||
|
"description": "ASN1js is a pure JavaScript library implementing this standard. ASN.1 is the basis of all X.509 related data structures and numerous other protocols used on the web",
|
||||||
|
"devDependencies": {},
|
||||||
|
"directories": {},
|
||||||
|
"dist": {
|
||||||
|
"shasum": "87d5ee797596ae2d2a3cb0247220dc42ffc3f211",
|
||||||
|
"tarball": "https://registry.npmjs.org/asn1js/-/asn1js-1.2.12.tgz"
|
||||||
|
},
|
||||||
|
"gitHead": "766534d2109c0e9ccc72d9b094eef50efe007925",
|
||||||
|
"homepage": "https://github.com/GlobalSign/ASN1.js#readme",
|
||||||
|
"keywords": [
|
||||||
|
"asn.1",
|
||||||
|
"asn1",
|
||||||
|
"ber",
|
||||||
|
"bitstring",
|
||||||
|
"bmpstring",
|
||||||
|
"der",
|
||||||
|
"generalizedtime",
|
||||||
|
"octetstring",
|
||||||
|
"sequence",
|
||||||
|
"set",
|
||||||
|
"universalstring",
|
||||||
|
"utctime",
|
||||||
|
"utf8string"
|
||||||
|
],
|
||||||
|
"main": "org/pkijs/asn1.js",
|
||||||
|
"maintainers": [
|
||||||
|
{
|
||||||
|
"name": "yury.strozhevsky",
|
||||||
|
"email": "yury@strozhevsky.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "asn1js",
|
||||||
|
"optionalDependencies": {},
|
||||||
|
"readme": "ERROR: No README data found!",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/GlobalSign/ASN1.js.git"
|
||||||
|
},
|
||||||
|
"scripts": {},
|
||||||
|
"version": "1.2.12"
|
||||||
|
}
|
7
express-server/node_modules/async-limiter/.travis.yml
generated
vendored
Normal file
7
express-server/node_modules/async-limiter/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
language: node_js
|
||||||
|
node_js:
|
||||||
|
- "6"
|
||||||
|
- "node"
|
||||||
|
script: npm run travis
|
||||||
|
cache:
|
||||||
|
yarn: true
|
8
express-server/node_modules/async-limiter/LICENSE
generated
vendored
Normal file
8
express-server/node_modules/async-limiter/LICENSE
generated
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
Copyright (c) 2017 Samuel Reed <samuel.trace.reed@gmail.com>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
1
express-server/node_modules/async-limiter/coverage/coverage.json
generated
vendored
Normal file
1
express-server/node_modules/async-limiter/coverage/coverage.json
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"/Users/samuelreed/git/forks/async-throttle/index.js":{"path":"/Users/samuelreed/git/forks/async-throttle/index.js","s":{"1":1,"2":7,"3":1,"4":6,"5":6,"6":6,"7":6,"8":6,"9":6,"10":1,"11":1,"12":3,"13":13,"14":13,"15":13,"16":1,"17":19,"18":1,"19":45,"20":6,"21":39,"22":13,"23":13,"24":13,"25":13,"26":39,"27":18,"28":6,"29":6,"30":1,"31":6,"32":6,"33":6,"34":1,"35":13,"36":13,"37":1},"b":{"1":[1,6],"2":[6,5],"3":[6,5],"4":[6,39],"5":[13,26],"6":[18,21],"7":[6,0]},"f":{"1":7,"2":3,"3":13,"4":19,"5":45,"6":6,"7":13},"fnMap":{"1":{"name":"Queue","line":3,"loc":{"start":{"line":3,"column":0},"end":{"line":3,"column":24}}},"2":{"name":"(anonymous_2)","line":22,"loc":{"start":{"line":22,"column":24},"end":{"line":22,"column":41}}},"3":{"name":"(anonymous_3)","line":23,"loc":{"start":{"line":23,"column":28},"end":{"line":23,"column":39}}},"4":{"name":"(anonymous_4)","line":31,"loc":{"start":{"line":31,"column":7},"end":{"line":31,"column":18}}},"5":{"name":"(anonymous_5)","line":36,"loc":{"start":{"line":36,"column":23},"end":{"line":36,"column":34}}},"6":{"name":"(anonymous_6)","line":55,"loc":{"start":{"line":55,"column":25},"end":{"line":55,"column":38}}},"7":{"name":"done","line":62,"loc":{"start":{"line":62,"column":0},"end":{"line":62,"column":16}}}},"statementMap":{"1":{"start":{"line":3,"column":0},"end":{"line":14,"column":1}},"2":{"start":{"line":4,"column":2},"end":{"line":6,"column":3}},"3":{"start":{"line":5,"column":4},"end":{"line":5,"column":30}},"4":{"start":{"line":8,"column":2},"end":{"line":8,"column":26}},"5":{"start":{"line":9,"column":2},"end":{"line":9,"column":53}},"6":{"start":{"line":10,"column":2},"end":{"line":10,"column":19}},"7":{"start":{"line":11,"column":2},"end":{"line":11,"column":17}},"8":{"start":{"line":12,"column":2},"end":{"line":12,"column":16}},"9":{"start":{"line":13,"column":2},"end":{"line":13,"column":31}},"10":{"start":{"line":16,"column":0},"end":{"line":20,"column":2}},"11":{"start":{"line":22,"column":0},"end":{"line":28,"column":3}},"12":{"start":{"line":23,"column":2},"end":{"line":27,"column":4}},"13":{"start":{"line":24,"column":4},"end":{"line":24,"column":75}},"14":{"start":{"line":25,"column":4},"end":{"line":25,"column":16}},"15":{"start":{"line":26,"column":4},"end":{"line":26,"column":24}},"16":{"start":{"line":30,"column":0},"end":{"line":34,"column":3}},"17":{"start":{"line":32,"column":4},"end":{"line":32,"column":43}},"18":{"start":{"line":36,"column":0},"end":{"line":53,"column":2}},"19":{"start":{"line":37,"column":2},"end":{"line":39,"column":3}},"20":{"start":{"line":38,"column":4},"end":{"line":38,"column":11}},"21":{"start":{"line":40,"column":2},"end":{"line":45,"column":3}},"22":{"start":{"line":41,"column":4},"end":{"line":41,"column":32}},"23":{"start":{"line":42,"column":4},"end":{"line":42,"column":19}},"24":{"start":{"line":43,"column":4},"end":{"line":43,"column":20}},"25":{"start":{"line":44,"column":4},"end":{"line":44,"column":16}},"26":{"start":{"line":47,"column":2},"end":{"line":52,"column":3}},"27":{"start":{"line":48,"column":4},"end":{"line":51,"column":5}},"28":{"start":{"line":49,"column":6},"end":{"line":49,"column":30}},"29":{"start":{"line":50,"column":6},"end":{"line":50,"column":27}},"30":{"start":{"line":55,"column":0},"end":{"line":60,"column":2}},"31":{"start":{"line":56,"column":2},"end":{"line":59,"column":3}},"32":{"start":{"line":57,"column":4},"end":{"line":57,"column":22}},"33":{"start":{"line":58,"column":4},"end":{"line":58,"column":16}},"34":{"start":{"line":62,"column":0},"end":{"line":65,"column":1}},"35":{"start":{"line":63,"column":2},"end":{"line":63,"column":17}},"36":{"start":{"line":64,"column":2},"end":{"line":64,"column":14}},"37":{"start":{"line":67,"column":0},"end":{"line":67,"column":23}}},"branchMap":{"1":{"line":4,"type":"if","locations":[{"start":{"line":4,"column":2},"end":{"line":4,"column":2}},{"start":{"line":4,"column":2},"end":{"line":4,"column":2}}]},"2":{"line":8,"type":"binary-expr","locations":[{"start":{"line":8,"column":12},"end":{"line":8,"column":19}},{"start":{"line":8,"column":23},"end":{"line":8,"column":25}}]},"3":{"line":9,"type":"binary-expr","locations":[{"start":{"line":9,"column":21},"end":{"line":9,"column":40}},{"start":{"line":9,"column":44},"end":{"line":9,"column":52}}]},"4":{"line":37,"type":"if","locations":[{"start":{"line":37,"column":2},"end":{"line":37,"column":2}},{"start":{"line":37,"column":2},"end":{"line":37,"column":2}}]},"5":{"line":40,"type":"if","locations":[{"start":{"line":40,"column":2},"end":{"line":40,"column":2}},{"start":{"line":40,"column":2},"end":{"line":40,"column":2}}]},"6":{"line":47,"type":"if","locations":[{"start":{"line":47,"column":2},"end":{"line":47,"column":2}},{"start":{"line":47,"column":2},"end":{"line":47,"column":2}}]},"7":{"line":56,"type":"if","locations":[{"start":{"line":56,"column":2},"end":{"line":56,"column":2}},{"start":{"line":56,"column":2},"end":{"line":56,"column":2}}]}}}}
|
73
express-server/node_modules/async-limiter/coverage/lcov-report/async-throttle/index.html
generated
vendored
Normal file
73
express-server/node_modules/async-limiter/coverage/lcov-report/async-throttle/index.html
generated
vendored
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>Code coverage report for async-throttle/</title>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<link rel="stylesheet" href="../prettify.css">
|
||||||
|
<link rel="stylesheet" href="../base.css">
|
||||||
|
<style type='text/css'>
|
||||||
|
div.coverage-summary .sorter {
|
||||||
|
background-image: url(../sort-arrow-sprite.png);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="header high">
|
||||||
|
<h1>Code coverage report for <span class="entity">async-throttle/</span></h1>
|
||||||
|
<h2>
|
||||||
|
Statements: <span class="metric">100% <small>(37 / 37)</small></span>
|
||||||
|
Branches: <span class="metric">92.86% <small>(13 / 14)</small></span>
|
||||||
|
Functions: <span class="metric">100% <small>(7 / 7)</small></span>
|
||||||
|
Lines: <span class="metric">100% <small>(37 / 37)</small></span>
|
||||||
|
Ignored: <span class="metric"><span class="ignore-none">none</span></span>
|
||||||
|
</h2>
|
||||||
|
<div class="path"><a href="../index.html">All files</a> » async-throttle/</div>
|
||||||
|
</div>
|
||||||
|
<div class="body">
|
||||||
|
<div class="coverage-summary">
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
|
||||||
|
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
|
||||||
|
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
|
||||||
|
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
|
||||||
|
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
|
||||||
|
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
|
||||||
|
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
|
||||||
|
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
|
||||||
|
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
|
||||||
|
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody><tr>
|
||||||
|
<td class="file high" data-value="index.js"><a href="index.js.html">index.js</a></td>
|
||||||
|
<td data-value="100" class="pic high"><span class="cover-fill cover-full" style="width: 100px;"></span><span class="cover-empty" style="width:0px;"></span></td>
|
||||||
|
<td data-value="100" class="pct high">100%</td>
|
||||||
|
<td data-value="37" class="abs high">(37 / 37)</td>
|
||||||
|
<td data-value="92.86" class="pct high">92.86%</td>
|
||||||
|
<td data-value="14" class="abs high">(13 / 14)</td>
|
||||||
|
<td data-value="100" class="pct high">100%</td>
|
||||||
|
<td data-value="7" class="abs high">(7 / 7)</td>
|
||||||
|
<td data-value="100" class="pct high">100%</td>
|
||||||
|
<td data-value="37" class="abs high">(37 / 37)</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="footer">
|
||||||
|
<div class="meta">Generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Mon Sep 11 2017 11:14:14 GMT-0500 (CDT)</div>
|
||||||
|
</div>
|
||||||
|
<script src="../prettify.js"></script>
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
if (typeof prettyPrint === 'function') {
|
||||||
|
prettyPrint();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<script src="../sorter.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
246
express-server/node_modules/async-limiter/coverage/lcov-report/async-throttle/index.js.html
generated
vendored
Normal file
246
express-server/node_modules/async-limiter/coverage/lcov-report/async-throttle/index.js.html
generated
vendored
Normal file
@ -0,0 +1,246 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>Code coverage report for async-throttle/index.js</title>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<link rel="stylesheet" href="../prettify.css">
|
||||||
|
<link rel="stylesheet" href="../base.css">
|
||||||
|
<style type='text/css'>
|
||||||
|
div.coverage-summary .sorter {
|
||||||
|
background-image: url(../sort-arrow-sprite.png);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="header high">
|
||||||
|
<h1>Code coverage report for <span class="entity">async-throttle/index.js</span></h1>
|
||||||
|
<h2>
|
||||||
|
Statements: <span class="metric">100% <small>(37 / 37)</small></span>
|
||||||
|
Branches: <span class="metric">92.86% <small>(13 / 14)</small></span>
|
||||||
|
Functions: <span class="metric">100% <small>(7 / 7)</small></span>
|
||||||
|
Lines: <span class="metric">100% <small>(37 / 37)</small></span>
|
||||||
|
Ignored: <span class="metric"><span class="ignore-none">none</span></span>
|
||||||
|
</h2>
|
||||||
|
<div class="path"><a href="../index.html">All files</a> » <a href="index.html">async-throttle/</a> » index.js</div>
|
||||||
|
</div>
|
||||||
|
<div class="body">
|
||||||
|
<pre><table class="coverage">
|
||||||
|
<tr><td class="line-count">1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
10
|
||||||
|
11
|
||||||
|
12
|
||||||
|
13
|
||||||
|
14
|
||||||
|
15
|
||||||
|
16
|
||||||
|
17
|
||||||
|
18
|
||||||
|
19
|
||||||
|
20
|
||||||
|
21
|
||||||
|
22
|
||||||
|
23
|
||||||
|
24
|
||||||
|
25
|
||||||
|
26
|
||||||
|
27
|
||||||
|
28
|
||||||
|
29
|
||||||
|
30
|
||||||
|
31
|
||||||
|
32
|
||||||
|
33
|
||||||
|
34
|
||||||
|
35
|
||||||
|
36
|
||||||
|
37
|
||||||
|
38
|
||||||
|
39
|
||||||
|
40
|
||||||
|
41
|
||||||
|
42
|
||||||
|
43
|
||||||
|
44
|
||||||
|
45
|
||||||
|
46
|
||||||
|
47
|
||||||
|
48
|
||||||
|
49
|
||||||
|
50
|
||||||
|
51
|
||||||
|
52
|
||||||
|
53
|
||||||
|
54
|
||||||
|
55
|
||||||
|
56
|
||||||
|
57
|
||||||
|
58
|
||||||
|
59
|
||||||
|
60
|
||||||
|
61
|
||||||
|
62
|
||||||
|
63
|
||||||
|
64
|
||||||
|
65
|
||||||
|
66
|
||||||
|
67
|
||||||
|
68</td><td class="line-coverage"><span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-yes">1</span>
|
||||||
|
<span class="cline-any cline-yes">7</span>
|
||||||
|
<span class="cline-any cline-yes">1</span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-yes">6</span>
|
||||||
|
<span class="cline-any cline-yes">6</span>
|
||||||
|
<span class="cline-any cline-yes">6</span>
|
||||||
|
<span class="cline-any cline-yes">6</span>
|
||||||
|
<span class="cline-any cline-yes">6</span>
|
||||||
|
<span class="cline-any cline-yes">6</span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-yes">1</span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-yes">1</span>
|
||||||
|
<span class="cline-any cline-yes">3</span>
|
||||||
|
<span class="cline-any cline-yes">13</span>
|
||||||
|
<span class="cline-any cline-yes">13</span>
|
||||||
|
<span class="cline-any cline-yes">13</span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-yes">1</span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-yes">19</span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-yes">1</span>
|
||||||
|
<span class="cline-any cline-yes">45</span>
|
||||||
|
<span class="cline-any cline-yes">6</span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-yes">39</span>
|
||||||
|
<span class="cline-any cline-yes">13</span>
|
||||||
|
<span class="cline-any cline-yes">13</span>
|
||||||
|
<span class="cline-any cline-yes">13</span>
|
||||||
|
<span class="cline-any cline-yes">13</span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-yes">39</span>
|
||||||
|
<span class="cline-any cline-yes">18</span>
|
||||||
|
<span class="cline-any cline-yes">6</span>
|
||||||
|
<span class="cline-any cline-yes">6</span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-yes">1</span>
|
||||||
|
<span class="cline-any cline-yes">6</span>
|
||||||
|
<span class="cline-any cline-yes">6</span>
|
||||||
|
<span class="cline-any cline-yes">6</span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-yes">1</span>
|
||||||
|
<span class="cline-any cline-yes">13</span>
|
||||||
|
<span class="cline-any cline-yes">13</span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-neutral"> </span>
|
||||||
|
<span class="cline-any cline-yes">1</span>
|
||||||
|
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">'use strict';
|
||||||
|
|
||||||
|
function Queue(options) {
|
||||||
|
if (!(this instanceof Queue)) {
|
||||||
|
return new Queue(options);
|
||||||
|
}
|
||||||
|
|
||||||
|
options = options || {};
|
||||||
|
this.concurrency = options.concurrency || Infinity;
|
||||||
|
this.pending = 0;
|
||||||
|
this.jobs = [];
|
||||||
|
this.cbs = [];
|
||||||
|
this._done = done.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
var arrayAddMethods = [
|
||||||
|
'push',
|
||||||
|
'unshift',
|
||||||
|
'splice'
|
||||||
|
];
|
||||||
|
|
||||||
|
arrayAddMethods.forEach(function(method) {
|
||||||
|
Queue.prototype[method] = function() {
|
||||||
|
var methodResult = Array.prototype[method].apply(this.jobs, arguments);
|
||||||
|
this._run();
|
||||||
|
return methodResult;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
Object.defineProperty(Queue.prototype, 'length', {
|
||||||
|
get: function() {
|
||||||
|
return this.pending + this.jobs.length;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Queue.prototype._run = function() {
|
||||||
|
if (this.pending === this.concurrency) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.jobs.length) {
|
||||||
|
var job = this.jobs.shift();
|
||||||
|
this.pending++;
|
||||||
|
job(this._done);
|
||||||
|
this._run();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.pending === 0) {
|
||||||
|
while (this.cbs.length !== 0) {
|
||||||
|
var cb = this.cbs.pop();
|
||||||
|
process.nextTick(cb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Queue.prototype.onDone = function(cb) {
|
||||||
|
<span class="missing-if-branch" title="else path not taken" >E</span>if (typeof cb === 'function') {
|
||||||
|
this.cbs.push(cb);
|
||||||
|
this._run();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function done() {
|
||||||
|
this.pending--;
|
||||||
|
this._run();
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Queue;
|
||||||
|
</pre></td></tr>
|
||||||
|
</table></pre>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="footer">
|
||||||
|
<div class="meta">Generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Mon Sep 11 2017 11:14:14 GMT-0500 (CDT)</div>
|
||||||
|
</div>
|
||||||
|
<script src="../prettify.js"></script>
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
if (typeof prettyPrint === 'function') {
|
||||||
|
prettyPrint();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<script src="../sorter.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
182
express-server/node_modules/async-limiter/coverage/lcov-report/base.css
generated
vendored
Normal file
182
express-server/node_modules/async-limiter/coverage/lcov-report/base.css
generated
vendored
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
body, html {
|
||||||
|
margin:0; padding: 0;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
font-family: Helvetica Neue, Helvetica,Arial;
|
||||||
|
font-size: 10pt;
|
||||||
|
}
|
||||||
|
div.header, div.footer {
|
||||||
|
background: #eee;
|
||||||
|
padding: 1em;
|
||||||
|
}
|
||||||
|
div.header {
|
||||||
|
z-index: 100;
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
border-bottom: 1px solid #666;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
div.footer {
|
||||||
|
border-top: 1px solid #666;
|
||||||
|
}
|
||||||
|
div.body {
|
||||||
|
margin-top: 10em;
|
||||||
|
}
|
||||||
|
div.meta {
|
||||||
|
font-size: 90%;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
h1, h2, h3 {
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
font-size: 12pt;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
font-size: 10pt;
|
||||||
|
}
|
||||||
|
pre {
|
||||||
|
font-family: Consolas, Menlo, Monaco, monospace;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
line-height: 1.3;
|
||||||
|
font-size: 14px;
|
||||||
|
-moz-tab-size: 2;
|
||||||
|
-o-tab-size: 2;
|
||||||
|
tab-size: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.path { font-size: 110%; }
|
||||||
|
div.path a:link, div.path a:visited { color: #000; }
|
||||||
|
table.coverage { border-collapse: collapse; margin:0; padding: 0 }
|
||||||
|
|
||||||
|
table.coverage td {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
color: #111;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
table.coverage td.line-count {
|
||||||
|
width: 50px;
|
||||||
|
text-align: right;
|
||||||
|
padding-right: 5px;
|
||||||
|
}
|
||||||
|
table.coverage td.line-coverage {
|
||||||
|
color: #777 !important;
|
||||||
|
text-align: right;
|
||||||
|
border-left: 1px solid #666;
|
||||||
|
border-right: 1px solid #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.coverage td.text {
|
||||||
|
}
|
||||||
|
|
||||||
|
table.coverage td span.cline-any {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 0 5px;
|
||||||
|
width: 40px;
|
||||||
|
}
|
||||||
|
table.coverage td span.cline-neutral {
|
||||||
|
background: #eee;
|
||||||
|
}
|
||||||
|
table.coverage td span.cline-yes {
|
||||||
|
background: #b5d592;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
table.coverage td span.cline-no {
|
||||||
|
background: #fc8c84;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cstat-yes { color: #111; }
|
||||||
|
.cstat-no { background: #fc8c84; color: #111; }
|
||||||
|
.fstat-no { background: #ffc520; color: #111 !important; }
|
||||||
|
.cbranch-no { background: yellow !important; color: #111; }
|
||||||
|
|
||||||
|
.cstat-skip { background: #ddd; color: #111; }
|
||||||
|
.fstat-skip { background: #ddd; color: #111 !important; }
|
||||||
|
.cbranch-skip { background: #ddd !important; color: #111; }
|
||||||
|
|
||||||
|
.missing-if-branch {
|
||||||
|
display: inline-block;
|
||||||
|
margin-right: 10px;
|
||||||
|
position: relative;
|
||||||
|
padding: 0 4px;
|
||||||
|
background: black;
|
||||||
|
color: yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
.skip-if-branch {
|
||||||
|
display: none;
|
||||||
|
margin-right: 10px;
|
||||||
|
position: relative;
|
||||||
|
padding: 0 4px;
|
||||||
|
background: #ccc;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.missing-if-branch .typ, .skip-if-branch .typ {
|
||||||
|
color: inherit !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entity, .metric { font-weight: bold; }
|
||||||
|
.metric { display: inline-block; border: 1px solid #333; padding: 0.3em; background: white; }
|
||||||
|
.metric small { font-size: 80%; font-weight: normal; color: #666; }
|
||||||
|
|
||||||
|
div.coverage-summary table { border-collapse: collapse; margin: 3em; font-size: 110%; }
|
||||||
|
div.coverage-summary td, div.coverage-summary table th { margin: 0; padding: 0.25em 1em; border-top: 1px solid #666; border-bottom: 1px solid #666; }
|
||||||
|
div.coverage-summary th { text-align: left; border: 1px solid #666; background: #eee; font-weight: normal; }
|
||||||
|
div.coverage-summary th.file { border-right: none !important; }
|
||||||
|
div.coverage-summary th.pic { border-left: none !important; text-align: right; }
|
||||||
|
div.coverage-summary th.pct { border-right: none !important; }
|
||||||
|
div.coverage-summary th.abs { border-left: none !important; text-align: right; }
|
||||||
|
div.coverage-summary td.pct { text-align: right; border-left: 1px solid #666; }
|
||||||
|
div.coverage-summary td.abs { text-align: right; font-size: 90%; color: #444; border-right: 1px solid #666; }
|
||||||
|
div.coverage-summary td.file { border-left: 1px solid #666; white-space: nowrap; }
|
||||||
|
div.coverage-summary td.pic { min-width: 120px !important; }
|
||||||
|
div.coverage-summary a:link { text-decoration: none; color: #000; }
|
||||||
|
div.coverage-summary a:visited { text-decoration: none; color: #777; }
|
||||||
|
div.coverage-summary a:hover { text-decoration: underline; }
|
||||||
|
div.coverage-summary tfoot td { border-top: 1px solid #666; }
|
||||||
|
|
||||||
|
div.coverage-summary .sorter {
|
||||||
|
height: 10px;
|
||||||
|
width: 7px;
|
||||||
|
display: inline-block;
|
||||||
|
margin-left: 0.5em;
|
||||||
|
background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
|
||||||
|
}
|
||||||
|
div.coverage-summary .sorted .sorter {
|
||||||
|
background-position: 0 -20px;
|
||||||
|
}
|
||||||
|
div.coverage-summary .sorted-desc .sorter {
|
||||||
|
background-position: 0 -10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.high { background: #b5d592 !important; }
|
||||||
|
.medium { background: #ffe87c !important; }
|
||||||
|
.low { background: #fc8c84 !important; }
|
||||||
|
|
||||||
|
span.cover-fill, span.cover-empty {
|
||||||
|
display:inline-block;
|
||||||
|
border:1px solid #444;
|
||||||
|
background: white;
|
||||||
|
height: 12px;
|
||||||
|
}
|
||||||
|
span.cover-fill {
|
||||||
|
background: #ccc;
|
||||||
|
border-right: 1px solid #444;
|
||||||
|
}
|
||||||
|
span.cover-empty {
|
||||||
|
background: white;
|
||||||
|
border-left: none;
|
||||||
|
}
|
||||||
|
span.cover-full {
|
||||||
|
border-right: none !important;
|
||||||
|
}
|
||||||
|
pre.prettyprint {
|
||||||
|
border: none !important;
|
||||||
|
padding: 0 !important;
|
||||||
|
margin: 0 !important;
|
||||||
|
}
|
||||||
|
.com { color: #999 !important; }
|
||||||
|
.ignore-none { color: #999; font-weight: normal; }
|
73
express-server/node_modules/async-limiter/coverage/lcov-report/index.html
generated
vendored
Normal file
73
express-server/node_modules/async-limiter/coverage/lcov-report/index.html
generated
vendored
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>Code coverage report for All files</title>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<link rel="stylesheet" href="prettify.css">
|
||||||
|
<link rel="stylesheet" href="base.css">
|
||||||
|
<style type='text/css'>
|
||||||
|
div.coverage-summary .sorter {
|
||||||
|
background-image: url(sort-arrow-sprite.png);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="header high">
|
||||||
|
<h1>Code coverage report for <span class="entity">All files</span></h1>
|
||||||
|
<h2>
|
||||||
|
Statements: <span class="metric">100% <small>(37 / 37)</small></span>
|
||||||
|
Branches: <span class="metric">92.86% <small>(13 / 14)</small></span>
|
||||||
|
Functions: <span class="metric">100% <small>(7 / 7)</small></span>
|
||||||
|
Lines: <span class="metric">100% <small>(37 / 37)</small></span>
|
||||||
|
Ignored: <span class="metric"><span class="ignore-none">none</span></span>
|
||||||
|
</h2>
|
||||||
|
<div class="path"></div>
|
||||||
|
</div>
|
||||||
|
<div class="body">
|
||||||
|
<div class="coverage-summary">
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
|
||||||
|
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
|
||||||
|
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
|
||||||
|
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
|
||||||
|
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
|
||||||
|
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
|
||||||
|
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
|
||||||
|
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
|
||||||
|
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
|
||||||
|
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody><tr>
|
||||||
|
<td class="file high" data-value="async-throttle/"><a href="async-throttle/index.html">async-throttle/</a></td>
|
||||||
|
<td data-value="100" class="pic high"><span class="cover-fill cover-full" style="width: 100px;"></span><span class="cover-empty" style="width:0px;"></span></td>
|
||||||
|
<td data-value="100" class="pct high">100%</td>
|
||||||
|
<td data-value="37" class="abs high">(37 / 37)</td>
|
||||||
|
<td data-value="92.86" class="pct high">92.86%</td>
|
||||||
|
<td data-value="14" class="abs high">(13 / 14)</td>
|
||||||
|
<td data-value="100" class="pct high">100%</td>
|
||||||
|
<td data-value="7" class="abs high">(7 / 7)</td>
|
||||||
|
<td data-value="100" class="pct high">100%</td>
|
||||||
|
<td data-value="37" class="abs high">(37 / 37)</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="footer">
|
||||||
|
<div class="meta">Generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Mon Sep 11 2017 11:14:14 GMT-0500 (CDT)</div>
|
||||||
|
</div>
|
||||||
|
<script src="prettify.js"></script>
|
||||||
|
<script>
|
||||||
|
window.onload = function () {
|
||||||
|
if (typeof prettyPrint === 'function') {
|
||||||
|
prettyPrint();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<script src="sorter.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
1
express-server/node_modules/async-limiter/coverage/lcov-report/prettify.css
generated
vendored
Normal file
1
express-server/node_modules/async-limiter/coverage/lcov-report/prettify.css
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
|
1
express-server/node_modules/async-limiter/coverage/lcov-report/prettify.js
generated
vendored
Normal file
1
express-server/node_modules/async-limiter/coverage/lcov-report/prettify.js
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
express-server/node_modules/async-limiter/coverage/lcov-report/sort-arrow-sprite.png
generated
vendored
Normal file
BIN
express-server/node_modules/async-limiter/coverage/lcov-report/sort-arrow-sprite.png
generated
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 209 B |
156
express-server/node_modules/async-limiter/coverage/lcov-report/sorter.js
generated
vendored
Normal file
156
express-server/node_modules/async-limiter/coverage/lcov-report/sorter.js
generated
vendored
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
var addSorting = (function () {
|
||||||
|
"use strict";
|
||||||
|
var cols,
|
||||||
|
currentSort = {
|
||||||
|
index: 0,
|
||||||
|
desc: false
|
||||||
|
};
|
||||||
|
|
||||||
|
// returns the summary table element
|
||||||
|
function getTable() { return document.querySelector('.coverage-summary table'); }
|
||||||
|
// returns the thead element of the summary table
|
||||||
|
function getTableHeader() { return getTable().querySelector('thead tr'); }
|
||||||
|
// returns the tbody element of the summary table
|
||||||
|
function getTableBody() { return getTable().querySelector('tbody'); }
|
||||||
|
// returns the th element for nth column
|
||||||
|
function getNthColumn(n) { return getTableHeader().querySelectorAll('th')[n]; }
|
||||||
|
|
||||||
|
// loads all columns
|
||||||
|
function loadColumns() {
|
||||||
|
var colNodes = getTableHeader().querySelectorAll('th'),
|
||||||
|
colNode,
|
||||||
|
cols = [],
|
||||||
|
col,
|
||||||
|
i;
|
||||||
|
|
||||||
|
for (i = 0; i < colNodes.length; i += 1) {
|
||||||
|
colNode = colNodes[i];
|
||||||
|
col = {
|
||||||
|
key: colNode.getAttribute('data-col'),
|
||||||
|
sortable: !colNode.getAttribute('data-nosort'),
|
||||||
|
type: colNode.getAttribute('data-type') || 'string'
|
||||||
|
};
|
||||||
|
cols.push(col);
|
||||||
|
if (col.sortable) {
|
||||||
|
col.defaultDescSort = col.type === 'number';
|
||||||
|
colNode.innerHTML = colNode.innerHTML + '<span class="sorter"></span>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cols;
|
||||||
|
}
|
||||||
|
// attaches a data attribute to every tr element with an object
|
||||||
|
// of data values keyed by column name
|
||||||
|
function loadRowData(tableRow) {
|
||||||
|
var tableCols = tableRow.querySelectorAll('td'),
|
||||||
|
colNode,
|
||||||
|
col,
|
||||||
|
data = {},
|
||||||
|
i,
|
||||||
|
val;
|
||||||
|
for (i = 0; i < tableCols.length; i += 1) {
|
||||||
|
colNode = tableCols[i];
|
||||||
|
col = cols[i];
|
||||||
|
val = colNode.getAttribute('data-value');
|
||||||
|
if (col.type === 'number') {
|
||||||
|
val = Number(val);
|
||||||
|
}
|
||||||
|
data[col.key] = val;
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
// loads all row data
|
||||||
|
function loadData() {
|
||||||
|
var rows = getTableBody().querySelectorAll('tr'),
|
||||||
|
i;
|
||||||
|
|
||||||
|
for (i = 0; i < rows.length; i += 1) {
|
||||||
|
rows[i].data = loadRowData(rows[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// sorts the table using the data for the ith column
|
||||||
|
function sortByIndex(index, desc) {
|
||||||
|
var key = cols[index].key,
|
||||||
|
sorter = function (a, b) {
|
||||||
|
a = a.data[key];
|
||||||
|
b = b.data[key];
|
||||||
|
return a < b ? -1 : a > b ? 1 : 0;
|
||||||
|
},
|
||||||
|
finalSorter = sorter,
|
||||||
|
tableBody = document.querySelector('.coverage-summary tbody'),
|
||||||
|
rowNodes = tableBody.querySelectorAll('tr'),
|
||||||
|
rows = [],
|
||||||
|
i;
|
||||||
|
|
||||||
|
if (desc) {
|
||||||
|
finalSorter = function (a, b) {
|
||||||
|
return -1 * sorter(a, b);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < rowNodes.length; i += 1) {
|
||||||
|
rows.push(rowNodes[i]);
|
||||||
|
tableBody.removeChild(rowNodes[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.sort(finalSorter);
|
||||||
|
|
||||||
|
for (i = 0; i < rows.length; i += 1) {
|
||||||
|
tableBody.appendChild(rows[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// removes sort indicators for current column being sorted
|
||||||
|
function removeSortIndicators() {
|
||||||
|
var col = getNthColumn(currentSort.index),
|
||||||
|
cls = col.className;
|
||||||
|
|
||||||
|
cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
|
||||||
|
col.className = cls;
|
||||||
|
}
|
||||||
|
// adds sort indicators for current column being sorted
|
||||||
|
function addSortIndicators() {
|
||||||
|
getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted';
|
||||||
|
}
|
||||||
|
// adds event listeners for all sorter widgets
|
||||||
|
function enableUI() {
|
||||||
|
var i,
|
||||||
|
el,
|
||||||
|
ithSorter = function ithSorter(i) {
|
||||||
|
var col = cols[i];
|
||||||
|
|
||||||
|
return function () {
|
||||||
|
var desc = col.defaultDescSort;
|
||||||
|
|
||||||
|
if (currentSort.index === i) {
|
||||||
|
desc = !currentSort.desc;
|
||||||
|
}
|
||||||
|
sortByIndex(i, desc);
|
||||||
|
removeSortIndicators();
|
||||||
|
currentSort.index = i;
|
||||||
|
currentSort.desc = desc;
|
||||||
|
addSortIndicators();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
for (i =0 ; i < cols.length; i += 1) {
|
||||||
|
if (cols[i].sortable) {
|
||||||
|
el = getNthColumn(i).querySelector('.sorter');
|
||||||
|
if (el.addEventListener) {
|
||||||
|
el.addEventListener('click', ithSorter(i));
|
||||||
|
} else {
|
||||||
|
el.attachEvent('onclick', ithSorter(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// adds sorting functionality to the UI
|
||||||
|
return function () {
|
||||||
|
if (!getTable()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cols = loadColumns();
|
||||||
|
loadData(cols);
|
||||||
|
addSortIndicators();
|
||||||
|
enableUI();
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
|
||||||
|
window.addEventListener('load', addSorting);
|
74
express-server/node_modules/async-limiter/coverage/lcov.info
generated
vendored
Normal file
74
express-server/node_modules/async-limiter/coverage/lcov.info
generated
vendored
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
TN:
|
||||||
|
SF:/Users/samuelreed/git/forks/async-throttle/index.js
|
||||||
|
FN:3,Queue
|
||||||
|
FN:22,(anonymous_2)
|
||||||
|
FN:23,(anonymous_3)
|
||||||
|
FN:31,(anonymous_4)
|
||||||
|
FN:36,(anonymous_5)
|
||||||
|
FN:55,(anonymous_6)
|
||||||
|
FN:62,done
|
||||||
|
FNF:7
|
||||||
|
FNH:7
|
||||||
|
FNDA:7,Queue
|
||||||
|
FNDA:3,(anonymous_2)
|
||||||
|
FNDA:13,(anonymous_3)
|
||||||
|
FNDA:19,(anonymous_4)
|
||||||
|
FNDA:45,(anonymous_5)
|
||||||
|
FNDA:6,(anonymous_6)
|
||||||
|
FNDA:13,done
|
||||||
|
DA:3,1
|
||||||
|
DA:4,7
|
||||||
|
DA:5,1
|
||||||
|
DA:8,6
|
||||||
|
DA:9,6
|
||||||
|
DA:10,6
|
||||||
|
DA:11,6
|
||||||
|
DA:12,6
|
||||||
|
DA:13,6
|
||||||
|
DA:16,1
|
||||||
|
DA:22,1
|
||||||
|
DA:23,3
|
||||||
|
DA:24,13
|
||||||
|
DA:25,13
|
||||||
|
DA:26,13
|
||||||
|
DA:30,1
|
||||||
|
DA:32,19
|
||||||
|
DA:36,1
|
||||||
|
DA:37,45
|
||||||
|
DA:38,6
|
||||||
|
DA:40,39
|
||||||
|
DA:41,13
|
||||||
|
DA:42,13
|
||||||
|
DA:43,13
|
||||||
|
DA:44,13
|
||||||
|
DA:47,39
|
||||||
|
DA:48,18
|
||||||
|
DA:49,6
|
||||||
|
DA:50,6
|
||||||
|
DA:55,1
|
||||||
|
DA:56,6
|
||||||
|
DA:57,6
|
||||||
|
DA:58,6
|
||||||
|
DA:62,1
|
||||||
|
DA:63,13
|
||||||
|
DA:64,13
|
||||||
|
DA:67,1
|
||||||
|
LF:37
|
||||||
|
LH:37
|
||||||
|
BRDA:4,1,0,1
|
||||||
|
BRDA:4,1,1,6
|
||||||
|
BRDA:8,2,0,6
|
||||||
|
BRDA:8,2,1,5
|
||||||
|
BRDA:9,3,0,6
|
||||||
|
BRDA:9,3,1,5
|
||||||
|
BRDA:37,4,0,6
|
||||||
|
BRDA:37,4,1,39
|
||||||
|
BRDA:40,5,0,13
|
||||||
|
BRDA:40,5,1,26
|
||||||
|
BRDA:47,6,0,18
|
||||||
|
BRDA:47,6,1,21
|
||||||
|
BRDA:56,7,0,6
|
||||||
|
BRDA:56,7,1,0
|
||||||
|
BRF:14
|
||||||
|
BRH:13
|
||||||
|
end_of_record
|
67
express-server/node_modules/async-limiter/index.js
generated
vendored
Normal file
67
express-server/node_modules/async-limiter/index.js
generated
vendored
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
function Queue(options) {
|
||||||
|
if (!(this instanceof Queue)) {
|
||||||
|
return new Queue(options);
|
||||||
|
}
|
||||||
|
|
||||||
|
options = options || {};
|
||||||
|
this.concurrency = options.concurrency || Infinity;
|
||||||
|
this.pending = 0;
|
||||||
|
this.jobs = [];
|
||||||
|
this.cbs = [];
|
||||||
|
this._done = done.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
var arrayAddMethods = [
|
||||||
|
'push',
|
||||||
|
'unshift',
|
||||||
|
'splice'
|
||||||
|
];
|
||||||
|
|
||||||
|
arrayAddMethods.forEach(function(method) {
|
||||||
|
Queue.prototype[method] = function() {
|
||||||
|
var methodResult = Array.prototype[method].apply(this.jobs, arguments);
|
||||||
|
this._run();
|
||||||
|
return methodResult;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
Object.defineProperty(Queue.prototype, 'length', {
|
||||||
|
get: function() {
|
||||||
|
return this.pending + this.jobs.length;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Queue.prototype._run = function() {
|
||||||
|
if (this.pending === this.concurrency) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.jobs.length) {
|
||||||
|
var job = this.jobs.shift();
|
||||||
|
this.pending++;
|
||||||
|
job(this._done);
|
||||||
|
this._run();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.pending === 0) {
|
||||||
|
while (this.cbs.length !== 0) {
|
||||||
|
var cb = this.cbs.pop();
|
||||||
|
process.nextTick(cb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Queue.prototype.onDone = function(cb) {
|
||||||
|
if (typeof cb === 'function') {
|
||||||
|
this.cbs.push(cb);
|
||||||
|
this._run();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function done() {
|
||||||
|
this.pending--;
|
||||||
|
this._run();
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Queue;
|
97
express-server/node_modules/async-limiter/package.json
generated
vendored
Normal file
97
express-server/node_modules/async-limiter/package.json
generated
vendored
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
{
|
||||||
|
"_args": [
|
||||||
|
[
|
||||||
|
"async-limiter@~1.0.0",
|
||||||
|
"/nodeapps/https-test/greenlock-express.js/node_modules/ws"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"_from": "async-limiter@>=1.0.0 <1.1.0",
|
||||||
|
"_id": "async-limiter@1.0.0",
|
||||||
|
"_inCache": true,
|
||||||
|
"_installable": true,
|
||||||
|
"_location": "/async-limiter",
|
||||||
|
"_nodeVersion": "8.4.0",
|
||||||
|
"_npmOperationalInternal": {
|
||||||
|
"host": "s3://npm-registry-packages",
|
||||||
|
"tmp": "tmp/async-limiter-1.0.0.tgz_1505149068503_0.15003100014291704"
|
||||||
|
},
|
||||||
|
"_npmUser": {
|
||||||
|
"email": "samuel.trace.reed@gmail.com",
|
||||||
|
"name": "strml"
|
||||||
|
},
|
||||||
|
"_npmVersion": "5.4.1",
|
||||||
|
"_phantomChildren": {},
|
||||||
|
"_requested": {
|
||||||
|
"name": "async-limiter",
|
||||||
|
"raw": "async-limiter@~1.0.0",
|
||||||
|
"rawSpec": "~1.0.0",
|
||||||
|
"scope": null,
|
||||||
|
"spec": ">=1.0.0 <1.1.0",
|
||||||
|
"type": "range"
|
||||||
|
},
|
||||||
|
"_requiredBy": [
|
||||||
|
"/ws"
|
||||||
|
],
|
||||||
|
"_resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
|
||||||
|
"_shasum": "78faed8c3d074ab81f22b4e985d79e8738f720f8",
|
||||||
|
"_shrinkwrap": null,
|
||||||
|
"_spec": "async-limiter@~1.0.0",
|
||||||
|
"_where": "/nodeapps/https-test/greenlock-express.js/node_modules/ws",
|
||||||
|
"author": {
|
||||||
|
"name": "Samuel Reed"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/strml/async-limiter/issues"
|
||||||
|
},
|
||||||
|
"dependencies": {},
|
||||||
|
"description": "asynchronous function queue with adjustable concurrency",
|
||||||
|
"devDependencies": {
|
||||||
|
"coveralls": "^2.11.2",
|
||||||
|
"eslint": "^4.6.1",
|
||||||
|
"eslint-plugin-mocha": "^4.11.0",
|
||||||
|
"intelli-espower-loader": "^1.0.1",
|
||||||
|
"istanbul": "^0.3.2",
|
||||||
|
"mocha": "^3.5.2",
|
||||||
|
"power-assert": "^1.4.4"
|
||||||
|
},
|
||||||
|
"directories": {},
|
||||||
|
"dist": {
|
||||||
|
"integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
|
||||||
|
"shasum": "78faed8c3d074ab81f22b4e985d79e8738f720f8",
|
||||||
|
"tarball": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz"
|
||||||
|
},
|
||||||
|
"gitHead": "02c8b498279dc7cc1ecc1c4f6fc9ca320c0ce39b",
|
||||||
|
"homepage": "https://github.com/strml/async-limiter#readme",
|
||||||
|
"keywords": [
|
||||||
|
"async",
|
||||||
|
"asynchronous",
|
||||||
|
"concurrency",
|
||||||
|
"concurrent",
|
||||||
|
"job",
|
||||||
|
"limiter",
|
||||||
|
"task",
|
||||||
|
"throttle"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"maintainers": [
|
||||||
|
{
|
||||||
|
"name": "strml",
|
||||||
|
"email": "samuel.trace.reed@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "async-limiter",
|
||||||
|
"optionalDependencies": {},
|
||||||
|
"readme": "ERROR: No README data found!",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/strml/async-limiter.git"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"coverage": "istanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly -- -R spec && cat ./coverage/lcov.info | coveralls",
|
||||||
|
"example": "node example",
|
||||||
|
"lint": "eslint .",
|
||||||
|
"test": "mocha --R intelli-espower-loader test/",
|
||||||
|
"travis": "npm run lint && npm run coverage"
|
||||||
|
},
|
||||||
|
"version": "1.0.0"
|
||||||
|
}
|
132
express-server/node_modules/async-limiter/readme.md
generated
vendored
Normal file
132
express-server/node_modules/async-limiter/readme.md
generated
vendored
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
# Async-Limiter
|
||||||
|
|
||||||
|
A module for limiting concurrent asynchronous actions in flight. Forked from [queue](https://github.com/jessetane/queue).
|
||||||
|
|
||||||
|
[](http://www.npmjs.org/async-limiter)
|
||||||
|
[](https://travis-ci.org/STRML/async-limiter)
|
||||||
|
[](https://coveralls.io/r/STRML/async-limiter)
|
||||||
|
|
||||||
|
This module exports a class `Limiter` that implements some of the `Array` API.
|
||||||
|
Pass async functions (ones that accept a callback or return a promise) to an instance's additive array methods.
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
Certain functions, like `zlib`, have [undesirable behavior](https://github.com/nodejs/node/issues/8871#issuecomment-250915913) when
|
||||||
|
run at infinite concurrency.
|
||||||
|
|
||||||
|
In this case, it is actually faster, and takes far less memory, to limit concurrency.
|
||||||
|
|
||||||
|
This module should do the absolute minimum work necessary to queue up functions. PRs are welcome that would
|
||||||
|
make this module faster or lighter, but new functionality is not desired.
|
||||||
|
|
||||||
|
Style should confirm to nodejs/node style.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
``` javascript
|
||||||
|
var Limiter = require('async-limiter')
|
||||||
|
|
||||||
|
var t = new Limiter({concurrency: 2});
|
||||||
|
var results = []
|
||||||
|
|
||||||
|
// add jobs using the familiar Array API
|
||||||
|
t.push(function (cb) {
|
||||||
|
results.push('two')
|
||||||
|
cb()
|
||||||
|
})
|
||||||
|
|
||||||
|
t.push(
|
||||||
|
function (cb) {
|
||||||
|
results.push('four')
|
||||||
|
cb()
|
||||||
|
},
|
||||||
|
function (cb) {
|
||||||
|
results.push('five')
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
t.unshift(function (cb) {
|
||||||
|
results.push('one')
|
||||||
|
cb()
|
||||||
|
})
|
||||||
|
|
||||||
|
t.splice(2, 0, function (cb) {
|
||||||
|
results.push('three')
|
||||||
|
cb()
|
||||||
|
})
|
||||||
|
|
||||||
|
// Jobs run automatically. If you want a callback when all are done,
|
||||||
|
// call 'onDone()'.
|
||||||
|
t.onDone(function () {
|
||||||
|
console.log('all done:', results)
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
## Zlib Example
|
||||||
|
|
||||||
|
```js
|
||||||
|
const zlib = require('zlib');
|
||||||
|
const Limiter = require('async-limiter');
|
||||||
|
|
||||||
|
const message = {some: "data"};
|
||||||
|
const payload = new Buffer(JSON.stringify(message));
|
||||||
|
|
||||||
|
// Try with different concurrency values to see how this actually
|
||||||
|
// slows significantly with higher concurrency!
|
||||||
|
//
|
||||||
|
// 5: 1398.607ms
|
||||||
|
// 10: 1375.668ms
|
||||||
|
// Infinity: 4423.300ms
|
||||||
|
//
|
||||||
|
const t = new Limiter({concurrency: 5});
|
||||||
|
function deflate(payload, cb) {
|
||||||
|
t.push(function(done) {
|
||||||
|
zlib.deflate(payload, function(err, buffer) {
|
||||||
|
done();
|
||||||
|
cb(err, buffer);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.time('deflate');
|
||||||
|
for(let i = 0; i < 30000; ++i) {
|
||||||
|
deflate(payload, function (err, buffer) {});
|
||||||
|
}
|
||||||
|
q.onDone(function() {
|
||||||
|
console.timeEnd('deflate');
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
`npm install async-limiter`
|
||||||
|
|
||||||
|
## Test
|
||||||
|
|
||||||
|
`npm test`
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
### `var t = new Limiter([opts])`
|
||||||
|
Constructor. `opts` may contain inital values for:
|
||||||
|
* `q.concurrency`
|
||||||
|
|
||||||
|
## Instance methods
|
||||||
|
|
||||||
|
### `q.onDone(fn)`
|
||||||
|
`fn` will be called once and only once, when the queue is empty.
|
||||||
|
|
||||||
|
## Instance methods mixed in from `Array`
|
||||||
|
Mozilla has docs on how these methods work [here](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array).
|
||||||
|
### `q.push(element1, ..., elementN)`
|
||||||
|
### `q.unshift(element1, ..., elementN)`
|
||||||
|
### `q.splice(index , howMany[, element1[, ...[, elementN]]])`
|
||||||
|
|
||||||
|
## Properties
|
||||||
|
### `q.concurrency`
|
||||||
|
Max number of jobs the queue should process concurrently, defaults to `Infinity`.
|
||||||
|
|
||||||
|
### `q.length`
|
||||||
|
Jobs pending + jobs to process (readonly).
|
||||||
|
|
4
express-server/node_modules/batch/.npmignore
generated
vendored
Normal file
4
express-server/node_modules/batch/.npmignore
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
support
|
||||||
|
test
|
||||||
|
examples
|
||||||
|
*.sock
|
93
express-server/node_modules/batch/History.md
generated
vendored
Normal file
93
express-server/node_modules/batch/History.md
generated
vendored
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
0.6.1 / 2017-05-16
|
||||||
|
==================
|
||||||
|
|
||||||
|
* fix `process.nextTick` detection in Node.js
|
||||||
|
|
||||||
|
0.6.0 / 2017-03-25
|
||||||
|
==================
|
||||||
|
|
||||||
|
* always invoke end callback asynchronously
|
||||||
|
* fix compatibility with component v1
|
||||||
|
* fix license field
|
||||||
|
|
||||||
|
0.5.3 / 2015-10-01
|
||||||
|
==================
|
||||||
|
|
||||||
|
* fix for browserify
|
||||||
|
|
||||||
|
0.5.2 / 2014-12-22
|
||||||
|
==================
|
||||||
|
|
||||||
|
* add brower field
|
||||||
|
* add license to package.json
|
||||||
|
|
||||||
|
0.5.1 / 2014-06-19
|
||||||
|
==================
|
||||||
|
|
||||||
|
* add repository field to readme (exciting)
|
||||||
|
|
||||||
|
0.5.0 / 2013-07-29
|
||||||
|
==================
|
||||||
|
|
||||||
|
* add `.throws(true)` to opt-in to responding with an array of error objects
|
||||||
|
* make `new` optional
|
||||||
|
|
||||||
|
0.4.0 / 2013-06-05
|
||||||
|
==================
|
||||||
|
|
||||||
|
* add catching of immediate callback errors
|
||||||
|
|
||||||
|
0.3.2 / 2013-03-15
|
||||||
|
==================
|
||||||
|
|
||||||
|
* remove Emitter call in constructor
|
||||||
|
|
||||||
|
0.3.1 / 2013-03-13
|
||||||
|
==================
|
||||||
|
|
||||||
|
* add Emitter() mixin for client. Closes #8
|
||||||
|
|
||||||
|
0.3.0 / 2013-03-13
|
||||||
|
==================
|
||||||
|
|
||||||
|
* add component.json
|
||||||
|
* add result example
|
||||||
|
* add .concurrency support
|
||||||
|
* add concurrency example
|
||||||
|
* add parallel example
|
||||||
|
|
||||||
|
0.2.1 / 2012-11-08
|
||||||
|
==================
|
||||||
|
|
||||||
|
* add .start, .end, and .duration properties
|
||||||
|
* change dependencies to devDependencies
|
||||||
|
|
||||||
|
0.2.0 / 2012-10-04
|
||||||
|
==================
|
||||||
|
|
||||||
|
* add progress events. Closes #5 (__BREAKING CHANGE__)
|
||||||
|
|
||||||
|
0.1.1 / 2012-07-03
|
||||||
|
==================
|
||||||
|
|
||||||
|
* change "complete" event to "progress"
|
||||||
|
|
||||||
|
0.1.0 / 2012-07-03
|
||||||
|
==================
|
||||||
|
|
||||||
|
* add Emitter inheritance and emit "complete" [burcu]
|
||||||
|
|
||||||
|
0.0.3 / 2012-06-02
|
||||||
|
==================
|
||||||
|
|
||||||
|
* Callback results should be in the order of the queued functions.
|
||||||
|
|
||||||
|
0.0.2 / 2012-02-12
|
||||||
|
==================
|
||||||
|
|
||||||
|
* any node
|
||||||
|
|
||||||
|
0.0.1 / 2010-01-03
|
||||||
|
==================
|
||||||
|
|
||||||
|
* Initial release
|
22
express-server/node_modules/batch/LICENSE
generated
vendored
Normal file
22
express-server/node_modules/batch/LICENSE
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
(The MIT License)
|
||||||
|
|
||||||
|
Copyright (c) 2013 TJ Holowaychuk <tj@vision-media.ca>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
'Software'), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
6
express-server/node_modules/batch/Makefile
generated
vendored
Normal file
6
express-server/node_modules/batch/Makefile
generated
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
test:
|
||||||
|
@./node_modules/.bin/mocha \
|
||||||
|
--require should
|
||||||
|
|
||||||
|
.PHONY: test
|
53
express-server/node_modules/batch/Readme.md
generated
vendored
Normal file
53
express-server/node_modules/batch/Readme.md
generated
vendored
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
|
||||||
|
# batch
|
||||||
|
|
||||||
|
Simple async batch with concurrency control and progress reporting.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```
|
||||||
|
$ npm install batch
|
||||||
|
```
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
```js
|
||||||
|
var Batch = require('batch')
|
||||||
|
, batch = new Batch;
|
||||||
|
|
||||||
|
batch.concurrency(4);
|
||||||
|
|
||||||
|
ids.forEach(function(id){
|
||||||
|
batch.push(function(done){
|
||||||
|
User.get(id, done);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
batch.on('progress', function(e){
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
batch.end(function(err, users){
|
||||||
|
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Progress events
|
||||||
|
|
||||||
|
Contain the "job" index, response value, duration information, and completion data.
|
||||||
|
|
||||||
|
```
|
||||||
|
{ index: 1,
|
||||||
|
value: 'bar',
|
||||||
|
pending: 2,
|
||||||
|
total: 3,
|
||||||
|
complete: 2,
|
||||||
|
percent: 66,
|
||||||
|
start: Thu Oct 04 2012 12:25:53 GMT-0700 (PDT),
|
||||||
|
end: Thu Oct 04 2012 12:25:53 GMT-0700 (PDT),
|
||||||
|
duration: 0 }
|
||||||
|
```
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
[MIT](LICENSE)
|
14
express-server/node_modules/batch/component.json
generated
vendored
Normal file
14
express-server/node_modules/batch/component.json
generated
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "batch",
|
||||||
|
"repo": "visionmedia/batch",
|
||||||
|
"description": "Async task batching",
|
||||||
|
"version": "0.6.1",
|
||||||
|
"keywords": ["batch", "async", "utility", "concurrency", "concurrent"],
|
||||||
|
"dependencies": {
|
||||||
|
"component/emitter": "*"
|
||||||
|
},
|
||||||
|
"development": {},
|
||||||
|
"scripts": [
|
||||||
|
"index.js"
|
||||||
|
]
|
||||||
|
}
|
173
express-server/node_modules/batch/index.js
generated
vendored
Normal file
173
express-server/node_modules/batch/index.js
generated
vendored
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
*/
|
||||||
|
|
||||||
|
try {
|
||||||
|
var EventEmitter = require('events').EventEmitter;
|
||||||
|
if (!EventEmitter) throw new Error();
|
||||||
|
} catch (err) {
|
||||||
|
var Emitter = require('emitter');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defer.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var defer = typeof process !== 'undefined' && process && typeof process.nextTick === 'function'
|
||||||
|
? process.nextTick
|
||||||
|
: function(fn){ setTimeout(fn); };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Noop.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function noop(){}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expose `Batch`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = Batch;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new Batch.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function Batch() {
|
||||||
|
if (!(this instanceof Batch)) return new Batch;
|
||||||
|
this.fns = [];
|
||||||
|
this.concurrency(Infinity);
|
||||||
|
this.throws(true);
|
||||||
|
for (var i = 0, len = arguments.length; i < len; ++i) {
|
||||||
|
this.push(arguments[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inherit from `EventEmitter.prototype`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (EventEmitter) {
|
||||||
|
Batch.prototype.__proto__ = EventEmitter.prototype;
|
||||||
|
} else {
|
||||||
|
Emitter(Batch.prototype);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set concurrency to `n`.
|
||||||
|
*
|
||||||
|
* @param {Number} n
|
||||||
|
* @return {Batch}
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
Batch.prototype.concurrency = function(n){
|
||||||
|
this.n = n;
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Queue a function.
|
||||||
|
*
|
||||||
|
* @param {Function} fn
|
||||||
|
* @return {Batch}
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
Batch.prototype.push = function(fn){
|
||||||
|
this.fns.push(fn);
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set wether Batch will or will not throw up.
|
||||||
|
*
|
||||||
|
* @param {Boolean} throws
|
||||||
|
* @return {Batch}
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
Batch.prototype.throws = function(throws) {
|
||||||
|
this.e = !!throws;
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute all queued functions in parallel,
|
||||||
|
* executing `cb(err, results)`.
|
||||||
|
*
|
||||||
|
* @param {Function} cb
|
||||||
|
* @return {Batch}
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
Batch.prototype.end = function(cb){
|
||||||
|
var self = this
|
||||||
|
, total = this.fns.length
|
||||||
|
, pending = total
|
||||||
|
, results = []
|
||||||
|
, errors = []
|
||||||
|
, cb = cb || noop
|
||||||
|
, fns = this.fns
|
||||||
|
, max = this.n
|
||||||
|
, throws = this.e
|
||||||
|
, index = 0
|
||||||
|
, done;
|
||||||
|
|
||||||
|
// empty
|
||||||
|
if (!fns.length) return defer(function(){
|
||||||
|
cb(null, results);
|
||||||
|
});
|
||||||
|
|
||||||
|
// process
|
||||||
|
function next() {
|
||||||
|
var i = index++;
|
||||||
|
var fn = fns[i];
|
||||||
|
if (!fn) return;
|
||||||
|
var start = new Date;
|
||||||
|
|
||||||
|
try {
|
||||||
|
fn(callback);
|
||||||
|
} catch (err) {
|
||||||
|
callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
function callback(err, res){
|
||||||
|
if (done) return;
|
||||||
|
if (err && throws) return done = true, defer(function(){
|
||||||
|
cb(err);
|
||||||
|
});
|
||||||
|
var complete = total - pending + 1;
|
||||||
|
var end = new Date;
|
||||||
|
|
||||||
|
results[i] = res;
|
||||||
|
errors[i] = err;
|
||||||
|
|
||||||
|
self.emit('progress', {
|
||||||
|
index: i,
|
||||||
|
value: res,
|
||||||
|
error: err,
|
||||||
|
pending: pending,
|
||||||
|
total: total,
|
||||||
|
complete: complete,
|
||||||
|
percent: complete / total * 100 | 0,
|
||||||
|
start: start,
|
||||||
|
end: end,
|
||||||
|
duration: end - start
|
||||||
|
});
|
||||||
|
|
||||||
|
if (--pending) next();
|
||||||
|
else defer(function(){
|
||||||
|
if(!throws) cb(errors, results);
|
||||||
|
else cb(null, results);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// concurrency
|
||||||
|
for (var i = 0; i < fns.length; i++) {
|
||||||
|
if (i == max) break;
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
84
express-server/node_modules/batch/package.json
generated
vendored
Normal file
84
express-server/node_modules/batch/package.json
generated
vendored
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
{
|
||||||
|
"_args": [
|
||||||
|
[
|
||||||
|
"batch@0.6.1",
|
||||||
|
"/nodeapps/https-test/greenlock-express.js/node_modules/serve-index"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"_from": "batch@0.6.1",
|
||||||
|
"_id": "batch@0.6.1",
|
||||||
|
"_inCache": true,
|
||||||
|
"_installable": true,
|
||||||
|
"_location": "/batch",
|
||||||
|
"_nodeVersion": "6.10.3",
|
||||||
|
"_npmOperationalInternal": {
|
||||||
|
"host": "packages-18-east.internal.npmjs.com",
|
||||||
|
"tmp": "tmp/batch-0.6.1.tgz_1494969108544_0.02703835256397724"
|
||||||
|
},
|
||||||
|
"_npmUser": {
|
||||||
|
"email": "doug@somethingdoug.com",
|
||||||
|
"name": "dougwilson"
|
||||||
|
},
|
||||||
|
"_npmVersion": "3.10.10",
|
||||||
|
"_phantomChildren": {},
|
||||||
|
"_requested": {
|
||||||
|
"name": "batch",
|
||||||
|
"raw": "batch@0.6.1",
|
||||||
|
"rawSpec": "0.6.1",
|
||||||
|
"scope": null,
|
||||||
|
"spec": "0.6.1",
|
||||||
|
"type": "version"
|
||||||
|
},
|
||||||
|
"_requiredBy": [
|
||||||
|
"/serve-index"
|
||||||
|
],
|
||||||
|
"_resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
|
||||||
|
"_shasum": "dc34314f4e679318093fc760272525f94bf25c16",
|
||||||
|
"_shrinkwrap": null,
|
||||||
|
"_spec": "batch@0.6.1",
|
||||||
|
"_where": "/nodeapps/https-test/greenlock-express.js/node_modules/serve-index",
|
||||||
|
"author": {
|
||||||
|
"email": "tj@vision-media.ca",
|
||||||
|
"name": "TJ Holowaychuk"
|
||||||
|
},
|
||||||
|
"browser": {
|
||||||
|
"emitter": "events"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/visionmedia/batch/issues"
|
||||||
|
},
|
||||||
|
"dependencies": {},
|
||||||
|
"description": "Simple async batch with concurrency control and progress reporting.",
|
||||||
|
"devDependencies": {
|
||||||
|
"mocha": "*",
|
||||||
|
"should": "*"
|
||||||
|
},
|
||||||
|
"directories": {},
|
||||||
|
"dist": {
|
||||||
|
"shasum": "dc34314f4e679318093fc760272525f94bf25c16",
|
||||||
|
"tarball": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz"
|
||||||
|
},
|
||||||
|
"gitHead": "577ea162b9be76e79d2fcc43c47ed573112e9892",
|
||||||
|
"homepage": "https://github.com/visionmedia/batch#readme",
|
||||||
|
"license": "MIT",
|
||||||
|
"main": "index",
|
||||||
|
"maintainers": [
|
||||||
|
{
|
||||||
|
"name": "dougwilson",
|
||||||
|
"email": "doug@somethingdoug.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "tjholowaychuk",
|
||||||
|
"email": "tj@vision-media.ca"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "batch",
|
||||||
|
"optionalDependencies": {},
|
||||||
|
"readme": "ERROR: No README data found!",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/visionmedia/batch.git"
|
||||||
|
},
|
||||||
|
"scripts": {},
|
||||||
|
"version": "0.6.1"
|
||||||
|
}
|
98
express-server/node_modules/bindings/README.md
generated
vendored
Normal file
98
express-server/node_modules/bindings/README.md
generated
vendored
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
node-bindings
|
||||||
|
=============
|
||||||
|
### Helper module for loading your native module's .node file
|
||||||
|
|
||||||
|
This is a helper module for authors of Node.js native addon modules.
|
||||||
|
It is basically the "swiss army knife" of `require()`ing your native module's
|
||||||
|
`.node` file.
|
||||||
|
|
||||||
|
Throughout the course of Node's native addon history, addons have ended up being
|
||||||
|
compiled in a variety of different places, depending on which build tool and which
|
||||||
|
version of node was used. To make matters worse, now the _gyp_ build tool can
|
||||||
|
produce either a _Release_ or _Debug_ build, each being built into different
|
||||||
|
locations.
|
||||||
|
|
||||||
|
This module checks _all_ the possible locations that a native addon would be built
|
||||||
|
at, and returns the first one that loads successfully.
|
||||||
|
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
Install with `npm`:
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
$ npm install bindings
|
||||||
|
```
|
||||||
|
|
||||||
|
Or add it to the `"dependencies"` section of your _package.json_ file.
|
||||||
|
|
||||||
|
|
||||||
|
Example
|
||||||
|
-------
|
||||||
|
|
||||||
|
`require()`ing the proper bindings file for the current node version, platform
|
||||||
|
and architecture is as simple as:
|
||||||
|
|
||||||
|
``` js
|
||||||
|
var bindings = require('bindings')('binding.node')
|
||||||
|
|
||||||
|
// Use your bindings defined in your C files
|
||||||
|
bindings.your_c_function()
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Nice Error Output
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
When the `.node` file could not be loaded, `node-bindings` throws an Error with
|
||||||
|
a nice error message telling you exactly what was tried. You can also check the
|
||||||
|
`err.tries` Array property.
|
||||||
|
|
||||||
|
```
|
||||||
|
Error: Could not load the bindings file. Tried:
|
||||||
|
→ /Users/nrajlich/ref/build/binding.node
|
||||||
|
→ /Users/nrajlich/ref/build/Debug/binding.node
|
||||||
|
→ /Users/nrajlich/ref/build/Release/binding.node
|
||||||
|
→ /Users/nrajlich/ref/out/Debug/binding.node
|
||||||
|
→ /Users/nrajlich/ref/Debug/binding.node
|
||||||
|
→ /Users/nrajlich/ref/out/Release/binding.node
|
||||||
|
→ /Users/nrajlich/ref/Release/binding.node
|
||||||
|
→ /Users/nrajlich/ref/build/default/binding.node
|
||||||
|
→ /Users/nrajlich/ref/compiled/0.8.2/darwin/x64/binding.node
|
||||||
|
at bindings (/Users/nrajlich/ref/node_modules/bindings/bindings.js:84:13)
|
||||||
|
at Object.<anonymous> (/Users/nrajlich/ref/lib/ref.js:5:47)
|
||||||
|
at Module._compile (module.js:449:26)
|
||||||
|
at Object.Module._extensions..js (module.js:467:10)
|
||||||
|
at Module.load (module.js:356:32)
|
||||||
|
at Function.Module._load (module.js:312:12)
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
The searching for the `.node` file will originate from the first directory in which has a `package.json` file is found.
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
(The MIT License)
|
||||||
|
|
||||||
|
Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
'Software'), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
174
express-server/node_modules/bindings/bindings.js
generated
vendored
Normal file
174
express-server/node_modules/bindings/bindings.js
generated
vendored
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var fs = require('fs')
|
||||||
|
, path = require('path')
|
||||||
|
, join = path.join
|
||||||
|
, dirname = path.dirname
|
||||||
|
, exists = ((fs.accessSync && function (path) { try { fs.accessSync(path); } catch (e) { return false; } return true; })
|
||||||
|
|| fs.existsSync || path.existsSync)
|
||||||
|
, defaults = {
|
||||||
|
arrow: process.env.NODE_BINDINGS_ARROW || ' → '
|
||||||
|
, compiled: process.env.NODE_BINDINGS_COMPILED_DIR || 'compiled'
|
||||||
|
, platform: process.platform
|
||||||
|
, arch: process.arch
|
||||||
|
, version: process.versions.node
|
||||||
|
, bindings: 'bindings.node'
|
||||||
|
, try: [
|
||||||
|
// node-gyp's linked version in the "build" dir
|
||||||
|
[ 'module_root', 'build', 'bindings' ]
|
||||||
|
// node-waf and gyp_addon (a.k.a node-gyp)
|
||||||
|
, [ 'module_root', 'build', 'Debug', 'bindings' ]
|
||||||
|
, [ 'module_root', 'build', 'Release', 'bindings' ]
|
||||||
|
// Debug files, for development (legacy behavior, remove for node v0.9)
|
||||||
|
, [ 'module_root', 'out', 'Debug', 'bindings' ]
|
||||||
|
, [ 'module_root', 'Debug', 'bindings' ]
|
||||||
|
// Release files, but manually compiled (legacy behavior, remove for node v0.9)
|
||||||
|
, [ 'module_root', 'out', 'Release', 'bindings' ]
|
||||||
|
, [ 'module_root', 'Release', 'bindings' ]
|
||||||
|
// Legacy from node-waf, node <= 0.4.x
|
||||||
|
, [ 'module_root', 'build', 'default', 'bindings' ]
|
||||||
|
// Production "Release" buildtype binary (meh...)
|
||||||
|
, [ 'module_root', 'compiled', 'version', 'platform', 'arch', 'bindings' ]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The main `bindings()` function loads the compiled bindings for a given module.
|
||||||
|
* It uses V8's Error API to determine the parent filename that this function is
|
||||||
|
* being invoked from, which is then used to find the root directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function bindings (opts) {
|
||||||
|
|
||||||
|
// Argument surgery
|
||||||
|
if (typeof opts == 'string') {
|
||||||
|
opts = { bindings: opts }
|
||||||
|
} else if (!opts) {
|
||||||
|
opts = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// maps `defaults` onto `opts` object
|
||||||
|
Object.keys(defaults).map(function(i) {
|
||||||
|
if (!(i in opts)) opts[i] = defaults[i];
|
||||||
|
});
|
||||||
|
|
||||||
|
// Get the module root
|
||||||
|
if (!opts.module_root) {
|
||||||
|
opts.module_root = exports.getRoot(exports.getFileName())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure the given bindings name ends with .node
|
||||||
|
if (path.extname(opts.bindings) != '.node') {
|
||||||
|
opts.bindings += '.node'
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/webpack/webpack/issues/4175#issuecomment-342931035
|
||||||
|
var requireFunc = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require
|
||||||
|
|
||||||
|
var tries = []
|
||||||
|
, i = 0
|
||||||
|
, l = opts.try.length
|
||||||
|
, n
|
||||||
|
, b
|
||||||
|
, err
|
||||||
|
|
||||||
|
for (; i<l; i++) {
|
||||||
|
n = join.apply(null, opts.try[i].map(function (p) {
|
||||||
|
return opts[p] || p
|
||||||
|
}))
|
||||||
|
tries.push(n)
|
||||||
|
try {
|
||||||
|
b = opts.path ? requireFunc.resolve(n) : requireFunc(n)
|
||||||
|
if (!opts.path) {
|
||||||
|
b.path = n
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
} catch (e) {
|
||||||
|
if (!/not find/i.test(e.message)) {
|
||||||
|
throw e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = new Error('Could not locate the bindings file. Tried:\n'
|
||||||
|
+ tries.map(function (a) { return opts.arrow + a }).join('\n'))
|
||||||
|
err.tries = tries
|
||||||
|
throw err
|
||||||
|
}
|
||||||
|
module.exports = exports = bindings
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the filename of the JavaScript file that invokes this function.
|
||||||
|
* Used to help find the root directory of a module.
|
||||||
|
* Optionally accepts an filename argument to skip when searching for the invoking filename
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.getFileName = function getFileName (calling_file) {
|
||||||
|
var origPST = Error.prepareStackTrace
|
||||||
|
, origSTL = Error.stackTraceLimit
|
||||||
|
, dummy = {}
|
||||||
|
, fileName
|
||||||
|
|
||||||
|
Error.stackTraceLimit = 10
|
||||||
|
|
||||||
|
Error.prepareStackTrace = function (e, st) {
|
||||||
|
for (var i=0, l=st.length; i<l; i++) {
|
||||||
|
fileName = st[i].getFileName()
|
||||||
|
if (fileName !== __filename) {
|
||||||
|
if (calling_file) {
|
||||||
|
if (fileName !== calling_file) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// run the 'prepareStackTrace' function above
|
||||||
|
Error.captureStackTrace(dummy)
|
||||||
|
dummy.stack
|
||||||
|
|
||||||
|
// cleanup
|
||||||
|
Error.prepareStackTrace = origPST
|
||||||
|
Error.stackTraceLimit = origSTL
|
||||||
|
|
||||||
|
return fileName
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the root directory of a module, given an arbitrary filename
|
||||||
|
* somewhere in the module tree. The "root directory" is the directory
|
||||||
|
* containing the `package.json` file.
|
||||||
|
*
|
||||||
|
* In: /home/nate/node-native-module/lib/index.js
|
||||||
|
* Out: /home/nate/node-native-module
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.getRoot = function getRoot (file) {
|
||||||
|
var dir = dirname(file)
|
||||||
|
, prev
|
||||||
|
while (true) {
|
||||||
|
if (dir === '.') {
|
||||||
|
// Avoids an infinite loop in rare cases, like the REPL
|
||||||
|
dir = process.cwd()
|
||||||
|
}
|
||||||
|
if (exists(join(dir, 'package.json')) || exists(join(dir, 'node_modules'))) {
|
||||||
|
// Found the 'package.json' file or 'node_modules' dir; we're done
|
||||||
|
return dir
|
||||||
|
}
|
||||||
|
if (prev === dir) {
|
||||||
|
// Got to the top
|
||||||
|
throw new Error('Could not find module root given file: "' + file
|
||||||
|
+ '". Do you have a `package.json` file? ')
|
||||||
|
}
|
||||||
|
// Try the parent dir next
|
||||||
|
prev = dir
|
||||||
|
dir = join(dir, '..')
|
||||||
|
}
|
||||||
|
}
|
88
express-server/node_modules/bindings/package.json
generated
vendored
Normal file
88
express-server/node_modules/bindings/package.json
generated
vendored
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
{
|
||||||
|
"_args": [
|
||||||
|
[
|
||||||
|
"bindings@^1.3.0",
|
||||||
|
"/nodeapps/https-test/greenlock-express.js/node_modules/ursa-optional"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"_from": "bindings@>=1.3.0 <2.0.0",
|
||||||
|
"_hasShrinkwrap": false,
|
||||||
|
"_id": "bindings@1.3.1",
|
||||||
|
"_inCache": true,
|
||||||
|
"_installable": true,
|
||||||
|
"_location": "/bindings",
|
||||||
|
"_nodeVersion": "10.13.0",
|
||||||
|
"_npmOperationalInternal": {
|
||||||
|
"host": "s3://npm-registry-packages",
|
||||||
|
"tmp": "tmp/bindings_1.3.1_1543265368475_0.5592200215369445"
|
||||||
|
},
|
||||||
|
"_npmUser": {
|
||||||
|
"email": "nathan@tootallnate.net",
|
||||||
|
"name": "tootallnate"
|
||||||
|
},
|
||||||
|
"_npmVersion": "6.4.1",
|
||||||
|
"_phantomChildren": {},
|
||||||
|
"_requested": {
|
||||||
|
"name": "bindings",
|
||||||
|
"raw": "bindings@^1.3.0",
|
||||||
|
"rawSpec": "^1.3.0",
|
||||||
|
"scope": null,
|
||||||
|
"spec": ">=1.3.0 <2.0.0",
|
||||||
|
"type": "range"
|
||||||
|
},
|
||||||
|
"_requiredBy": [
|
||||||
|
"/ursa-optional"
|
||||||
|
],
|
||||||
|
"_resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.1.tgz",
|
||||||
|
"_shasum": "21fc7c6d67c18516ec5aaa2815b145ff77b26ea5",
|
||||||
|
"_shrinkwrap": null,
|
||||||
|
"_spec": "bindings@^1.3.0",
|
||||||
|
"_where": "/nodeapps/https-test/greenlock-express.js/node_modules/ursa-optional",
|
||||||
|
"author": {
|
||||||
|
"email": "nathan@tootallnate.net",
|
||||||
|
"name": "Nathan Rajlich",
|
||||||
|
"url": "http://tootallnate.net"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/TooTallNate/node-bindings/issues"
|
||||||
|
},
|
||||||
|
"dependencies": {},
|
||||||
|
"description": "Helper module for loading your native module's .node file",
|
||||||
|
"devDependencies": {},
|
||||||
|
"directories": {},
|
||||||
|
"dist": {
|
||||||
|
"fileCount": 3,
|
||||||
|
"integrity": "sha512-i47mqjF9UbjxJhxGf+pZ6kSxrnI3wBLlnGI2ArWJ4r0VrvDS7ZYXkprq/pLaBWYq4GM0r4zdHY+NNRqEMU7uew==",
|
||||||
|
"npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb/FxZCRA9TVsSAnZWagAAhVQP/jQl2mQD1vWSzK5/xAf5\njtcv2Vhixd7Tp8a/ZzjU1e/hKWa7GtlGgKd1c5T3LcPuBJYOXDIH8VRtWo3U\n9xxQl9+1E2JuA8p9Yps/HwKGbOSTPtYft8i6w0S9RgpTXpwM5duDOso9bPLC\nqUmP6zaD71FOx6g5f9vlw8NL9pHTANLcHEqV2m8YWDSEXRTC8dUw3qnYtvAd\nfGy9lpw/JQaC4QGny5xuy4u+cfuP6WIyWusM72jQKWIr1tdGrGPWDApLqH5j\nEVuC10tt5bkN4qzW59BZ74YRr42SEraC/UZt6d4rzHc8N2rGoNiCg0zIBNgb\nYTbiF9aIFq9gnU0Zn97idQZ33Gk5Ici4IS4/JGwQhjJ1u2zj0qnVV7uE7BIm\nJazUdbPvKbYGRZqOXEJYe8lhkvuwzud94bLDi5k0whTX3cdVm1iP8gHMXn7R\nB1D4yZZRUP8/e/m/2jDX+FNi3IenmX+vAQGPi6myTeaedbP8q/PN3XPBdRZ+\nSQ+Oie89Lj5v4m1cMErNWl9n9E71me8d8a3Yn9Tu+2o1w/FGvVmXEuCjD3qL\nVCyoeXYSsewCsknRoUr+ST8v0UnmL6g1crbUtBxaFNwcubjvddb45FkEK2r1\n5RR/yg6ZU0sZ+2KR/XLI26mG/sLP/y9tKA7XEMOj406h8mNi3N1fFcKbHmU/\nYaFQ\r\n=z9PJ\r\n-----END PGP SIGNATURE-----\r\n",
|
||||||
|
"shasum": "21fc7c6d67c18516ec5aaa2815b145ff77b26ea5",
|
||||||
|
"tarball": "https://registry.npmjs.org/bindings/-/bindings-1.3.1.tgz",
|
||||||
|
"unpackedSize": 9107
|
||||||
|
},
|
||||||
|
"gitHead": "81ba74973e97ff2e42aa4bbae8de057ae62e9387",
|
||||||
|
"homepage": "https://github.com/TooTallNate/node-bindings",
|
||||||
|
"keywords": [
|
||||||
|
"addon",
|
||||||
|
"bindings",
|
||||||
|
"c",
|
||||||
|
"c++",
|
||||||
|
"gyp",
|
||||||
|
"native",
|
||||||
|
"waf"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"main": "./bindings.js",
|
||||||
|
"maintainers": [
|
||||||
|
{
|
||||||
|
"name": "tootallnate",
|
||||||
|
"email": "nathan@tootallnate.net"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "bindings",
|
||||||
|
"optionalDependencies": {},
|
||||||
|
"readme": "ERROR: No README data found!",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/TooTallNate/node-bindings.git"
|
||||||
|
},
|
||||||
|
"version": "1.3.1"
|
||||||
|
}
|
21
express-server/node_modules/bluebird/LICENSE
generated
vendored
Normal file
21
express-server/node_modules/bluebird/LICENSE
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2013-2018 Petka Antonov
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
57
express-server/node_modules/bluebird/README.md
generated
vendored
Normal file
57
express-server/node_modules/bluebird/README.md
generated
vendored
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
<a href="http://promisesaplus.com/">
|
||||||
|
<img src="http://promisesaplus.com/assets/logo-small.png" alt="Promises/A+ logo"
|
||||||
|
title="Promises/A+ 1.1 compliant" align="right" />
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
[](https://travis-ci.org/petkaantonov/bluebird)
|
||||||
|
[](http://petkaantonov.github.io/bluebird/coverage/debug/index.html)
|
||||||
|
|
||||||
|
**Got a question?** Join us on [stackoverflow](http://stackoverflow.com/questions/tagged/bluebird), the [mailing list](https://groups.google.com/forum/#!forum/bluebird-js) or chat on [IRC](https://webchat.freenode.net/?channels=#promises)
|
||||||
|
|
||||||
|
# Introduction
|
||||||
|
|
||||||
|
Bluebird is a fully featured promise library with focus on innovative features and performance
|
||||||
|
|
||||||
|
See the [**bluebird website**](http://bluebirdjs.com/docs/getting-started.html) for further documentation, references and instructions. See the [**API reference**](http://bluebirdjs.com/docs/api-reference.html) here.
|
||||||
|
|
||||||
|
For bluebird 2.x documentation and files, see the [2.x tree](https://github.com/petkaantonov/bluebird/tree/2.x).
|
||||||
|
|
||||||
|
### Note
|
||||||
|
|
||||||
|
Promises in Node.js 10 are significantly faster than before. Bluebird still includes a lot of features like cancellation, iteration methods and warnings that native promises don't. If you are using Bluebird for performance rather than for those - please consider giving native promises a shot and running the benchmarks yourself.
|
||||||
|
|
||||||
|
# Questions and issues
|
||||||
|
|
||||||
|
The [github issue tracker](https://github.com/petkaantonov/bluebird/issues) is **_only_** for bug reports and feature requests. Anything else, such as questions for help in using the library, should be posted in [StackOverflow](http://stackoverflow.com/questions/tagged/bluebird) under tags `promise` and `bluebird`.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Thanks
|
||||||
|
|
||||||
|
Thanks to BrowserStack for providing us with a free account which lets us support old browsers like IE8.
|
||||||
|
|
||||||
|
# License
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2013-2017 Petka Antonov
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
1
express-server/node_modules/bluebird/changelog.md
generated
vendored
Normal file
1
express-server/node_modules/bluebird/changelog.md
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
[http://bluebirdjs.com/docs/changelog.html](http://bluebirdjs.com/docs/changelog.html)
|
3805
express-server/node_modules/bluebird/js/browser/bluebird.core.js
generated
vendored
Normal file
3805
express-server/node_modules/bluebird/js/browser/bluebird.core.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
31
express-server/node_modules/bluebird/js/browser/bluebird.core.min.js
generated
vendored
Normal file
31
express-server/node_modules/bluebird/js/browser/bluebird.core.min.js
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
5647
express-server/node_modules/bluebird/js/browser/bluebird.js
generated
vendored
Normal file
5647
express-server/node_modules/bluebird/js/browser/bluebird.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
31
express-server/node_modules/bluebird/js/browser/bluebird.min.js
generated
vendored
Normal file
31
express-server/node_modules/bluebird/js/browser/bluebird.min.js
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
21
express-server/node_modules/bluebird/js/release/any.js
generated
vendored
Normal file
21
express-server/node_modules/bluebird/js/release/any.js
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
"use strict";
|
||||||
|
module.exports = function(Promise) {
|
||||||
|
var SomePromiseArray = Promise._SomePromiseArray;
|
||||||
|
function any(promises) {
|
||||||
|
var ret = new SomePromiseArray(promises);
|
||||||
|
var promise = ret.promise();
|
||||||
|
ret.setHowMany(1);
|
||||||
|
ret.setUnwrap();
|
||||||
|
ret.init();
|
||||||
|
return promise;
|
||||||
|
}
|
||||||
|
|
||||||
|
Promise.any = function (promises) {
|
||||||
|
return any(promises);
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype.any = function () {
|
||||||
|
return any(this);
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
55
express-server/node_modules/bluebird/js/release/assert.js
generated
vendored
Normal file
55
express-server/node_modules/bluebird/js/release/assert.js
generated
vendored
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
"use strict";
|
||||||
|
module.exports = (function(){
|
||||||
|
var AssertionError = (function() {
|
||||||
|
function AssertionError(a) {
|
||||||
|
this.constructor$(a);
|
||||||
|
this.message = a;
|
||||||
|
this.name = "AssertionError";
|
||||||
|
}
|
||||||
|
AssertionError.prototype = new Error();
|
||||||
|
AssertionError.prototype.constructor = AssertionError;
|
||||||
|
AssertionError.prototype.constructor$ = Error;
|
||||||
|
return AssertionError;
|
||||||
|
})();
|
||||||
|
|
||||||
|
function getParams(args) {
|
||||||
|
var params = [];
|
||||||
|
for (var i = 0; i < args.length; ++i) params.push("arg" + i);
|
||||||
|
return params;
|
||||||
|
}
|
||||||
|
|
||||||
|
function nativeAssert(callName, args, expect) {
|
||||||
|
try {
|
||||||
|
var params = getParams(args);
|
||||||
|
var constructorArgs = params;
|
||||||
|
constructorArgs.push("return " +
|
||||||
|
callName + "("+ params.join(",") + ");");
|
||||||
|
var fn = Function.apply(null, constructorArgs);
|
||||||
|
return fn.apply(null, args);
|
||||||
|
} catch (e) {
|
||||||
|
if (!(e instanceof SyntaxError)) {
|
||||||
|
throw e;
|
||||||
|
} else {
|
||||||
|
return expect;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return function assert(boolExpr, message) {
|
||||||
|
if (boolExpr === true) return;
|
||||||
|
|
||||||
|
if (typeof boolExpr === "string" &&
|
||||||
|
boolExpr.charAt(0) === "%") {
|
||||||
|
var nativeCallName = boolExpr;
|
||||||
|
var $_len = arguments.length;var args = new Array(Math.max($_len - 2, 0)); for(var $_i = 2; $_i < $_len; ++$_i) {args[$_i - 2] = arguments[$_i];};
|
||||||
|
if (nativeAssert(nativeCallName, args, message) === message) return;
|
||||||
|
message = (nativeCallName + " !== " + message);
|
||||||
|
}
|
||||||
|
|
||||||
|
var ret = new AssertionError(message);
|
||||||
|
if (Error.captureStackTrace) {
|
||||||
|
Error.captureStackTrace(ret, assert);
|
||||||
|
}
|
||||||
|
throw ret;
|
||||||
|
};
|
||||||
|
})();
|
165
express-server/node_modules/bluebird/js/release/async.js
generated
vendored
Normal file
165
express-server/node_modules/bluebird/js/release/async.js
generated
vendored
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
"use strict";
|
||||||
|
var firstLineError;
|
||||||
|
try {throw new Error(); } catch (e) {firstLineError = e;}
|
||||||
|
var schedule = require("./schedule");
|
||||||
|
var Queue = require("./queue");
|
||||||
|
var util = require("./util");
|
||||||
|
|
||||||
|
function Async() {
|
||||||
|
this._customScheduler = false;
|
||||||
|
this._isTickUsed = false;
|
||||||
|
this._lateQueue = new Queue(16);
|
||||||
|
this._normalQueue = new Queue(16);
|
||||||
|
this._haveDrainedQueues = false;
|
||||||
|
this._trampolineEnabled = true;
|
||||||
|
var self = this;
|
||||||
|
this.drainQueues = function () {
|
||||||
|
self._drainQueues();
|
||||||
|
};
|
||||||
|
this._schedule = schedule;
|
||||||
|
}
|
||||||
|
|
||||||
|
Async.prototype.setScheduler = function(fn) {
|
||||||
|
var prev = this._schedule;
|
||||||
|
this._schedule = fn;
|
||||||
|
this._customScheduler = true;
|
||||||
|
return prev;
|
||||||
|
};
|
||||||
|
|
||||||
|
Async.prototype.hasCustomScheduler = function() {
|
||||||
|
return this._customScheduler;
|
||||||
|
};
|
||||||
|
|
||||||
|
Async.prototype.enableTrampoline = function() {
|
||||||
|
this._trampolineEnabled = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
Async.prototype.disableTrampolineIfNecessary = function() {
|
||||||
|
if (util.hasDevTools) {
|
||||||
|
this._trampolineEnabled = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Async.prototype.haveItemsQueued = function () {
|
||||||
|
return this._isTickUsed || this._haveDrainedQueues;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Async.prototype.fatalError = function(e, isNode) {
|
||||||
|
if (isNode) {
|
||||||
|
process.stderr.write("Fatal " + (e instanceof Error ? e.stack : e) +
|
||||||
|
"\n");
|
||||||
|
process.exit(2);
|
||||||
|
} else {
|
||||||
|
this.throwLater(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Async.prototype.throwLater = function(fn, arg) {
|
||||||
|
if (arguments.length === 1) {
|
||||||
|
arg = fn;
|
||||||
|
fn = function () { throw arg; };
|
||||||
|
}
|
||||||
|
if (typeof setTimeout !== "undefined") {
|
||||||
|
setTimeout(function() {
|
||||||
|
fn(arg);
|
||||||
|
}, 0);
|
||||||
|
} else try {
|
||||||
|
this._schedule(function() {
|
||||||
|
fn(arg);
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/MqrFmX\u000a");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function AsyncInvokeLater(fn, receiver, arg) {
|
||||||
|
this._lateQueue.push(fn, receiver, arg);
|
||||||
|
this._queueTick();
|
||||||
|
}
|
||||||
|
|
||||||
|
function AsyncInvoke(fn, receiver, arg) {
|
||||||
|
this._normalQueue.push(fn, receiver, arg);
|
||||||
|
this._queueTick();
|
||||||
|
}
|
||||||
|
|
||||||
|
function AsyncSettlePromises(promise) {
|
||||||
|
this._normalQueue._pushOne(promise);
|
||||||
|
this._queueTick();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!util.hasDevTools) {
|
||||||
|
Async.prototype.invokeLater = AsyncInvokeLater;
|
||||||
|
Async.prototype.invoke = AsyncInvoke;
|
||||||
|
Async.prototype.settlePromises = AsyncSettlePromises;
|
||||||
|
} else {
|
||||||
|
Async.prototype.invokeLater = function (fn, receiver, arg) {
|
||||||
|
if (this._trampolineEnabled) {
|
||||||
|
AsyncInvokeLater.call(this, fn, receiver, arg);
|
||||||
|
} else {
|
||||||
|
this._schedule(function() {
|
||||||
|
setTimeout(function() {
|
||||||
|
fn.call(receiver, arg);
|
||||||
|
}, 100);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Async.prototype.invoke = function (fn, receiver, arg) {
|
||||||
|
if (this._trampolineEnabled) {
|
||||||
|
AsyncInvoke.call(this, fn, receiver, arg);
|
||||||
|
} else {
|
||||||
|
this._schedule(function() {
|
||||||
|
fn.call(receiver, arg);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Async.prototype.settlePromises = function(promise) {
|
||||||
|
if (this._trampolineEnabled) {
|
||||||
|
AsyncSettlePromises.call(this, promise);
|
||||||
|
} else {
|
||||||
|
this._schedule(function() {
|
||||||
|
promise._settlePromises();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function _drainQueue(queue) {
|
||||||
|
while (queue.length() > 0) {
|
||||||
|
_drainQueueStep(queue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function _drainQueueStep(queue) {
|
||||||
|
var fn = queue.shift();
|
||||||
|
if (typeof fn !== "function") {
|
||||||
|
fn._settlePromises();
|
||||||
|
} else {
|
||||||
|
var receiver = queue.shift();
|
||||||
|
var arg = queue.shift();
|
||||||
|
fn.call(receiver, arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Async.prototype._drainQueues = function () {
|
||||||
|
_drainQueue(this._normalQueue);
|
||||||
|
this._reset();
|
||||||
|
this._haveDrainedQueues = true;
|
||||||
|
_drainQueue(this._lateQueue);
|
||||||
|
};
|
||||||
|
|
||||||
|
Async.prototype._queueTick = function () {
|
||||||
|
if (!this._isTickUsed) {
|
||||||
|
this._isTickUsed = true;
|
||||||
|
this._schedule(this.drainQueues);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Async.prototype._reset = function () {
|
||||||
|
this._isTickUsed = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = Async;
|
||||||
|
module.exports.firstLineError = firstLineError;
|
67
express-server/node_modules/bluebird/js/release/bind.js
generated
vendored
Normal file
67
express-server/node_modules/bluebird/js/release/bind.js
generated
vendored
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
"use strict";
|
||||||
|
module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) {
|
||||||
|
var calledBind = false;
|
||||||
|
var rejectThis = function(_, e) {
|
||||||
|
this._reject(e);
|
||||||
|
};
|
||||||
|
|
||||||
|
var targetRejected = function(e, context) {
|
||||||
|
context.promiseRejectionQueued = true;
|
||||||
|
context.bindingPromise._then(rejectThis, rejectThis, null, this, e);
|
||||||
|
};
|
||||||
|
|
||||||
|
var bindingResolved = function(thisArg, context) {
|
||||||
|
if (((this._bitField & 50397184) === 0)) {
|
||||||
|
this._resolveCallback(context.target);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var bindingRejected = function(e, context) {
|
||||||
|
if (!context.promiseRejectionQueued) this._reject(e);
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype.bind = function (thisArg) {
|
||||||
|
if (!calledBind) {
|
||||||
|
calledBind = true;
|
||||||
|
Promise.prototype._propagateFrom = debug.propagateFromFunction();
|
||||||
|
Promise.prototype._boundValue = debug.boundValueFunction();
|
||||||
|
}
|
||||||
|
var maybePromise = tryConvertToPromise(thisArg);
|
||||||
|
var ret = new Promise(INTERNAL);
|
||||||
|
ret._propagateFrom(this, 1);
|
||||||
|
var target = this._target();
|
||||||
|
ret._setBoundTo(maybePromise);
|
||||||
|
if (maybePromise instanceof Promise) {
|
||||||
|
var context = {
|
||||||
|
promiseRejectionQueued: false,
|
||||||
|
promise: ret,
|
||||||
|
target: target,
|
||||||
|
bindingPromise: maybePromise
|
||||||
|
};
|
||||||
|
target._then(INTERNAL, targetRejected, undefined, ret, context);
|
||||||
|
maybePromise._then(
|
||||||
|
bindingResolved, bindingRejected, undefined, ret, context);
|
||||||
|
ret._setOnCancel(maybePromise);
|
||||||
|
} else {
|
||||||
|
ret._resolveCallback(target);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._setBoundTo = function (obj) {
|
||||||
|
if (obj !== undefined) {
|
||||||
|
this._bitField = this._bitField | 2097152;
|
||||||
|
this._boundTo = obj;
|
||||||
|
} else {
|
||||||
|
this._bitField = this._bitField & (~2097152);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._isBound = function () {
|
||||||
|
return (this._bitField & 2097152) === 2097152;
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.bind = function (thisArg, value) {
|
||||||
|
return Promise.resolve(value).bind(thisArg);
|
||||||
|
};
|
||||||
|
};
|
11
express-server/node_modules/bluebird/js/release/bluebird.js
generated
vendored
Normal file
11
express-server/node_modules/bluebird/js/release/bluebird.js
generated
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
"use strict";
|
||||||
|
var old;
|
||||||
|
if (typeof Promise !== "undefined") old = Promise;
|
||||||
|
function noConflict() {
|
||||||
|
try { if (Promise === bluebird) Promise = old; }
|
||||||
|
catch (e) {}
|
||||||
|
return bluebird;
|
||||||
|
}
|
||||||
|
var bluebird = require("./promise")();
|
||||||
|
bluebird.noConflict = noConflict;
|
||||||
|
module.exports = bluebird;
|
123
express-server/node_modules/bluebird/js/release/call_get.js
generated
vendored
Normal file
123
express-server/node_modules/bluebird/js/release/call_get.js
generated
vendored
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
"use strict";
|
||||||
|
var cr = Object.create;
|
||||||
|
if (cr) {
|
||||||
|
var callerCache = cr(null);
|
||||||
|
var getterCache = cr(null);
|
||||||
|
callerCache[" size"] = getterCache[" size"] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = function(Promise) {
|
||||||
|
var util = require("./util");
|
||||||
|
var canEvaluate = util.canEvaluate;
|
||||||
|
var isIdentifier = util.isIdentifier;
|
||||||
|
|
||||||
|
var getMethodCaller;
|
||||||
|
var getGetter;
|
||||||
|
if (!false) {
|
||||||
|
var makeMethodCaller = function (methodName) {
|
||||||
|
return new Function("ensureMethod", " \n\
|
||||||
|
return function(obj) { \n\
|
||||||
|
'use strict' \n\
|
||||||
|
var len = this.length; \n\
|
||||||
|
ensureMethod(obj, 'methodName'); \n\
|
||||||
|
switch(len) { \n\
|
||||||
|
case 1: return obj.methodName(this[0]); \n\
|
||||||
|
case 2: return obj.methodName(this[0], this[1]); \n\
|
||||||
|
case 3: return obj.methodName(this[0], this[1], this[2]); \n\
|
||||||
|
case 0: return obj.methodName(); \n\
|
||||||
|
default: \n\
|
||||||
|
return obj.methodName.apply(obj, this); \n\
|
||||||
|
} \n\
|
||||||
|
}; \n\
|
||||||
|
".replace(/methodName/g, methodName))(ensureMethod);
|
||||||
|
};
|
||||||
|
|
||||||
|
var makeGetter = function (propertyName) {
|
||||||
|
return new Function("obj", " \n\
|
||||||
|
'use strict'; \n\
|
||||||
|
return obj.propertyName; \n\
|
||||||
|
".replace("propertyName", propertyName));
|
||||||
|
};
|
||||||
|
|
||||||
|
var getCompiled = function(name, compiler, cache) {
|
||||||
|
var ret = cache[name];
|
||||||
|
if (typeof ret !== "function") {
|
||||||
|
if (!isIdentifier(name)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
ret = compiler(name);
|
||||||
|
cache[name] = ret;
|
||||||
|
cache[" size"]++;
|
||||||
|
if (cache[" size"] > 512) {
|
||||||
|
var keys = Object.keys(cache);
|
||||||
|
for (var i = 0; i < 256; ++i) delete cache[keys[i]];
|
||||||
|
cache[" size"] = keys.length - 256;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
getMethodCaller = function(name) {
|
||||||
|
return getCompiled(name, makeMethodCaller, callerCache);
|
||||||
|
};
|
||||||
|
|
||||||
|
getGetter = function(name) {
|
||||||
|
return getCompiled(name, makeGetter, getterCache);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function ensureMethod(obj, methodName) {
|
||||||
|
var fn;
|
||||||
|
if (obj != null) fn = obj[methodName];
|
||||||
|
if (typeof fn !== "function") {
|
||||||
|
var message = "Object " + util.classString(obj) + " has no method '" +
|
||||||
|
util.toString(methodName) + "'";
|
||||||
|
throw new Promise.TypeError(message);
|
||||||
|
}
|
||||||
|
return fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
function caller(obj) {
|
||||||
|
var methodName = this.pop();
|
||||||
|
var fn = ensureMethod(obj, methodName);
|
||||||
|
return fn.apply(obj, this);
|
||||||
|
}
|
||||||
|
Promise.prototype.call = function (methodName) {
|
||||||
|
var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];};
|
||||||
|
if (!false) {
|
||||||
|
if (canEvaluate) {
|
||||||
|
var maybeCaller = getMethodCaller(methodName);
|
||||||
|
if (maybeCaller !== null) {
|
||||||
|
return this._then(
|
||||||
|
maybeCaller, undefined, undefined, args, undefined);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
args.push(methodName);
|
||||||
|
return this._then(caller, undefined, undefined, args, undefined);
|
||||||
|
};
|
||||||
|
|
||||||
|
function namedGetter(obj) {
|
||||||
|
return obj[this];
|
||||||
|
}
|
||||||
|
function indexedGetter(obj) {
|
||||||
|
var index = +this;
|
||||||
|
if (index < 0) index = Math.max(0, index + obj.length);
|
||||||
|
return obj[index];
|
||||||
|
}
|
||||||
|
Promise.prototype.get = function (propertyName) {
|
||||||
|
var isIndex = (typeof propertyName === "number");
|
||||||
|
var getter;
|
||||||
|
if (!isIndex) {
|
||||||
|
if (canEvaluate) {
|
||||||
|
var maybeGetter = getGetter(propertyName);
|
||||||
|
getter = maybeGetter !== null ? maybeGetter : namedGetter;
|
||||||
|
} else {
|
||||||
|
getter = namedGetter;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
getter = indexedGetter;
|
||||||
|
}
|
||||||
|
return this._then(getter, undefined, undefined, propertyName, undefined);
|
||||||
|
};
|
||||||
|
};
|
129
express-server/node_modules/bluebird/js/release/cancel.js
generated
vendored
Normal file
129
express-server/node_modules/bluebird/js/release/cancel.js
generated
vendored
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
"use strict";
|
||||||
|
module.exports = function(Promise, PromiseArray, apiRejection, debug) {
|
||||||
|
var util = require("./util");
|
||||||
|
var tryCatch = util.tryCatch;
|
||||||
|
var errorObj = util.errorObj;
|
||||||
|
var async = Promise._async;
|
||||||
|
|
||||||
|
Promise.prototype["break"] = Promise.prototype.cancel = function() {
|
||||||
|
if (!debug.cancellation()) return this._warn("cancellation is disabled");
|
||||||
|
|
||||||
|
var promise = this;
|
||||||
|
var child = promise;
|
||||||
|
while (promise._isCancellable()) {
|
||||||
|
if (!promise._cancelBy(child)) {
|
||||||
|
if (child._isFollowing()) {
|
||||||
|
child._followee().cancel();
|
||||||
|
} else {
|
||||||
|
child._cancelBranched();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
var parent = promise._cancellationParent;
|
||||||
|
if (parent == null || !parent._isCancellable()) {
|
||||||
|
if (promise._isFollowing()) {
|
||||||
|
promise._followee().cancel();
|
||||||
|
} else {
|
||||||
|
promise._cancelBranched();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
if (promise._isFollowing()) promise._followee().cancel();
|
||||||
|
promise._setWillBeCancelled();
|
||||||
|
child = promise;
|
||||||
|
promise = parent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._branchHasCancelled = function() {
|
||||||
|
this._branchesRemainingToCancel--;
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._enoughBranchesHaveCancelled = function() {
|
||||||
|
return this._branchesRemainingToCancel === undefined ||
|
||||||
|
this._branchesRemainingToCancel <= 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._cancelBy = function(canceller) {
|
||||||
|
if (canceller === this) {
|
||||||
|
this._branchesRemainingToCancel = 0;
|
||||||
|
this._invokeOnCancel();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
this._branchHasCancelled();
|
||||||
|
if (this._enoughBranchesHaveCancelled()) {
|
||||||
|
this._invokeOnCancel();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._cancelBranched = function() {
|
||||||
|
if (this._enoughBranchesHaveCancelled()) {
|
||||||
|
this._cancel();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._cancel = function() {
|
||||||
|
if (!this._isCancellable()) return;
|
||||||
|
this._setCancelled();
|
||||||
|
async.invoke(this._cancelPromises, this, undefined);
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._cancelPromises = function() {
|
||||||
|
if (this._length() > 0) this._settlePromises();
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._unsetOnCancel = function() {
|
||||||
|
this._onCancelField = undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._isCancellable = function() {
|
||||||
|
return this.isPending() && !this._isCancelled();
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype.isCancellable = function() {
|
||||||
|
return this.isPending() && !this.isCancelled();
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) {
|
||||||
|
if (util.isArray(onCancelCallback)) {
|
||||||
|
for (var i = 0; i < onCancelCallback.length; ++i) {
|
||||||
|
this._doInvokeOnCancel(onCancelCallback[i], internalOnly);
|
||||||
|
}
|
||||||
|
} else if (onCancelCallback !== undefined) {
|
||||||
|
if (typeof onCancelCallback === "function") {
|
||||||
|
if (!internalOnly) {
|
||||||
|
var e = tryCatch(onCancelCallback).call(this._boundValue());
|
||||||
|
if (e === errorObj) {
|
||||||
|
this._attachExtraTrace(e.e);
|
||||||
|
async.throwLater(e.e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
onCancelCallback._resultCancelled(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._invokeOnCancel = function() {
|
||||||
|
var onCancelCallback = this._onCancel();
|
||||||
|
this._unsetOnCancel();
|
||||||
|
async.invoke(this._doInvokeOnCancel, this, onCancelCallback);
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._invokeInternalOnCancel = function() {
|
||||||
|
if (this._isCancellable()) {
|
||||||
|
this._doInvokeOnCancel(this._onCancel(), true);
|
||||||
|
this._unsetOnCancel();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._resultCancelled = function() {
|
||||||
|
this.cancel();
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
42
express-server/node_modules/bluebird/js/release/catch_filter.js
generated
vendored
Normal file
42
express-server/node_modules/bluebird/js/release/catch_filter.js
generated
vendored
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
"use strict";
|
||||||
|
module.exports = function(NEXT_FILTER) {
|
||||||
|
var util = require("./util");
|
||||||
|
var getKeys = require("./es5").keys;
|
||||||
|
var tryCatch = util.tryCatch;
|
||||||
|
var errorObj = util.errorObj;
|
||||||
|
|
||||||
|
function catchFilter(instances, cb, promise) {
|
||||||
|
return function(e) {
|
||||||
|
var boundTo = promise._boundValue();
|
||||||
|
predicateLoop: for (var i = 0; i < instances.length; ++i) {
|
||||||
|
var item = instances[i];
|
||||||
|
|
||||||
|
if (item === Error ||
|
||||||
|
(item != null && item.prototype instanceof Error)) {
|
||||||
|
if (e instanceof item) {
|
||||||
|
return tryCatch(cb).call(boundTo, e);
|
||||||
|
}
|
||||||
|
} else if (typeof item === "function") {
|
||||||
|
var matchesPredicate = tryCatch(item).call(boundTo, e);
|
||||||
|
if (matchesPredicate === errorObj) {
|
||||||
|
return matchesPredicate;
|
||||||
|
} else if (matchesPredicate) {
|
||||||
|
return tryCatch(cb).call(boundTo, e);
|
||||||
|
}
|
||||||
|
} else if (util.isObject(e)) {
|
||||||
|
var keys = getKeys(item);
|
||||||
|
for (var j = 0; j < keys.length; ++j) {
|
||||||
|
var key = keys[j];
|
||||||
|
if (item[key] != e[key]) {
|
||||||
|
continue predicateLoop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tryCatch(cb).call(boundTo, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NEXT_FILTER;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return catchFilter;
|
||||||
|
};
|
69
express-server/node_modules/bluebird/js/release/context.js
generated
vendored
Normal file
69
express-server/node_modules/bluebird/js/release/context.js
generated
vendored
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
"use strict";
|
||||||
|
module.exports = function(Promise) {
|
||||||
|
var longStackTraces = false;
|
||||||
|
var contextStack = [];
|
||||||
|
|
||||||
|
Promise.prototype._promiseCreated = function() {};
|
||||||
|
Promise.prototype._pushContext = function() {};
|
||||||
|
Promise.prototype._popContext = function() {return null;};
|
||||||
|
Promise._peekContext = Promise.prototype._peekContext = function() {};
|
||||||
|
|
||||||
|
function Context() {
|
||||||
|
this._trace = new Context.CapturedTrace(peekContext());
|
||||||
|
}
|
||||||
|
Context.prototype._pushContext = function () {
|
||||||
|
if (this._trace !== undefined) {
|
||||||
|
this._trace._promiseCreated = null;
|
||||||
|
contextStack.push(this._trace);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Context.prototype._popContext = function () {
|
||||||
|
if (this._trace !== undefined) {
|
||||||
|
var trace = contextStack.pop();
|
||||||
|
var ret = trace._promiseCreated;
|
||||||
|
trace._promiseCreated = null;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
function createContext() {
|
||||||
|
if (longStackTraces) return new Context();
|
||||||
|
}
|
||||||
|
|
||||||
|
function peekContext() {
|
||||||
|
var lastIndex = contextStack.length - 1;
|
||||||
|
if (lastIndex >= 0) {
|
||||||
|
return contextStack[lastIndex];
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
Context.CapturedTrace = null;
|
||||||
|
Context.create = createContext;
|
||||||
|
Context.deactivateLongStackTraces = function() {};
|
||||||
|
Context.activateLongStackTraces = function() {
|
||||||
|
var Promise_pushContext = Promise.prototype._pushContext;
|
||||||
|
var Promise_popContext = Promise.prototype._popContext;
|
||||||
|
var Promise_PeekContext = Promise._peekContext;
|
||||||
|
var Promise_peekContext = Promise.prototype._peekContext;
|
||||||
|
var Promise_promiseCreated = Promise.prototype._promiseCreated;
|
||||||
|
Context.deactivateLongStackTraces = function() {
|
||||||
|
Promise.prototype._pushContext = Promise_pushContext;
|
||||||
|
Promise.prototype._popContext = Promise_popContext;
|
||||||
|
Promise._peekContext = Promise_PeekContext;
|
||||||
|
Promise.prototype._peekContext = Promise_peekContext;
|
||||||
|
Promise.prototype._promiseCreated = Promise_promiseCreated;
|
||||||
|
longStackTraces = false;
|
||||||
|
};
|
||||||
|
longStackTraces = true;
|
||||||
|
Promise.prototype._pushContext = Context.prototype._pushContext;
|
||||||
|
Promise.prototype._popContext = Context.prototype._popContext;
|
||||||
|
Promise._peekContext = Promise.prototype._peekContext = peekContext;
|
||||||
|
Promise.prototype._promiseCreated = function() {
|
||||||
|
var ctx = this._peekContext();
|
||||||
|
if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return Context;
|
||||||
|
};
|
934
express-server/node_modules/bluebird/js/release/debuggability.js
generated
vendored
Normal file
934
express-server/node_modules/bluebird/js/release/debuggability.js
generated
vendored
Normal file
@ -0,0 +1,934 @@
|
|||||||
|
"use strict";
|
||||||
|
module.exports = function(Promise, Context) {
|
||||||
|
var getDomain = Promise._getDomain;
|
||||||
|
var async = Promise._async;
|
||||||
|
var Warning = require("./errors").Warning;
|
||||||
|
var util = require("./util");
|
||||||
|
var es5 = require("./es5");
|
||||||
|
var canAttachTrace = util.canAttachTrace;
|
||||||
|
var unhandledRejectionHandled;
|
||||||
|
var possiblyUnhandledRejection;
|
||||||
|
var bluebirdFramePattern =
|
||||||
|
/[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/;
|
||||||
|
var nodeFramePattern = /\((?:timers\.js):\d+:\d+\)/;
|
||||||
|
var parseLinePattern = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/;
|
||||||
|
var stackFramePattern = null;
|
||||||
|
var formatStack = null;
|
||||||
|
var indentStackFrames = false;
|
||||||
|
var printWarning;
|
||||||
|
var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 &&
|
||||||
|
(false ||
|
||||||
|
util.env("BLUEBIRD_DEBUG") ||
|
||||||
|
util.env("NODE_ENV") === "development"));
|
||||||
|
|
||||||
|
var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 &&
|
||||||
|
(debugging || util.env("BLUEBIRD_WARNINGS")));
|
||||||
|
|
||||||
|
var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 &&
|
||||||
|
(debugging || util.env("BLUEBIRD_LONG_STACK_TRACES")));
|
||||||
|
|
||||||
|
var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 &&
|
||||||
|
(warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN"));
|
||||||
|
|
||||||
|
Promise.prototype.suppressUnhandledRejections = function() {
|
||||||
|
var target = this._target();
|
||||||
|
target._bitField = ((target._bitField & (~1048576)) |
|
||||||
|
524288);
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._ensurePossibleRejectionHandled = function () {
|
||||||
|
if ((this._bitField & 524288) !== 0) return;
|
||||||
|
this._setRejectionIsUnhandled();
|
||||||
|
var self = this;
|
||||||
|
setTimeout(function() {
|
||||||
|
self._notifyUnhandledRejection();
|
||||||
|
}, 1);
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._notifyUnhandledRejectionIsHandled = function () {
|
||||||
|
fireRejectionEvent("rejectionHandled",
|
||||||
|
unhandledRejectionHandled, undefined, this);
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._setReturnedNonUndefined = function() {
|
||||||
|
this._bitField = this._bitField | 268435456;
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._returnedNonUndefined = function() {
|
||||||
|
return (this._bitField & 268435456) !== 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._notifyUnhandledRejection = function () {
|
||||||
|
if (this._isRejectionUnhandled()) {
|
||||||
|
var reason = this._settledValue();
|
||||||
|
this._setUnhandledRejectionIsNotified();
|
||||||
|
fireRejectionEvent("unhandledRejection",
|
||||||
|
possiblyUnhandledRejection, reason, this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._setUnhandledRejectionIsNotified = function () {
|
||||||
|
this._bitField = this._bitField | 262144;
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._unsetUnhandledRejectionIsNotified = function () {
|
||||||
|
this._bitField = this._bitField & (~262144);
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._isUnhandledRejectionNotified = function () {
|
||||||
|
return (this._bitField & 262144) > 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._setRejectionIsUnhandled = function () {
|
||||||
|
this._bitField = this._bitField | 1048576;
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._unsetRejectionIsUnhandled = function () {
|
||||||
|
this._bitField = this._bitField & (~1048576);
|
||||||
|
if (this._isUnhandledRejectionNotified()) {
|
||||||
|
this._unsetUnhandledRejectionIsNotified();
|
||||||
|
this._notifyUnhandledRejectionIsHandled();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._isRejectionUnhandled = function () {
|
||||||
|
return (this._bitField & 1048576) > 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype._warn = function(message, shouldUseOwnTrace, promise) {
|
||||||
|
return warn(message, shouldUseOwnTrace, promise || this);
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.onPossiblyUnhandledRejection = function (fn) {
|
||||||
|
var domain = getDomain();
|
||||||
|
possiblyUnhandledRejection =
|
||||||
|
typeof fn === "function" ? (domain === null ?
|
||||||
|
fn : util.domainBind(domain, fn))
|
||||||
|
: undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.onUnhandledRejectionHandled = function (fn) {
|
||||||
|
var domain = getDomain();
|
||||||
|
unhandledRejectionHandled =
|
||||||
|
typeof fn === "function" ? (domain === null ?
|
||||||
|
fn : util.domainBind(domain, fn))
|
||||||
|
: undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
var disableLongStackTraces = function() {};
|
||||||
|
Promise.longStackTraces = function () {
|
||||||
|
if (async.haveItemsQueued() && !config.longStackTraces) {
|
||||||
|
throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/MqrFmX\u000a");
|
||||||
|
}
|
||||||
|
if (!config.longStackTraces && longStackTracesIsSupported()) {
|
||||||
|
var Promise_captureStackTrace = Promise.prototype._captureStackTrace;
|
||||||
|
var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace;
|
||||||
|
var Promise_dereferenceTrace = Promise.prototype._dereferenceTrace;
|
||||||
|
config.longStackTraces = true;
|
||||||
|
disableLongStackTraces = function() {
|
||||||
|
if (async.haveItemsQueued() && !config.longStackTraces) {
|
||||||
|
throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/MqrFmX\u000a");
|
||||||
|
}
|
||||||
|
Promise.prototype._captureStackTrace = Promise_captureStackTrace;
|
||||||
|
Promise.prototype._attachExtraTrace = Promise_attachExtraTrace;
|
||||||
|
Promise.prototype._dereferenceTrace = Promise_dereferenceTrace;
|
||||||
|
Context.deactivateLongStackTraces();
|
||||||
|
async.enableTrampoline();
|
||||||
|
config.longStackTraces = false;
|
||||||
|
};
|
||||||
|
Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace;
|
||||||
|
Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace;
|
||||||
|
Promise.prototype._dereferenceTrace = longStackTracesDereferenceTrace;
|
||||||
|
Context.activateLongStackTraces();
|
||||||
|
async.disableTrampolineIfNecessary();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.hasLongStackTraces = function () {
|
||||||
|
return config.longStackTraces && longStackTracesIsSupported();
|
||||||
|
};
|
||||||
|
|
||||||
|
var fireDomEvent = (function() {
|
||||||
|
try {
|
||||||
|
if (typeof CustomEvent === "function") {
|
||||||
|
var event = new CustomEvent("CustomEvent");
|
||||||
|
util.global.dispatchEvent(event);
|
||||||
|
return function(name, event) {
|
||||||
|
var eventData = {
|
||||||
|
detail: event,
|
||||||
|
cancelable: true
|
||||||
|
};
|
||||||
|
es5.defineProperty(
|
||||||
|
eventData, "promise", {value: event.promise});
|
||||||
|
es5.defineProperty(eventData, "reason", {value: event.reason});
|
||||||
|
var domEvent = new CustomEvent(name.toLowerCase(), eventData);
|
||||||
|
return !util.global.dispatchEvent(domEvent);
|
||||||
|
};
|
||||||
|
} else if (typeof Event === "function") {
|
||||||
|
var event = new Event("CustomEvent");
|
||||||
|
util.global.dispatchEvent(event);
|
||||||
|
return function(name, event) {
|
||||||
|
var domEvent = new Event(name.toLowerCase(), {
|
||||||
|
cancelable: true
|
||||||
|
});
|
||||||
|
domEvent.detail = event;
|
||||||
|
es5.defineProperty(domEvent, "promise", {value: event.promise});
|
||||||
|
es5.defineProperty(domEvent, "reason", {value: event.reason});
|
||||||
|
return !util.global.dispatchEvent(domEvent);
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
var event = document.createEvent("CustomEvent");
|
||||||
|
event.initCustomEvent("testingtheevent", false, true, {});
|
||||||
|
util.global.dispatchEvent(event);
|
||||||
|
return function(name, event) {
|
||||||
|
var domEvent = document.createEvent("CustomEvent");
|
||||||
|
domEvent.initCustomEvent(name.toLowerCase(), false, true,
|
||||||
|
event);
|
||||||
|
return !util.global.dispatchEvent(domEvent);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} catch (e) {}
|
||||||
|
return function() {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
|
||||||
|
var fireGlobalEvent = (function() {
|
||||||
|
if (util.isNode) {
|
||||||
|
return function() {
|
||||||
|
return process.emit.apply(process, arguments);
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
if (!util.global) {
|
||||||
|
return function() {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return function(name) {
|
||||||
|
var methodName = "on" + name.toLowerCase();
|
||||||
|
var method = util.global[methodName];
|
||||||
|
if (!method) return false;
|
||||||
|
method.apply(util.global, [].slice.call(arguments, 1));
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
||||||
|
function generatePromiseLifecycleEventObject(name, promise) {
|
||||||
|
return {promise: promise};
|
||||||
|
}
|
||||||
|
|
||||||
|
var eventToObjectGenerator = {
|
||||||
|
promiseCreated: generatePromiseLifecycleEventObject,
|
||||||
|
promiseFulfilled: generatePromiseLifecycleEventObject,
|
||||||
|
promiseRejected: generatePromiseLifecycleEventObject,
|
||||||
|
promiseResolved: generatePromiseLifecycleEventObject,
|
||||||
|
promiseCancelled: generatePromiseLifecycleEventObject,
|
||||||
|
promiseChained: function(name, promise, child) {
|
||||||
|
return {promise: promise, child: child};
|
||||||
|
},
|
||||||
|
warning: function(name, warning) {
|
||||||
|
return {warning: warning};
|
||||||
|
},
|
||||||
|
unhandledRejection: function (name, reason, promise) {
|
||||||
|
return {reason: reason, promise: promise};
|
||||||
|
},
|
||||||
|
rejectionHandled: generatePromiseLifecycleEventObject
|
||||||
|
};
|
||||||
|
|
||||||
|
var activeFireEvent = function (name) {
|
||||||
|
var globalEventFired = false;
|
||||||
|
try {
|
||||||
|
globalEventFired = fireGlobalEvent.apply(null, arguments);
|
||||||
|
} catch (e) {
|
||||||
|
async.throwLater(e);
|
||||||
|
globalEventFired = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
var domEventFired = false;
|
||||||
|
try {
|
||||||
|
domEventFired = fireDomEvent(name,
|
||||||
|
eventToObjectGenerator[name].apply(null, arguments));
|
||||||
|
} catch (e) {
|
||||||
|
async.throwLater(e);
|
||||||
|
domEventFired = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return domEventFired || globalEventFired;
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.config = function(opts) {
|
||||||
|
opts = Object(opts);
|
||||||
|
if ("longStackTraces" in opts) {
|
||||||
|
if (opts.longStackTraces) {
|
||||||
|
Promise.longStackTraces();
|
||||||
|
} else if (!opts.longStackTraces && Promise.hasLongStackTraces()) {
|
||||||
|
disableLongStackTraces();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ("warnings" in opts) {
|
||||||
|
var warningsOption = opts.warnings;
|
||||||
|
config.warnings = !!warningsOption;
|
||||||
|
wForgottenReturn = config.warnings;
|
||||||
|
|
||||||
|
if (util.isObject(warningsOption)) {
|
||||||
|
if ("wForgottenReturn" in warningsOption) {
|
||||||
|
wForgottenReturn = !!warningsOption.wForgottenReturn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ("cancellation" in opts && opts.cancellation && !config.cancellation) {
|
||||||
|
if (async.haveItemsQueued()) {
|
||||||
|
throw new Error(
|
||||||
|
"cannot enable cancellation after promises are in use");
|
||||||
|
}
|
||||||
|
Promise.prototype._clearCancellationData =
|
||||||
|
cancellationClearCancellationData;
|
||||||
|
Promise.prototype._propagateFrom = cancellationPropagateFrom;
|
||||||
|
Promise.prototype._onCancel = cancellationOnCancel;
|
||||||
|
Promise.prototype._setOnCancel = cancellationSetOnCancel;
|
||||||
|
Promise.prototype._attachCancellationCallback =
|
||||||
|
cancellationAttachCancellationCallback;
|
||||||
|
Promise.prototype._execute = cancellationExecute;
|
||||||
|
propagateFromFunction = cancellationPropagateFrom;
|
||||||
|
config.cancellation = true;
|
||||||
|
}
|
||||||
|
if ("monitoring" in opts) {
|
||||||
|
if (opts.monitoring && !config.monitoring) {
|
||||||
|
config.monitoring = true;
|
||||||
|
Promise.prototype._fireEvent = activeFireEvent;
|
||||||
|
} else if (!opts.monitoring && config.monitoring) {
|
||||||
|
config.monitoring = false;
|
||||||
|
Promise.prototype._fireEvent = defaultFireEvent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Promise;
|
||||||
|
};
|
||||||
|
|
||||||
|
function defaultFireEvent() { return false; }
|
||||||
|
|
||||||
|
Promise.prototype._fireEvent = defaultFireEvent;
|
||||||
|
Promise.prototype._execute = function(executor, resolve, reject) {
|
||||||
|
try {
|
||||||
|
executor(resolve, reject);
|
||||||
|
} catch (e) {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Promise.prototype._onCancel = function () {};
|
||||||
|
Promise.prototype._setOnCancel = function (handler) { ; };
|
||||||
|
Promise.prototype._attachCancellationCallback = function(onCancel) {
|
||||||
|
;
|
||||||
|
};
|
||||||
|
Promise.prototype._captureStackTrace = function () {};
|
||||||
|
Promise.prototype._attachExtraTrace = function () {};
|
||||||
|
Promise.prototype._dereferenceTrace = function () {};
|
||||||
|
Promise.prototype._clearCancellationData = function() {};
|
||||||
|
Promise.prototype._propagateFrom = function (parent, flags) {
|
||||||
|
;
|
||||||
|
;
|
||||||
|
};
|
||||||
|
|
||||||
|
function cancellationExecute(executor, resolve, reject) {
|
||||||
|
var promise = this;
|
||||||
|
try {
|
||||||
|
executor(resolve, reject, function(onCancel) {
|
||||||
|
if (typeof onCancel !== "function") {
|
||||||
|
throw new TypeError("onCancel must be a function, got: " +
|
||||||
|
util.toString(onCancel));
|
||||||
|
}
|
||||||
|
promise._attachCancellationCallback(onCancel);
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function cancellationAttachCancellationCallback(onCancel) {
|
||||||
|
if (!this._isCancellable()) return this;
|
||||||
|
|
||||||
|
var previousOnCancel = this._onCancel();
|
||||||
|
if (previousOnCancel !== undefined) {
|
||||||
|
if (util.isArray(previousOnCancel)) {
|
||||||
|
previousOnCancel.push(onCancel);
|
||||||
|
} else {
|
||||||
|
this._setOnCancel([previousOnCancel, onCancel]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this._setOnCancel(onCancel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function cancellationOnCancel() {
|
||||||
|
return this._onCancelField;
|
||||||
|
}
|
||||||
|
|
||||||
|
function cancellationSetOnCancel(onCancel) {
|
||||||
|
this._onCancelField = onCancel;
|
||||||
|
}
|
||||||
|
|
||||||
|
function cancellationClearCancellationData() {
|
||||||
|
this._cancellationParent = undefined;
|
||||||
|
this._onCancelField = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
function cancellationPropagateFrom(parent, flags) {
|
||||||
|
if ((flags & 1) !== 0) {
|
||||||
|
this._cancellationParent = parent;
|
||||||
|
var branchesRemainingToCancel = parent._branchesRemainingToCancel;
|
||||||
|
if (branchesRemainingToCancel === undefined) {
|
||||||
|
branchesRemainingToCancel = 0;
|
||||||
|
}
|
||||||
|
parent._branchesRemainingToCancel = branchesRemainingToCancel + 1;
|
||||||
|
}
|
||||||
|
if ((flags & 2) !== 0 && parent._isBound()) {
|
||||||
|
this._setBoundTo(parent._boundTo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function bindingPropagateFrom(parent, flags) {
|
||||||
|
if ((flags & 2) !== 0 && parent._isBound()) {
|
||||||
|
this._setBoundTo(parent._boundTo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var propagateFromFunction = bindingPropagateFrom;
|
||||||
|
|
||||||
|
function boundValueFunction() {
|
||||||
|
var ret = this._boundTo;
|
||||||
|
if (ret !== undefined) {
|
||||||
|
if (ret instanceof Promise) {
|
||||||
|
if (ret.isFulfilled()) {
|
||||||
|
return ret.value();
|
||||||
|
} else {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function longStackTracesCaptureStackTrace() {
|
||||||
|
this._trace = new CapturedTrace(this._peekContext());
|
||||||
|
}
|
||||||
|
|
||||||
|
function longStackTracesAttachExtraTrace(error, ignoreSelf) {
|
||||||
|
if (canAttachTrace(error)) {
|
||||||
|
var trace = this._trace;
|
||||||
|
if (trace !== undefined) {
|
||||||
|
if (ignoreSelf) trace = trace._parent;
|
||||||
|
}
|
||||||
|
if (trace !== undefined) {
|
||||||
|
trace.attachExtraTrace(error);
|
||||||
|
} else if (!error.__stackCleaned__) {
|
||||||
|
var parsed = parseStackAndMessage(error);
|
||||||
|
util.notEnumerableProp(error, "stack",
|
||||||
|
parsed.message + "\n" + parsed.stack.join("\n"));
|
||||||
|
util.notEnumerableProp(error, "__stackCleaned__", true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function longStackTracesDereferenceTrace() {
|
||||||
|
this._trace = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkForgottenReturns(returnValue, promiseCreated, name, promise,
|
||||||
|
parent) {
|
||||||
|
if (returnValue === undefined && promiseCreated !== null &&
|
||||||
|
wForgottenReturn) {
|
||||||
|
if (parent !== undefined && parent._returnedNonUndefined()) return;
|
||||||
|
if ((promise._bitField & 65535) === 0) return;
|
||||||
|
|
||||||
|
if (name) name = name + " ";
|
||||||
|
var handlerLine = "";
|
||||||
|
var creatorLine = "";
|
||||||
|
if (promiseCreated._trace) {
|
||||||
|
var traceLines = promiseCreated._trace.stack.split("\n");
|
||||||
|
var stack = cleanStack(traceLines);
|
||||||
|
for (var i = stack.length - 1; i >= 0; --i) {
|
||||||
|
var line = stack[i];
|
||||||
|
if (!nodeFramePattern.test(line)) {
|
||||||
|
var lineMatches = line.match(parseLinePattern);
|
||||||
|
if (lineMatches) {
|
||||||
|
handlerLine = "at " + lineMatches[1] +
|
||||||
|
":" + lineMatches[2] + ":" + lineMatches[3] + " ";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stack.length > 0) {
|
||||||
|
var firstUserLine = stack[0];
|
||||||
|
for (var i = 0; i < traceLines.length; ++i) {
|
||||||
|
|
||||||
|
if (traceLines[i] === firstUserLine) {
|
||||||
|
if (i > 0) {
|
||||||
|
creatorLine = "\n" + traceLines[i - 1];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var msg = "a promise was created in a " + name +
|
||||||
|
"handler " + handlerLine + "but was not returned from it, " +
|
||||||
|
"see http://goo.gl/rRqMUw" +
|
||||||
|
creatorLine;
|
||||||
|
promise._warn(msg, true, promiseCreated);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function deprecated(name, replacement) {
|
||||||
|
var message = name +
|
||||||
|
" is deprecated and will be removed in a future version.";
|
||||||
|
if (replacement) message += " Use " + replacement + " instead.";
|
||||||
|
return warn(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
function warn(message, shouldUseOwnTrace, promise) {
|
||||||
|
if (!config.warnings) return;
|
||||||
|
var warning = new Warning(message);
|
||||||
|
var ctx;
|
||||||
|
if (shouldUseOwnTrace) {
|
||||||
|
promise._attachExtraTrace(warning);
|
||||||
|
} else if (config.longStackTraces && (ctx = Promise._peekContext())) {
|
||||||
|
ctx.attachExtraTrace(warning);
|
||||||
|
} else {
|
||||||
|
var parsed = parseStackAndMessage(warning);
|
||||||
|
warning.stack = parsed.message + "\n" + parsed.stack.join("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!activeFireEvent("warning", warning)) {
|
||||||
|
formatAndLogError(warning, "", true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function reconstructStack(message, stacks) {
|
||||||
|
for (var i = 0; i < stacks.length - 1; ++i) {
|
||||||
|
stacks[i].push("From previous event:");
|
||||||
|
stacks[i] = stacks[i].join("\n");
|
||||||
|
}
|
||||||
|
if (i < stacks.length) {
|
||||||
|
stacks[i] = stacks[i].join("\n");
|
||||||
|
}
|
||||||
|
return message + "\n" + stacks.join("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeDuplicateOrEmptyJumps(stacks) {
|
||||||
|
for (var i = 0; i < stacks.length; ++i) {
|
||||||
|
if (stacks[i].length === 0 ||
|
||||||
|
((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) {
|
||||||
|
stacks.splice(i, 1);
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeCommonRoots(stacks) {
|
||||||
|
var current = stacks[0];
|
||||||
|
for (var i = 1; i < stacks.length; ++i) {
|
||||||
|
var prev = stacks[i];
|
||||||
|
var currentLastIndex = current.length - 1;
|
||||||
|
var currentLastLine = current[currentLastIndex];
|
||||||
|
var commonRootMeetPoint = -1;
|
||||||
|
|
||||||
|
for (var j = prev.length - 1; j >= 0; --j) {
|
||||||
|
if (prev[j] === currentLastLine) {
|
||||||
|
commonRootMeetPoint = j;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var j = commonRootMeetPoint; j >= 0; --j) {
|
||||||
|
var line = prev[j];
|
||||||
|
if (current[currentLastIndex] === line) {
|
||||||
|
current.pop();
|
||||||
|
currentLastIndex--;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
current = prev;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function cleanStack(stack) {
|
||||||
|
var ret = [];
|
||||||
|
for (var i = 0; i < stack.length; ++i) {
|
||||||
|
var line = stack[i];
|
||||||
|
var isTraceLine = " (No stack trace)" === line ||
|
||||||
|
stackFramePattern.test(line);
|
||||||
|
var isInternalFrame = isTraceLine && shouldIgnore(line);
|
||||||
|
if (isTraceLine && !isInternalFrame) {
|
||||||
|
if (indentStackFrames && line.charAt(0) !== " ") {
|
||||||
|
line = " " + line;
|
||||||
|
}
|
||||||
|
ret.push(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function stackFramesAsArray(error) {
|
||||||
|
var stack = error.stack.replace(/\s+$/g, "").split("\n");
|
||||||
|
for (var i = 0; i < stack.length; ++i) {
|
||||||
|
var line = stack[i];
|
||||||
|
if (" (No stack trace)" === line || stackFramePattern.test(line)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (i > 0 && error.name != "SyntaxError") {
|
||||||
|
stack = stack.slice(i);
|
||||||
|
}
|
||||||
|
return stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseStackAndMessage(error) {
|
||||||
|
var stack = error.stack;
|
||||||
|
var message = error.toString();
|
||||||
|
stack = typeof stack === "string" && stack.length > 0
|
||||||
|
? stackFramesAsArray(error) : [" (No stack trace)"];
|
||||||
|
return {
|
||||||
|
message: message,
|
||||||
|
stack: error.name == "SyntaxError" ? stack : cleanStack(stack)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatAndLogError(error, title, isSoft) {
|
||||||
|
if (typeof console !== "undefined") {
|
||||||
|
var message;
|
||||||
|
if (util.isObject(error)) {
|
||||||
|
var stack = error.stack;
|
||||||
|
message = title + formatStack(stack, error);
|
||||||
|
} else {
|
||||||
|
message = title + String(error);
|
||||||
|
}
|
||||||
|
if (typeof printWarning === "function") {
|
||||||
|
printWarning(message, isSoft);
|
||||||
|
} else if (typeof console.log === "function" ||
|
||||||
|
typeof console.log === "object") {
|
||||||
|
console.log(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function fireRejectionEvent(name, localHandler, reason, promise) {
|
||||||
|
var localEventFired = false;
|
||||||
|
try {
|
||||||
|
if (typeof localHandler === "function") {
|
||||||
|
localEventFired = true;
|
||||||
|
if (name === "rejectionHandled") {
|
||||||
|
localHandler(promise);
|
||||||
|
} else {
|
||||||
|
localHandler(reason, promise);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
async.throwLater(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name === "unhandledRejection") {
|
||||||
|
if (!activeFireEvent(name, reason, promise) && !localEventFired) {
|
||||||
|
formatAndLogError(reason, "Unhandled rejection ");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
activeFireEvent(name, promise);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatNonError(obj) {
|
||||||
|
var str;
|
||||||
|
if (typeof obj === "function") {
|
||||||
|
str = "[function " +
|
||||||
|
(obj.name || "anonymous") +
|
||||||
|
"]";
|
||||||
|
} else {
|
||||||
|
str = obj && typeof obj.toString === "function"
|
||||||
|
? obj.toString() : util.toString(obj);
|
||||||
|
var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/;
|
||||||
|
if (ruselessToString.test(str)) {
|
||||||
|
try {
|
||||||
|
var newStr = JSON.stringify(obj);
|
||||||
|
str = newStr;
|
||||||
|
}
|
||||||
|
catch(e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (str.length === 0) {
|
||||||
|
str = "(empty array)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ("(<" + snip(str) + ">, no stack trace)");
|
||||||
|
}
|
||||||
|
|
||||||
|
function snip(str) {
|
||||||
|
var maxChars = 41;
|
||||||
|
if (str.length < maxChars) {
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
return str.substr(0, maxChars - 3) + "...";
|
||||||
|
}
|
||||||
|
|
||||||
|
function longStackTracesIsSupported() {
|
||||||
|
return typeof captureStackTrace === "function";
|
||||||
|
}
|
||||||
|
|
||||||
|
var shouldIgnore = function() { return false; };
|
||||||
|
var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;
|
||||||
|
function parseLineInfo(line) {
|
||||||
|
var matches = line.match(parseLineInfoRegex);
|
||||||
|
if (matches) {
|
||||||
|
return {
|
||||||
|
fileName: matches[1],
|
||||||
|
line: parseInt(matches[2], 10)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setBounds(firstLineError, lastLineError) {
|
||||||
|
if (!longStackTracesIsSupported()) return;
|
||||||
|
var firstStackLines = firstLineError.stack.split("\n");
|
||||||
|
var lastStackLines = lastLineError.stack.split("\n");
|
||||||
|
var firstIndex = -1;
|
||||||
|
var lastIndex = -1;
|
||||||
|
var firstFileName;
|
||||||
|
var lastFileName;
|
||||||
|
for (var i = 0; i < firstStackLines.length; ++i) {
|
||||||
|
var result = parseLineInfo(firstStackLines[i]);
|
||||||
|
if (result) {
|
||||||
|
firstFileName = result.fileName;
|
||||||
|
firstIndex = result.line;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (var i = 0; i < lastStackLines.length; ++i) {
|
||||||
|
var result = parseLineInfo(lastStackLines[i]);
|
||||||
|
if (result) {
|
||||||
|
lastFileName = result.fileName;
|
||||||
|
lastIndex = result.line;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName ||
|
||||||
|
firstFileName !== lastFileName || firstIndex >= lastIndex) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
shouldIgnore = function(line) {
|
||||||
|
if (bluebirdFramePattern.test(line)) return true;
|
||||||
|
var info = parseLineInfo(line);
|
||||||
|
if (info) {
|
||||||
|
if (info.fileName === firstFileName &&
|
||||||
|
(firstIndex <= info.line && info.line <= lastIndex)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function CapturedTrace(parent) {
|
||||||
|
this._parent = parent;
|
||||||
|
this._promisesCreated = 0;
|
||||||
|
var length = this._length = 1 + (parent === undefined ? 0 : parent._length);
|
||||||
|
captureStackTrace(this, CapturedTrace);
|
||||||
|
if (length > 32) this.uncycle();
|
||||||
|
}
|
||||||
|
util.inherits(CapturedTrace, Error);
|
||||||
|
Context.CapturedTrace = CapturedTrace;
|
||||||
|
|
||||||
|
CapturedTrace.prototype.uncycle = function() {
|
||||||
|
var length = this._length;
|
||||||
|
if (length < 2) return;
|
||||||
|
var nodes = [];
|
||||||
|
var stackToIndex = {};
|
||||||
|
|
||||||
|
for (var i = 0, node = this; node !== undefined; ++i) {
|
||||||
|
nodes.push(node);
|
||||||
|
node = node._parent;
|
||||||
|
}
|
||||||
|
length = this._length = i;
|
||||||
|
for (var i = length - 1; i >= 0; --i) {
|
||||||
|
var stack = nodes[i].stack;
|
||||||
|
if (stackToIndex[stack] === undefined) {
|
||||||
|
stackToIndex[stack] = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (var i = 0; i < length; ++i) {
|
||||||
|
var currentStack = nodes[i].stack;
|
||||||
|
var index = stackToIndex[currentStack];
|
||||||
|
if (index !== undefined && index !== i) {
|
||||||
|
if (index > 0) {
|
||||||
|
nodes[index - 1]._parent = undefined;
|
||||||
|
nodes[index - 1]._length = 1;
|
||||||
|
}
|
||||||
|
nodes[i]._parent = undefined;
|
||||||
|
nodes[i]._length = 1;
|
||||||
|
var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;
|
||||||
|
|
||||||
|
if (index < length - 1) {
|
||||||
|
cycleEdgeNode._parent = nodes[index + 1];
|
||||||
|
cycleEdgeNode._parent.uncycle();
|
||||||
|
cycleEdgeNode._length =
|
||||||
|
cycleEdgeNode._parent._length + 1;
|
||||||
|
} else {
|
||||||
|
cycleEdgeNode._parent = undefined;
|
||||||
|
cycleEdgeNode._length = 1;
|
||||||
|
}
|
||||||
|
var currentChildLength = cycleEdgeNode._length + 1;
|
||||||
|
for (var j = i - 2; j >= 0; --j) {
|
||||||
|
nodes[j]._length = currentChildLength;
|
||||||
|
currentChildLength++;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
CapturedTrace.prototype.attachExtraTrace = function(error) {
|
||||||
|
if (error.__stackCleaned__) return;
|
||||||
|
this.uncycle();
|
||||||
|
var parsed = parseStackAndMessage(error);
|
||||||
|
var message = parsed.message;
|
||||||
|
var stacks = [parsed.stack];
|
||||||
|
|
||||||
|
var trace = this;
|
||||||
|
while (trace !== undefined) {
|
||||||
|
stacks.push(cleanStack(trace.stack.split("\n")));
|
||||||
|
trace = trace._parent;
|
||||||
|
}
|
||||||
|
removeCommonRoots(stacks);
|
||||||
|
removeDuplicateOrEmptyJumps(stacks);
|
||||||
|
util.notEnumerableProp(error, "stack", reconstructStack(message, stacks));
|
||||||
|
util.notEnumerableProp(error, "__stackCleaned__", true);
|
||||||
|
};
|
||||||
|
|
||||||
|
var captureStackTrace = (function stackDetection() {
|
||||||
|
var v8stackFramePattern = /^\s*at\s*/;
|
||||||
|
var v8stackFormatter = function(stack, error) {
|
||||||
|
if (typeof stack === "string") return stack;
|
||||||
|
|
||||||
|
if (error.name !== undefined &&
|
||||||
|
error.message !== undefined) {
|
||||||
|
return error.toString();
|
||||||
|
}
|
||||||
|
return formatNonError(error);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof Error.stackTraceLimit === "number" &&
|
||||||
|
typeof Error.captureStackTrace === "function") {
|
||||||
|
Error.stackTraceLimit += 6;
|
||||||
|
stackFramePattern = v8stackFramePattern;
|
||||||
|
formatStack = v8stackFormatter;
|
||||||
|
var captureStackTrace = Error.captureStackTrace;
|
||||||
|
|
||||||
|
shouldIgnore = function(line) {
|
||||||
|
return bluebirdFramePattern.test(line);
|
||||||
|
};
|
||||||
|
return function(receiver, ignoreUntil) {
|
||||||
|
Error.stackTraceLimit += 6;
|
||||||
|
captureStackTrace(receiver, ignoreUntil);
|
||||||
|
Error.stackTraceLimit -= 6;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
var err = new Error();
|
||||||
|
|
||||||
|
if (typeof err.stack === "string" &&
|
||||||
|
err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) {
|
||||||
|
stackFramePattern = /@/;
|
||||||
|
formatStack = v8stackFormatter;
|
||||||
|
indentStackFrames = true;
|
||||||
|
return function captureStackTrace(o) {
|
||||||
|
o.stack = new Error().stack;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var hasStackAfterThrow;
|
||||||
|
try { throw new Error(); }
|
||||||
|
catch(e) {
|
||||||
|
hasStackAfterThrow = ("stack" in e);
|
||||||
|
}
|
||||||
|
if (!("stack" in err) && hasStackAfterThrow &&
|
||||||
|
typeof Error.stackTraceLimit === "number") {
|
||||||
|
stackFramePattern = v8stackFramePattern;
|
||||||
|
formatStack = v8stackFormatter;
|
||||||
|
return function captureStackTrace(o) {
|
||||||
|
Error.stackTraceLimit += 6;
|
||||||
|
try { throw new Error(); }
|
||||||
|
catch(e) { o.stack = e.stack; }
|
||||||
|
Error.stackTraceLimit -= 6;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
formatStack = function(stack, error) {
|
||||||
|
if (typeof stack === "string") return stack;
|
||||||
|
|
||||||
|
if ((typeof error === "object" ||
|
||||||
|
typeof error === "function") &&
|
||||||
|
error.name !== undefined &&
|
||||||
|
error.message !== undefined) {
|
||||||
|
return error.toString();
|
||||||
|
}
|
||||||
|
return formatNonError(error);
|
||||||
|
};
|
||||||
|
|
||||||
|
return null;
|
||||||
|
|
||||||
|
})([]);
|
||||||
|
|
||||||
|
if (typeof console !== "undefined" && typeof console.warn !== "undefined") {
|
||||||
|
printWarning = function (message) {
|
||||||
|
console.warn(message);
|
||||||
|
};
|
||||||
|
if (util.isNode && process.stderr.isTTY) {
|
||||||
|
printWarning = function(message, isSoft) {
|
||||||
|
var color = isSoft ? "\u001b[33m" : "\u001b[31m";
|
||||||
|
console.warn(color + message + "\u001b[0m\n");
|
||||||
|
};
|
||||||
|
} else if (!util.isNode && typeof (new Error().stack) === "string") {
|
||||||
|
printWarning = function(message, isSoft) {
|
||||||
|
console.warn("%c" + message,
|
||||||
|
isSoft ? "color: darkorange" : "color: red");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
warnings: warnings,
|
||||||
|
longStackTraces: false,
|
||||||
|
cancellation: false,
|
||||||
|
monitoring: false
|
||||||
|
};
|
||||||
|
|
||||||
|
if (longStackTraces) Promise.longStackTraces();
|
||||||
|
|
||||||
|
return {
|
||||||
|
longStackTraces: function() {
|
||||||
|
return config.longStackTraces;
|
||||||
|
},
|
||||||
|
warnings: function() {
|
||||||
|
return config.warnings;
|
||||||
|
},
|
||||||
|
cancellation: function() {
|
||||||
|
return config.cancellation;
|
||||||
|
},
|
||||||
|
monitoring: function() {
|
||||||
|
return config.monitoring;
|
||||||
|
},
|
||||||
|
propagateFromFunction: function() {
|
||||||
|
return propagateFromFunction;
|
||||||
|
},
|
||||||
|
boundValueFunction: function() {
|
||||||
|
return boundValueFunction;
|
||||||
|
},
|
||||||
|
checkForgottenReturns: checkForgottenReturns,
|
||||||
|
setBounds: setBounds,
|
||||||
|
warn: warn,
|
||||||
|
deprecated: deprecated,
|
||||||
|
CapturedTrace: CapturedTrace,
|
||||||
|
fireDomEvent: fireDomEvent,
|
||||||
|
fireGlobalEvent: fireGlobalEvent
|
||||||
|
};
|
||||||
|
};
|
46
express-server/node_modules/bluebird/js/release/direct_resolve.js
generated
vendored
Normal file
46
express-server/node_modules/bluebird/js/release/direct_resolve.js
generated
vendored
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
"use strict";
|
||||||
|
module.exports = function(Promise) {
|
||||||
|
function returner() {
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
function thrower() {
|
||||||
|
throw this.reason;
|
||||||
|
}
|
||||||
|
|
||||||
|
Promise.prototype["return"] =
|
||||||
|
Promise.prototype.thenReturn = function (value) {
|
||||||
|
if (value instanceof Promise) value.suppressUnhandledRejections();
|
||||||
|
return this._then(
|
||||||
|
returner, undefined, undefined, {value: value}, undefined);
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype["throw"] =
|
||||||
|
Promise.prototype.thenThrow = function (reason) {
|
||||||
|
return this._then(
|
||||||
|
thrower, undefined, undefined, {reason: reason}, undefined);
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype.catchThrow = function (reason) {
|
||||||
|
if (arguments.length <= 1) {
|
||||||
|
return this._then(
|
||||||
|
undefined, thrower, undefined, {reason: reason}, undefined);
|
||||||
|
} else {
|
||||||
|
var _reason = arguments[1];
|
||||||
|
var handler = function() {throw _reason;};
|
||||||
|
return this.caught(reason, handler);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype.catchReturn = function (value) {
|
||||||
|
if (arguments.length <= 1) {
|
||||||
|
if (value instanceof Promise) value.suppressUnhandledRejections();
|
||||||
|
return this._then(
|
||||||
|
undefined, returner, undefined, {value: value}, undefined);
|
||||||
|
} else {
|
||||||
|
var _value = arguments[1];
|
||||||
|
if (_value instanceof Promise) _value.suppressUnhandledRejections();
|
||||||
|
var handler = function() {return _value;};
|
||||||
|
return this.caught(value, handler);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
30
express-server/node_modules/bluebird/js/release/each.js
generated
vendored
Normal file
30
express-server/node_modules/bluebird/js/release/each.js
generated
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
"use strict";
|
||||||
|
module.exports = function(Promise, INTERNAL) {
|
||||||
|
var PromiseReduce = Promise.reduce;
|
||||||
|
var PromiseAll = Promise.all;
|
||||||
|
|
||||||
|
function promiseAllThis() {
|
||||||
|
return PromiseAll(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
function PromiseMapSeries(promises, fn) {
|
||||||
|
return PromiseReduce(promises, fn, INTERNAL, INTERNAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
Promise.prototype.each = function (fn) {
|
||||||
|
return PromiseReduce(this, fn, INTERNAL, 0)
|
||||||
|
._then(promiseAllThis, undefined, undefined, this, undefined);
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype.mapSeries = function (fn) {
|
||||||
|
return PromiseReduce(this, fn, INTERNAL, INTERNAL);
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.each = function (promises, fn) {
|
||||||
|
return PromiseReduce(promises, fn, INTERNAL, 0)
|
||||||
|
._then(promiseAllThis, undefined, undefined, promises, undefined);
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.mapSeries = PromiseMapSeries;
|
||||||
|
};
|
||||||
|
|
116
express-server/node_modules/bluebird/js/release/errors.js
generated
vendored
Normal file
116
express-server/node_modules/bluebird/js/release/errors.js
generated
vendored
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
"use strict";
|
||||||
|
var es5 = require("./es5");
|
||||||
|
var Objectfreeze = es5.freeze;
|
||||||
|
var util = require("./util");
|
||||||
|
var inherits = util.inherits;
|
||||||
|
var notEnumerableProp = util.notEnumerableProp;
|
||||||
|
|
||||||
|
function subError(nameProperty, defaultMessage) {
|
||||||
|
function SubError(message) {
|
||||||
|
if (!(this instanceof SubError)) return new SubError(message);
|
||||||
|
notEnumerableProp(this, "message",
|
||||||
|
typeof message === "string" ? message : defaultMessage);
|
||||||
|
notEnumerableProp(this, "name", nameProperty);
|
||||||
|
if (Error.captureStackTrace) {
|
||||||
|
Error.captureStackTrace(this, this.constructor);
|
||||||
|
} else {
|
||||||
|
Error.call(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inherits(SubError, Error);
|
||||||
|
return SubError;
|
||||||
|
}
|
||||||
|
|
||||||
|
var _TypeError, _RangeError;
|
||||||
|
var Warning = subError("Warning", "warning");
|
||||||
|
var CancellationError = subError("CancellationError", "cancellation error");
|
||||||
|
var TimeoutError = subError("TimeoutError", "timeout error");
|
||||||
|
var AggregateError = subError("AggregateError", "aggregate error");
|
||||||
|
try {
|
||||||
|
_TypeError = TypeError;
|
||||||
|
_RangeError = RangeError;
|
||||||
|
} catch(e) {
|
||||||
|
_TypeError = subError("TypeError", "type error");
|
||||||
|
_RangeError = subError("RangeError", "range error");
|
||||||
|
}
|
||||||
|
|
||||||
|
var methods = ("join pop push shift unshift slice filter forEach some " +
|
||||||
|
"every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" ");
|
||||||
|
|
||||||
|
for (var i = 0; i < methods.length; ++i) {
|
||||||
|
if (typeof Array.prototype[methods[i]] === "function") {
|
||||||
|
AggregateError.prototype[methods[i]] = Array.prototype[methods[i]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
es5.defineProperty(AggregateError.prototype, "length", {
|
||||||
|
value: 0,
|
||||||
|
configurable: false,
|
||||||
|
writable: true,
|
||||||
|
enumerable: true
|
||||||
|
});
|
||||||
|
AggregateError.prototype["isOperational"] = true;
|
||||||
|
var level = 0;
|
||||||
|
AggregateError.prototype.toString = function() {
|
||||||
|
var indent = Array(level * 4 + 1).join(" ");
|
||||||
|
var ret = "\n" + indent + "AggregateError of:" + "\n";
|
||||||
|
level++;
|
||||||
|
indent = Array(level * 4 + 1).join(" ");
|
||||||
|
for (var i = 0; i < this.length; ++i) {
|
||||||
|
var str = this[i] === this ? "[Circular AggregateError]" : this[i] + "";
|
||||||
|
var lines = str.split("\n");
|
||||||
|
for (var j = 0; j < lines.length; ++j) {
|
||||||
|
lines[j] = indent + lines[j];
|
||||||
|
}
|
||||||
|
str = lines.join("\n");
|
||||||
|
ret += str + "\n";
|
||||||
|
}
|
||||||
|
level--;
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
function OperationalError(message) {
|
||||||
|
if (!(this instanceof OperationalError))
|
||||||
|
return new OperationalError(message);
|
||||||
|
notEnumerableProp(this, "name", "OperationalError");
|
||||||
|
notEnumerableProp(this, "message", message);
|
||||||
|
this.cause = message;
|
||||||
|
this["isOperational"] = true;
|
||||||
|
|
||||||
|
if (message instanceof Error) {
|
||||||
|
notEnumerableProp(this, "message", message.message);
|
||||||
|
notEnumerableProp(this, "stack", message.stack);
|
||||||
|
} else if (Error.captureStackTrace) {
|
||||||
|
Error.captureStackTrace(this, this.constructor);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
inherits(OperationalError, Error);
|
||||||
|
|
||||||
|
var errorTypes = Error["__BluebirdErrorTypes__"];
|
||||||
|
if (!errorTypes) {
|
||||||
|
errorTypes = Objectfreeze({
|
||||||
|
CancellationError: CancellationError,
|
||||||
|
TimeoutError: TimeoutError,
|
||||||
|
OperationalError: OperationalError,
|
||||||
|
RejectionError: OperationalError,
|
||||||
|
AggregateError: AggregateError
|
||||||
|
});
|
||||||
|
es5.defineProperty(Error, "__BluebirdErrorTypes__", {
|
||||||
|
value: errorTypes,
|
||||||
|
writable: false,
|
||||||
|
enumerable: false,
|
||||||
|
configurable: false
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
Error: Error,
|
||||||
|
TypeError: _TypeError,
|
||||||
|
RangeError: _RangeError,
|
||||||
|
CancellationError: errorTypes.CancellationError,
|
||||||
|
OperationalError: errorTypes.OperationalError,
|
||||||
|
TimeoutError: errorTypes.TimeoutError,
|
||||||
|
AggregateError: errorTypes.AggregateError,
|
||||||
|
Warning: Warning
|
||||||
|
};
|
80
express-server/node_modules/bluebird/js/release/es5.js
generated
vendored
Normal file
80
express-server/node_modules/bluebird/js/release/es5.js
generated
vendored
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
var isES5 = (function(){
|
||||||
|
"use strict";
|
||||||
|
return this === undefined;
|
||||||
|
})();
|
||||||
|
|
||||||
|
if (isES5) {
|
||||||
|
module.exports = {
|
||||||
|
freeze: Object.freeze,
|
||||||
|
defineProperty: Object.defineProperty,
|
||||||
|
getDescriptor: Object.getOwnPropertyDescriptor,
|
||||||
|
keys: Object.keys,
|
||||||
|
names: Object.getOwnPropertyNames,
|
||||||
|
getPrototypeOf: Object.getPrototypeOf,
|
||||||
|
isArray: Array.isArray,
|
||||||
|
isES5: isES5,
|
||||||
|
propertyIsWritable: function(obj, prop) {
|
||||||
|
var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
|
||||||
|
return !!(!descriptor || descriptor.writable || descriptor.set);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
var has = {}.hasOwnProperty;
|
||||||
|
var str = {}.toString;
|
||||||
|
var proto = {}.constructor.prototype;
|
||||||
|
|
||||||
|
var ObjectKeys = function (o) {
|
||||||
|
var ret = [];
|
||||||
|
for (var key in o) {
|
||||||
|
if (has.call(o, key)) {
|
||||||
|
ret.push(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
var ObjectGetDescriptor = function(o, key) {
|
||||||
|
return {value: o[key]};
|
||||||
|
};
|
||||||
|
|
||||||
|
var ObjectDefineProperty = function (o, key, desc) {
|
||||||
|
o[key] = desc.value;
|
||||||
|
return o;
|
||||||
|
};
|
||||||
|
|
||||||
|
var ObjectFreeze = function (obj) {
|
||||||
|
return obj;
|
||||||
|
};
|
||||||
|
|
||||||
|
var ObjectGetPrototypeOf = function (obj) {
|
||||||
|
try {
|
||||||
|
return Object(obj).constructor.prototype;
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
return proto;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var ArrayIsArray = function (obj) {
|
||||||
|
try {
|
||||||
|
return str.call(obj) === "[object Array]";
|
||||||
|
}
|
||||||
|
catch(e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
isArray: ArrayIsArray,
|
||||||
|
keys: ObjectKeys,
|
||||||
|
names: ObjectKeys,
|
||||||
|
defineProperty: ObjectDefineProperty,
|
||||||
|
getDescriptor: ObjectGetDescriptor,
|
||||||
|
freeze: ObjectFreeze,
|
||||||
|
getPrototypeOf: ObjectGetPrototypeOf,
|
||||||
|
isES5: isES5,
|
||||||
|
propertyIsWritable: function() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
12
express-server/node_modules/bluebird/js/release/filter.js
generated
vendored
Normal file
12
express-server/node_modules/bluebird/js/release/filter.js
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
"use strict";
|
||||||
|
module.exports = function(Promise, INTERNAL) {
|
||||||
|
var PromiseMap = Promise.map;
|
||||||
|
|
||||||
|
Promise.prototype.filter = function (fn, options) {
|
||||||
|
return PromiseMap(this, fn, options, INTERNAL);
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.filter = function (promises, fn, options) {
|
||||||
|
return PromiseMap(promises, fn, options, INTERNAL);
|
||||||
|
};
|
||||||
|
};
|
146
express-server/node_modules/bluebird/js/release/finally.js
generated
vendored
Normal file
146
express-server/node_modules/bluebird/js/release/finally.js
generated
vendored
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
"use strict";
|
||||||
|
module.exports = function(Promise, tryConvertToPromise, NEXT_FILTER) {
|
||||||
|
var util = require("./util");
|
||||||
|
var CancellationError = Promise.CancellationError;
|
||||||
|
var errorObj = util.errorObj;
|
||||||
|
var catchFilter = require("./catch_filter")(NEXT_FILTER);
|
||||||
|
|
||||||
|
function PassThroughHandlerContext(promise, type, handler) {
|
||||||
|
this.promise = promise;
|
||||||
|
this.type = type;
|
||||||
|
this.handler = handler;
|
||||||
|
this.called = false;
|
||||||
|
this.cancelPromise = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
PassThroughHandlerContext.prototype.isFinallyHandler = function() {
|
||||||
|
return this.type === 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
function FinallyHandlerCancelReaction(finallyHandler) {
|
||||||
|
this.finallyHandler = finallyHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
FinallyHandlerCancelReaction.prototype._resultCancelled = function() {
|
||||||
|
checkCancel(this.finallyHandler);
|
||||||
|
};
|
||||||
|
|
||||||
|
function checkCancel(ctx, reason) {
|
||||||
|
if (ctx.cancelPromise != null) {
|
||||||
|
if (arguments.length > 1) {
|
||||||
|
ctx.cancelPromise._reject(reason);
|
||||||
|
} else {
|
||||||
|
ctx.cancelPromise._cancel();
|
||||||
|
}
|
||||||
|
ctx.cancelPromise = null;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function succeed() {
|
||||||
|
return finallyHandler.call(this, this.promise._target()._settledValue());
|
||||||
|
}
|
||||||
|
function fail(reason) {
|
||||||
|
if (checkCancel(this, reason)) return;
|
||||||
|
errorObj.e = reason;
|
||||||
|
return errorObj;
|
||||||
|
}
|
||||||
|
function finallyHandler(reasonOrValue) {
|
||||||
|
var promise = this.promise;
|
||||||
|
var handler = this.handler;
|
||||||
|
|
||||||
|
if (!this.called) {
|
||||||
|
this.called = true;
|
||||||
|
var ret = this.isFinallyHandler()
|
||||||
|
? handler.call(promise._boundValue())
|
||||||
|
: handler.call(promise._boundValue(), reasonOrValue);
|
||||||
|
if (ret === NEXT_FILTER) {
|
||||||
|
return ret;
|
||||||
|
} else if (ret !== undefined) {
|
||||||
|
promise._setReturnedNonUndefined();
|
||||||
|
var maybePromise = tryConvertToPromise(ret, promise);
|
||||||
|
if (maybePromise instanceof Promise) {
|
||||||
|
if (this.cancelPromise != null) {
|
||||||
|
if (maybePromise._isCancelled()) {
|
||||||
|
var reason =
|
||||||
|
new CancellationError("late cancellation observer");
|
||||||
|
promise._attachExtraTrace(reason);
|
||||||
|
errorObj.e = reason;
|
||||||
|
return errorObj;
|
||||||
|
} else if (maybePromise.isPending()) {
|
||||||
|
maybePromise._attachCancellationCallback(
|
||||||
|
new FinallyHandlerCancelReaction(this));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return maybePromise._then(
|
||||||
|
succeed, fail, undefined, this, undefined);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (promise.isRejected()) {
|
||||||
|
checkCancel(this);
|
||||||
|
errorObj.e = reasonOrValue;
|
||||||
|
return errorObj;
|
||||||
|
} else {
|
||||||
|
checkCancel(this);
|
||||||
|
return reasonOrValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Promise.prototype._passThrough = function(handler, type, success, fail) {
|
||||||
|
if (typeof handler !== "function") return this.then();
|
||||||
|
return this._then(success,
|
||||||
|
fail,
|
||||||
|
undefined,
|
||||||
|
new PassThroughHandlerContext(this, type, handler),
|
||||||
|
undefined);
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype.lastly =
|
||||||
|
Promise.prototype["finally"] = function (handler) {
|
||||||
|
return this._passThrough(handler,
|
||||||
|
0,
|
||||||
|
finallyHandler,
|
||||||
|
finallyHandler);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Promise.prototype.tap = function (handler) {
|
||||||
|
return this._passThrough(handler, 1, finallyHandler);
|
||||||
|
};
|
||||||
|
|
||||||
|
Promise.prototype.tapCatch = function (handlerOrPredicate) {
|
||||||
|
var len = arguments.length;
|
||||||
|
if(len === 1) {
|
||||||
|
return this._passThrough(handlerOrPredicate,
|
||||||
|
1,
|
||||||
|
undefined,
|
||||||
|
finallyHandler);
|
||||||
|
} else {
|
||||||
|
var catchInstances = new Array(len - 1),
|
||||||
|
j = 0, i;
|
||||||
|
for (i = 0; i < len - 1; ++i) {
|
||||||
|
var item = arguments[i];
|
||||||
|
if (util.isObject(item)) {
|
||||||
|
catchInstances[j++] = item;
|
||||||
|
} else {
|
||||||
|
return Promise.reject(new TypeError(
|
||||||
|
"tapCatch statement predicate: "
|
||||||
|
+ "expecting an object but got " + util.classString(item)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catchInstances.length = j;
|
||||||
|
var handler = arguments[i];
|
||||||
|
return this._passThrough(catchFilter(catchInstances, handler, this),
|
||||||
|
1,
|
||||||
|
undefined,
|
||||||
|
finallyHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
return PassThroughHandlerContext;
|
||||||
|
};
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user