├── tests ├── client │ ├── .gitignore │ ├── package.json │ ├── readme.md │ ├── index.js │ └── npm-shrinkwrap.json └── test.js ├── .travis.yml ├── package.json ├── readme.md ├── src ├── api.js ├── index.js ├── disco.js └── xmpp.js ├── .gitignore ├── LICENSE └── npm-shrinkwrap.json /tests/client/.gitignore: -------------------------------------------------------------------------------- 1 | secret.js 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: node_js 3 | node_js: 4 | - "stable" 5 | -------------------------------------------------------------------------------- /tests/client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client", 3 | "version": "0.0.2", 4 | "description": "'Test client for XEP-0357'", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "node-xmpp-client": "^3.2.0" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rubdub", 3 | "version": "0.1.1", 4 | "description": "A simple XEP-0357 pubsub reciever", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "test": "tape tests/test.js" 8 | }, 9 | "homepage": "https://github.com/ChatSecure/RubDub", 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/ChatSecure/RubDub.git" 13 | }, 14 | "author": "David Chiles", 15 | "license": "ISC", 16 | "dependencies": { 17 | "commander": "^2.20.1", 18 | "node-xmpp-server": "^2.2.7", 19 | "request": "^2.88.0", 20 | "rollbar": "^2.13.0" 21 | }, 22 | "devDependencies": { 23 | "tape": "^4.11.0" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /tests/client/readme.md: -------------------------------------------------------------------------------- 1 | ## Test client 2 | 3 | The purpose of this is to run an integration test against a running xmpp server with XEP-0357 and a running pubsub node like RubDub. 4 | 5 | ### How it works 6 | 7 | It assumes that the buddies are already created on the xmpp server and are able to send each other messages. 8 | 9 | It sends the push registration stanza for buddy a and then sends a message to that buddy in order to trigger a push. 10 | 11 | ### secret.js 12 | 13 | This file has the credentials for the two buddies 14 | 15 | ```js 16 | module.exports.a = { 17 | 'jid':'a@example.com', 18 | 'password':'a' 19 | }; 20 | 21 | module.exports.b = { 22 | 'jid':'b@example.com', 23 | 'password':'b' 24 | }; 25 | 26 | module.exports.pushServerJID = 'xmpp.example.org'; 27 | 28 | ``` 29 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # RubDub [![Build Status](https://travis-ci.org/ChatSecure/RubDub.svg?branch=master)](https://travis-ci.org/ChatSecure/RubDub) 2 | 3 | A simple XMPP Push Service for [XEP-0357: Push Notifications ](http://xmpp.org/extensions/xep-0357.html). 4 | 5 | ## What does this do? 6 | 7 | Interoperability between XMPP Push Notifications and the ChatSecure app server. 8 | 9 | 1. This has a super simple XMPP server that accepts s2s connections. It only looks for incoming pubsub notifications. 10 | 2. It parses these stanzas and finds the ChatSecure Push token. 11 | 3. It then takes that token and sends `POST` to the [ChatSecure Push Server](https://github.com/ChatSecure/ChatSecure-Push-Server) `/messages` endpoint. 12 | 13 | ## Setup 14 | ```bash 15 | npm install 16 | ``` 17 | 18 | ## Running 19 | 20 | ```bash 21 | node src/index.js -p [PORT] -b [BIND_ADDRESS] -d [DOMAIN] -k [TLS_KEY_PATH] -c [TLS_CERT_PATH] 22 | ``` 23 | -------------------------------------------------------------------------------- /src/api.js: -------------------------------------------------------------------------------- 1 | var request = require('request'); 2 | var url = require('url'); 3 | 4 | var messageJson = function (token, message, priority, cb) { 5 | 6 | if (!token) { 7 | cb(new Error('Needs token')); 8 | return; 9 | } 10 | if (!priority) { 11 | priority = "low"; 12 | } 13 | var result = {'token':token, 'priority': priority}; 14 | if (message) { 15 | result.message = message; 16 | } 17 | cb(null,result); 18 | }; 19 | 20 | module.exports.sendMessage = function (endpoint, token, message, priority, cb) { 21 | 22 | var urlObject = url.parse(endpoint); 23 | if (urlObject.protocol !== 'https:') { 24 | cb(new Error('Requires https')); 25 | return; 26 | } 27 | 28 | messageJson(token,message,priority,function(err,result){ 29 | if (err) { 30 | cb(err); 31 | return; 32 | } 33 | if (result.priority === 'low') { 34 | cb(new Error('Ignoring low priority push')); 35 | return; 36 | } 37 | request.post(endpoint,{ 38 | formData:result, 39 | json:true 40 | },function(err, res, body){ 41 | cb(err,res); 42 | }); 43 | }); 44 | }; 45 | 46 | module.exports.messageJson = messageJson; 47 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | private_keys/ 2 | 3 | #### joe made this: http://goel.io/joe 4 | 5 | #####=== OSX ===##### 6 | .DS_Store 7 | .AppleDouble 8 | .LSOverride 9 | 10 | # Icon must end with two \r 11 | Icon 12 | 13 | 14 | # Thumbnails 15 | ._* 16 | 17 | # Files that might appear on external disk 18 | .Spotlight-V100 19 | .Trashes 20 | 21 | # Directories potentially created on remote AFP share 22 | .AppleDB 23 | .AppleDesktop 24 | Network Trash Folder 25 | Temporary Items 26 | .apdisk 27 | 28 | #####=== Node ===##### 29 | 30 | # Logs 31 | logs 32 | *.log 33 | 34 | # Runtime data 35 | pids 36 | *.pid 37 | *.seed 38 | 39 | # Directory for instrumented libs generated by jscoverage/JSCover 40 | lib-cov 41 | 42 | # Coverage directory used by tools like istanbul 43 | coverage 44 | 45 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 46 | .grunt 47 | 48 | # node-waf configuration 49 | .lock-wscript 50 | 51 | # Compiled binary addons (http://nodejs.org/api/addons.html) 52 | build/Release 53 | 54 | # Dependency directory 55 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- 56 | node_modules 57 | 58 | # Debug log from npm 59 | npm-debug.log 60 | 61 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | var xmpp = require('./xmpp.js'); 2 | var api = require('./api.js'); 3 | var program = require('commander'); 4 | var rollbar = require("rollbar"); 5 | 6 | program 7 | .version('0.1.2') 8 | .option('-p, --port ', 'The server port number. Defaults to 5269.', parseInt) 9 | .option('-b, --bindAddress ', 'The server bind address') 10 | .option('-d, --domainAddress ', 'The server domain') 11 | .option('-k, --keyPath ', 'The path of the TLS key') 12 | .option('-c, --certPath ', 'The path of the TLS certificate') 13 | .option('-r, --rollbar ', 'Optional: The API Token for Rollbar crash reporting') 14 | .parse(process.argv); 15 | 16 | var rollbarKey = program.rollbar; 17 | if (rollbarKey) { 18 | var options = { 19 | // Call process.exit(1) when an uncaught exception occurs but after reporting all 20 | // pending errors to Rollbar. 21 | // 22 | // Default: false 23 | exitOnUncaughtException: true 24 | }; 25 | rollbar.handleUncaughtExceptions(rollbarKey, options); 26 | } 27 | var port = program.port || 5269; 28 | var bindAddress = program.bindAddress; 29 | var domain = program.domainAddress; 30 | var tls = {}; 31 | tls.keyPath = program.keyPath; 32 | tls.certPath = program.certPath; 33 | var options = { 34 | tls:tls 35 | }; 36 | 37 | 38 | 39 | var xServer = new xmpp.xmppServer(); 40 | xServer.setup(port,bindAddress,domain,options); 41 | xServer.on('push',function(pushInfo){ 42 | api.sendMessage(pushInfo.endpoint,pushInfo.token,null,pushInfo.priority,function(err,result){ 43 | 44 | }); 45 | }); 46 | -------------------------------------------------------------------------------- /src/disco.js: -------------------------------------------------------------------------------- 1 | var ltx = require('ltx'); 2 | 3 | module.exports.isDiscoQuery = function(stanza) { 4 | var queryChild = stanza.getChildrenByFilter(function (child){ 5 | // check if it's a disco queryChild 6 | return child.name === 'query' && child.attrs.xmlns === 'http:\/\/jabber.org\/protocol\/disco#info'; 7 | })[0]; 8 | 9 | return (queryChild && stanza.attrs.type === 'get'); 10 | }; 11 | 12 | /** 16 | 17 | 18 | 19 | ... 20 | 21 | 22 | */ 23 | module.exports.discoResponse = function(stanza,cb) { 24 | var fromJID = stanza.attrs.from; 25 | var toJID = stanza.attrs.to; 26 | var id = stanza.attrs.id; 27 | 28 | if (fromJID && toJID && id) { 29 | //Create respnose for discovery 30 | var identityStanza = new ltx.Element('identity',{'category':'pubsub','type':'push'}); 31 | var featureStanza = new ltx.Element('feature',{'var':'urn:xmpp:push:0'}); 32 | var queryStanza = new ltx.Element('query',{'xmlns':'http://jabber.org/protocol/disco#info'}); 33 | queryStanza.cnode(identityStanza); 34 | queryStanza.cnode(featureStanza); 35 | var iqStanza = new ltx.Element('iq',{'from':toJID,'to':fromJID,'id':id,'type':'result'}); 36 | iqStanza.cnode(queryStanza); 37 | cb(null,iqStanza); 38 | } else { 39 | var error = new Error('Invalid stanza. MIssing user JID, server JID, or id'); 40 | cb(error); 41 | } 42 | }; 43 | -------------------------------------------------------------------------------- /tests/client/index.js: -------------------------------------------------------------------------------- 1 | var Client = require('node-xmpp-client'); 2 | var secret = require('./secret.js'); 3 | var xmpp = require('../../src/xmpp.js'); 4 | 5 | var NS_XMPP_DISCO = 'http://jabber.org/protocol/disco#info'; 6 | 7 | /** 8 | Utility Functions 9 | */ 10 | 11 | var handleError = function(err) { 12 | if (err) { 13 | console.log(err); 14 | } else { 15 | console.log("Unkown Error") 16 | } 17 | 18 | }; 19 | 20 | /** 21 | Setup Client 1 the client to register 22 | */ 23 | var client = new Client(secret.a); 24 | client.on('online', function(dict) { 25 | //send enable push stanza 26 | // var stanza = new Client.Stanza.Element() 27 | // client.send( new Client.Stanza.Element('iq',{type: 'get',to : dict.jid.domain, from : dict.jid, id : 'disco1'}).c('query', { xmlns: NS_XMPP_DISCO })); 28 | /** 29 | 30 | 31 | 32 | 33 | OR 34 | 35 | 36 | 37 | 38 | http://jabber.org/protocol/pubsub#publish-options 39 | eruio234vzxc2kla-91 40 | 41 | 42 | 43 | */ 44 | var enableStanza = new Client.Stanza.Element('iq',{type:'set',id:'enable1'}); 45 | var data = Client.parse('http://jabber.org/protocol/pubsub#publish-optionssupersecret') 46 | enableStanza.c('enable',{xmlns:'urn:xmpp:push:0', jid:secret.pushServerJID}).cnode(data); 47 | // 48 | //var subscribe = new Client.Stanza.Element('presence',{to:'b@localhost',type:'subscribe'}); 49 | //client.send(subscribe); 50 | client.send(enableStanza); 51 | 52 | var message = new Client.Stanza.Element('message', { 53 | to: secret.b.jid, 54 | from: secret.a.jid, 55 | type: 'chat', 56 | id: Date.now() 57 | }); 58 | message.c('body').t('Donkey'); 59 | setTimeout(function(){ 60 | client.send(message); 61 | },2000); 62 | }); 63 | 64 | client.on('stanza', function(stanza){ 65 | console.log('Incoming A: ' + stanza.toString()); 66 | }); 67 | 68 | client.on('error', function(error){ 69 | handleError(error); 70 | }); 71 | 72 | /** 73 | Setup Client 2 the client to register 74 | */ 75 | var friend = new Client(secret.b); 76 | 77 | friend.on('online',function(dict) { 78 | var message = new Client.Stanza.Element('message', { 79 | to: secret.a.jid, 80 | from: secret.b.jid+'/'+dict.jid.resource, 81 | type: 'chat', 82 | id: Date.now(), 83 | }); 84 | message.c('body').t('Hey where you at bro?'); 85 | 86 | setTimeout(function(){ 87 | console.log("sending Message from B to A" +message.toString()); 88 | friend.send(message); 89 | },2000); 90 | }); 91 | 92 | friend.on('stanza', function(stanza){ 93 | console.log('Incoming B: ' + stanza.toString()); 94 | }); 95 | 96 | friend.on('error', function(stanza){ 97 | handleError(stanza); 98 | }); 99 | -------------------------------------------------------------------------------- /src/xmpp.js: -------------------------------------------------------------------------------- 1 | var xmpp = require('node-xmpp-server'); 2 | var events = require('events'); 3 | var ltx = require('ltx'); 4 | var api = require('./api.js'); 5 | var Disco = require('./disco.js'); 6 | 7 | function xmppServer() { 8 | events.EventEmitter.call(this); 9 | } 10 | 11 | xmppServer.prototype = new events.EventEmitter(); 12 | 13 | xmppServer.prototype.setup = function(s2sPort, bindAddress, domain, opts) { 14 | this.router = new xmpp.Router(s2sPort, bindAddress); 15 | this.router.addSecureDomain(domain); 16 | var server = this; 17 | this.router.loadCredentialsFromFile(domain,opts.tls.keyPath,opts.tls.certPath); 18 | this.router.register(domain,function (stanza) { 19 | server.handleStanza(stanza); 20 | }); 21 | }; 22 | 23 | var formDataValue = function(stanza, varName) { 24 | if (!varName || !stanza ) { 25 | return; 26 | } 27 | 28 | resultStanza = stanza.getChildrenByFilter(function (child){ 29 | if (child.attrs) { 30 | return child.name === 'field' && child.attrs['var'] === varName; 31 | } 32 | return false; 33 | })[0]; 34 | 35 | if (resultStanza) { 36 | return resultStanza.getChildText('value'); 37 | } 38 | 39 | return null; 40 | }; 41 | 42 | var parsePushStanza = function (stanza,cb) { 43 | if(stanza.name !== 'iq') { 44 | cb(new Error('error not iq'),null); 45 | return; 46 | } 47 | 48 | var result = {}; 49 | 50 | var publishStanza = stanza.getChildrenByFilter( function(child){ 51 | return child.name === 'publish'; 52 | },true)[0]; 53 | 54 | if ( typeof publishStanza === "undefined" || publishStanza === null ) { 55 | var error = new Error('Invalid stanza xml. Missing publish.'); 56 | cb(error); 57 | return; 58 | } 59 | 60 | var formData = publishStanza.getChildrenByFilter( function(child){ 61 | return child.name === 'x' && child.attrs.xmlns === "jabber:x:data"; 62 | },true)[0]; 63 | 64 | result.messageCount = parseInt(formDataValue(formData,'message-count')); 65 | var messagePriority = formDataValue(formData,'last-message-priority'); 66 | var messageBody = formDataValue(formData,'last-message-body'); 67 | if (messagePriority === null) { 68 | if (messageBody !== null) { 69 | messagePriority = "high"; 70 | } else { 71 | messagePriority = "low"; 72 | } 73 | } 74 | 75 | var publishOptionsStanza = stanza.getChildrenByFilter( function(child){ 76 | return child.name === 'publish-options'; 77 | },true)[0]; 78 | 79 | var token = null; 80 | if (typeof(publishOptionsStanza) !== "undefined" && publishOptionsStanza !== null) { 81 | 82 | var publishOptionsFormData = publishOptionsStanza.getChildrenByFilter( function(child){ 83 | return child.name === 'x' && child.attrs.xmlns === "jabber:x:data"; 84 | },true)[0]; 85 | 86 | token = formDataValue(publishOptionsFormData,'token'); 87 | endpointURL = formDataValue(publishOptionsFormData,'endpoint'); 88 | } 89 | 90 | result.token = token; 91 | result.endpoint = endpointURL; 92 | result.priority = messagePriority; 93 | 94 | cb(null,result); 95 | }; 96 | 97 | xmppServer.prototype.emitPushEvent = function(pushInfo) { 98 | if (pushInfo) { 99 | this.emit('push',pushInfo); 100 | } 101 | }; 102 | 103 | xmppServer.prototype.handleStanza = function(stanza) { 104 | if (Disco.isDiscoQuery(stanza)) { 105 | //This is a disco query need to respond 106 | var that = this; 107 | Disco.discoResponse(stanza, function(err,response) { 108 | that.router.send(response); 109 | }); 110 | 111 | } else { 112 | var that = this; 113 | parsePushStanza(stanza,function(err,result){ 114 | if (result) { 115 | var fromJID = stanza.attrs.from; 116 | var toJID = stanza.attrs.to; 117 | var id = stanza.attrs.id; 118 | var response = new ltx.Element('iq',{'from':toJID,'to':fromJID,'id':id,'type':'result'}); 119 | that.router.send(response); 120 | that.emitPushEvent(result); 121 | } 122 | }); 123 | } 124 | }; 125 | 126 | 127 | module.exports.parsePushStanza = parsePushStanza; 128 | module.exports.xmppServer = xmppServer; 129 | -------------------------------------------------------------------------------- /tests/test.js: -------------------------------------------------------------------------------- 1 | var test = require('tape'); 2 | 3 | var xmpp = require('../src/xmpp.js'); 4 | var api = require('../src/api.js'); 5 | var Disco = require('../src/disco.js'); 6 | var stanza = require('node-xmpp-server'); 7 | 8 | var stanzaString = ' urn:xmpp:push:summary<\/value><\/field> 3<\/value><\/field> juliet@capulet.example\/balcony<\/value><\/field> Wherefore art thou, Romeo?<\/value><\/field> <\/x> Additional custom elements<\/additional> <\/notification> <\/item> <\/publish> http:\/\/jabber.org\/protocol\/pubsub#publish-options<\/value><\/field> eruio234vzxc2kla-91<\/value><\/field> <\/x> <\/publish-options> <\/pubsub> <\/iq>'; 9 | var prosodyStanzaString = 'urn:xmpp:push:summary<\/value><\/field>1<\/value><\/field>b@example\/0676b9f5-e106-4242-9199-d0354e74cd30<\/value><\/field>Hey where you at bro?<\/value><\/field><\/x><\/item><\/publish><\/pubsub><\/iq>'; 10 | var prosodyStanzaSecretString = 'urn:xmpp:push:summary<\/value><\/field>1<\/value><\/field>b@example.org\/ab25843d-f12f-445a-8458-4056a1fb6e15<\/value><\/field>Hey where you at bro?<\/value><\/field><\/x><\/item><\/publish>http:\/\/jabber.org\/protocol\/pubsub#publish-options<\/value><\/field>supersecret<\/value><\/field>https://example.com/messages<\/value><\/field><\/x><\/publish-options><\/pubsub><\/iq>'; 11 | var pingStanza = ' '; 12 | var discoQuery = ' '; 13 | var discoExpectedResult = ""; 14 | 15 | test('Stanza Parsing', function(t) { 16 | var s = stanza.parse(stanzaString); 17 | 18 | xmpp.parsePushStanza(s,function(error,result){ 19 | t.equal(result.token,'eruio234vzxc2kla-91'); 20 | t.equal(result.messageCount,3); 21 | t.end(error); 22 | }); 23 | }); 24 | 25 | test('Stanza Parsing Prosody', function(t) { 26 | var s = stanza.parse(prosodyStanzaString); 27 | 28 | xmpp.parsePushStanza(s,function(error,result){ 29 | t.equal(result.token,null); 30 | t.equal(result.messageCount,1); 31 | t.end(error); 32 | }); 33 | }); 34 | 35 | test('Stanza Parsing Prosody w/Secret', function(t) { 36 | var s = stanza.parse(prosodyStanzaSecretString); 37 | xmpp.parsePushStanza(s,function(error,result){ 38 | t.equal(result.token,'supersecret',"Found token"); 39 | t.equal(result.endpoint,'https://example.com/messages',"Found url"); 40 | t.equal(result.messageCount,1); 41 | t.end(error); 42 | }); 43 | }); 44 | 45 | test("XMPP-emit", function(t) { 46 | 47 | var info = "something cool"; 48 | 49 | var server = new xmpp.xmppServer(); 50 | server.on('push',function(pushInfo) { 51 | t.equal(info,pushInfo); 52 | t.end(); 53 | }); 54 | 55 | server.emitPushEvent(info); 56 | 57 | }); 58 | 59 | test('API-messageJson', function(t) { 60 | api.messageJson('Thisisatoken',null,null,function(err,result){ 61 | t.equal(JSON.stringify(result),JSON.stringify({'token':'Thisisatoken', 'priority': 'low'})); 62 | t.end(err); 63 | }); 64 | }); 65 | 66 | test('API-messageJson-high', function(t) { 67 | api.messageJson('Thisisatoken',null,"high",function(err,result){ 68 | t.equal(JSON.stringify(result),JSON.stringify({'token':'Thisisatoken', 'priority': 'high'})); 69 | t.end(err); 70 | }); 71 | }); 72 | 73 | test('API-messageJson-error', function(t) { 74 | api.messageJson(null,null,null,function(err,result){ 75 | t.ok(err); 76 | t.end(); 77 | }); 78 | }); 79 | 80 | test('Non-disco-non-push-stanza',function(t) { 81 | var s = stanza.parse(pingStanza); 82 | 83 | xmpp.parsePushStanza(s,function(error,result){ 84 | t.ok(error); 85 | t.end(); 86 | }); 87 | }); 88 | 89 | test('disco query',function(t) { 90 | var s = stanza.parse(discoQuery); 91 | 92 | var shouldBeTrue = Disco.isDiscoQuery(s); 93 | t.ok(shouldBeTrue,'Is Disco Query'); 94 | 95 | Disco.discoResponse(s,function(err,response){ 96 | t.equal(response.toString(),discoExpectedResult); 97 | t.end(); 98 | }); 99 | }); 100 | 101 | 102 | 103 | /* 104 | //Testing against real server either change server.js to include settings for localhost or running remote server 105 | test('API-messageSend', function(t){ 106 | api.sendMessage("https://push.chatsecure.org/api/v1/messages/",'a4236a30bb01d99ee78bc1a5f0e0c4717e982b59',null,function(err,result){ 107 | t.ok(err,err); 108 | t.end(); 109 | }); 110 | }); 111 | */ 112 | -------------------------------------------------------------------------------- /tests/client/npm-shrinkwrap.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client", 3 | "version": "0.0.2", 4 | "dependencies": { 5 | "@xmpp/jid": { 6 | "version": "0.0.2", 7 | "from": "@xmpp/jid@>=0.0.2 <0.0.3", 8 | "resolved": "https://registry.npmjs.org/@xmpp/jid/-/jid-0.0.2.tgz" 9 | }, 10 | "@xmpp/streamparser": { 11 | "version": "0.0.6", 12 | "from": "@xmpp/streamparser@>=0.0.6 <0.0.7", 13 | "resolved": "https://registry.npmjs.org/@xmpp/streamparser/-/streamparser-0.0.6.tgz" 14 | }, 15 | "@xmpp/xml": { 16 | "version": "0.1.3", 17 | "from": "@xmpp/xml@>=0.1.3 <0.2.0", 18 | "resolved": "https://registry.npmjs.org/@xmpp/xml/-/xml-0.1.3.tgz" 19 | }, 20 | "ajv": { 21 | "version": "4.11.5", 22 | "from": "ajv@>=4.9.1 <5.0.0", 23 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.5.tgz" 24 | }, 25 | "asn1": { 26 | "version": "0.2.3", 27 | "from": "asn1@>=0.2.3 <0.3.0", 28 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" 29 | }, 30 | "assert-plus": { 31 | "version": "0.2.0", 32 | "from": "assert-plus@>=0.2.0 <0.3.0", 33 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" 34 | }, 35 | "asynckit": { 36 | "version": "0.4.0", 37 | "from": "asynckit@>=0.4.0 <0.5.0", 38 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" 39 | }, 40 | "aws-sign2": { 41 | "version": "0.6.0", 42 | "from": "aws-sign2@>=0.6.0 <0.7.0", 43 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" 44 | }, 45 | "aws4": { 46 | "version": "1.6.0", 47 | "from": "aws4@>=1.2.1 <2.0.0", 48 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz" 49 | }, 50 | "backoff": { 51 | "version": "2.3.0", 52 | "from": "backoff@>=2.3.0 <2.4.0", 53 | "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.3.0.tgz" 54 | }, 55 | "bcrypt-pbkdf": { 56 | "version": "1.0.1", 57 | "from": "bcrypt-pbkdf@>=1.0.0 <2.0.0", 58 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 59 | "optional": true 60 | }, 61 | "boom": { 62 | "version": "2.10.1", 63 | "from": "boom@>=2.0.0 <3.0.0", 64 | "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" 65 | }, 66 | "browser-request": { 67 | "version": "0.3.3", 68 | "from": "browser-request@>=0.3.3 <0.4.0", 69 | "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz" 70 | }, 71 | "caseless": { 72 | "version": "0.12.0", 73 | "from": "caseless@>=0.12.0 <0.13.0", 74 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" 75 | }, 76 | "co": { 77 | "version": "4.6.0", 78 | "from": "co@>=4.6.0 <5.0.0", 79 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz" 80 | }, 81 | "combined-stream": { 82 | "version": "1.0.5", 83 | "from": "combined-stream@>=1.0.5 <1.1.0", 84 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz" 85 | }, 86 | "cryptiles": { 87 | "version": "2.0.5", 88 | "from": "cryptiles@>=2.0.0 <3.0.0", 89 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" 90 | }, 91 | "dashdash": { 92 | "version": "1.14.1", 93 | "from": "dashdash@>=1.12.0 <2.0.0", 94 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 95 | "dependencies": { 96 | "assert-plus": { 97 | "version": "1.0.0", 98 | "from": "assert-plus@>=1.0.0 <2.0.0", 99 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" 100 | } 101 | } 102 | }, 103 | "debug": { 104 | "version": "2.6.3", 105 | "from": "debug@>=2.2.0 <3.0.0", 106 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.3.tgz" 107 | }, 108 | "delayed-stream": { 109 | "version": "1.0.0", 110 | "from": "delayed-stream@>=1.0.0 <1.1.0", 111 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" 112 | }, 113 | "ecc-jsbn": { 114 | "version": "0.1.1", 115 | "from": "ecc-jsbn@>=0.1.1 <0.2.0", 116 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 117 | "optional": true 118 | }, 119 | "extend": { 120 | "version": "3.0.0", 121 | "from": "extend@>=3.0.0 <3.1.0", 122 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" 123 | }, 124 | "extsprintf": { 125 | "version": "1.0.2", 126 | "from": "extsprintf@1.0.2", 127 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz" 128 | }, 129 | "forever-agent": { 130 | "version": "0.6.1", 131 | "from": "forever-agent@>=0.6.1 <0.7.0", 132 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" 133 | }, 134 | "form-data": { 135 | "version": "2.1.2", 136 | "from": "form-data@>=2.1.1 <2.2.0", 137 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz" 138 | }, 139 | "getpass": { 140 | "version": "0.1.6", 141 | "from": "getpass@>=0.1.1 <0.2.0", 142 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz", 143 | "dependencies": { 144 | "assert-plus": { 145 | "version": "1.0.0", 146 | "from": "assert-plus@>=1.0.0 <2.0.0", 147 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" 148 | } 149 | } 150 | }, 151 | "har-schema": { 152 | "version": "1.0.5", 153 | "from": "har-schema@>=1.0.5 <2.0.0", 154 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz" 155 | }, 156 | "har-validator": { 157 | "version": "4.2.1", 158 | "from": "har-validator@>=4.2.1 <4.3.0", 159 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz" 160 | }, 161 | "hash-base": { 162 | "version": "3.0.3", 163 | "from": "hash-base@>=3.0.0 <4.0.0", 164 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.3.tgz" 165 | }, 166 | "hawk": { 167 | "version": "3.1.3", 168 | "from": "hawk@>=3.1.3 <3.2.0", 169 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz" 170 | }, 171 | "hoek": { 172 | "version": "2.16.3", 173 | "from": "hoek@>=2.0.0 <3.0.0", 174 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" 175 | }, 176 | "http-signature": { 177 | "version": "1.1.1", 178 | "from": "http-signature@>=1.1.0 <1.2.0", 179 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz" 180 | }, 181 | "inherits": { 182 | "version": "2.0.3", 183 | "from": "inherits@>=2.0.1 <3.0.0", 184 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" 185 | }, 186 | "is-typedarray": { 187 | "version": "1.0.0", 188 | "from": "is-typedarray@>=1.0.0 <1.1.0", 189 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" 190 | }, 191 | "isstream": { 192 | "version": "0.1.2", 193 | "from": "isstream@>=0.1.2 <0.2.0", 194 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" 195 | }, 196 | "jodid25519": { 197 | "version": "1.0.2", 198 | "from": "jodid25519@>=1.0.0 <2.0.0", 199 | "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", 200 | "optional": true 201 | }, 202 | "jsbn": { 203 | "version": "0.1.1", 204 | "from": "jsbn@>=0.1.0 <0.2.0", 205 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 206 | "optional": true 207 | }, 208 | "json-schema": { 209 | "version": "0.2.3", 210 | "from": "json-schema@0.2.3", 211 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz" 212 | }, 213 | "json-stable-stringify": { 214 | "version": "1.0.1", 215 | "from": "json-stable-stringify@>=1.0.1 <2.0.0", 216 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" 217 | }, 218 | "json-stringify-safe": { 219 | "version": "5.0.1", 220 | "from": "json-stringify-safe@>=5.0.1 <5.1.0", 221 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" 222 | }, 223 | "jsonify": { 224 | "version": "0.0.0", 225 | "from": "jsonify@>=0.0.0 <0.1.0", 226 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" 227 | }, 228 | "jsprim": { 229 | "version": "1.4.0", 230 | "from": "jsprim@>=1.2.2 <2.0.0", 231 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", 232 | "dependencies": { 233 | "assert-plus": { 234 | "version": "1.0.0", 235 | "from": "assert-plus@1.0.0", 236 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" 237 | } 238 | } 239 | }, 240 | "lodash.assign": { 241 | "version": "4.2.0", 242 | "from": "lodash.assign@>=4.0.0 <5.0.0", 243 | "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz" 244 | }, 245 | "ltx": { 246 | "version": "2.7.1", 247 | "from": "ltx@>=2.5.0 <3.0.0", 248 | "resolved": "https://registry.npmjs.org/ltx/-/ltx-2.7.1.tgz" 249 | }, 250 | "md5.js": { 251 | "version": "1.3.4", 252 | "from": "md5.js@>=1.3.3 <2.0.0", 253 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz" 254 | }, 255 | "mime-db": { 256 | "version": "1.26.0", 257 | "from": "mime-db@>=1.26.0 <1.27.0", 258 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.26.0.tgz" 259 | }, 260 | "mime-types": { 261 | "version": "2.1.14", 262 | "from": "mime-types@>=2.1.7 <2.2.0", 263 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.14.tgz" 264 | }, 265 | "minimist": { 266 | "version": "1.2.0", 267 | "from": "minimist@>=1.2.0 <2.0.0", 268 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" 269 | }, 270 | "ms": { 271 | "version": "0.7.2", 272 | "from": "ms@0.7.2", 273 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz" 274 | }, 275 | "node-xmpp-client": { 276 | "version": "3.2.0", 277 | "from": "node-xmpp-client@>=3.0.0 <4.0.0", 278 | "resolved": "https://registry.npmjs.org/node-xmpp-client/-/node-xmpp-client-3.2.0.tgz" 279 | }, 280 | "node-xmpp-core": { 281 | "version": "5.0.9", 282 | "from": "node-xmpp-core@>=5.0.9 <6.0.0", 283 | "resolved": "https://registry.npmjs.org/node-xmpp-core/-/node-xmpp-core-5.0.9.tgz" 284 | }, 285 | "node-xmpp-tls-connect": { 286 | "version": "1.0.1", 287 | "from": "node-xmpp-tls-connect@>=1.0.1 <2.0.0", 288 | "resolved": "https://registry.npmjs.org/node-xmpp-tls-connect/-/node-xmpp-tls-connect-1.0.1.tgz" 289 | }, 290 | "oauth-sign": { 291 | "version": "0.8.2", 292 | "from": "oauth-sign@>=0.8.1 <0.9.0", 293 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz" 294 | }, 295 | "options": { 296 | "version": "0.0.6", 297 | "from": "options@>=0.0.5", 298 | "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz" 299 | }, 300 | "performance-now": { 301 | "version": "0.2.0", 302 | "from": "performance-now@>=0.2.0 <0.3.0", 303 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz" 304 | }, 305 | "punycode": { 306 | "version": "1.4.1", 307 | "from": "punycode@>=1.4.1 <2.0.0", 308 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" 309 | }, 310 | "qs": { 311 | "version": "6.4.0", 312 | "from": "qs@>=6.4.0 <6.5.0", 313 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz" 314 | }, 315 | "reconnect-core": { 316 | "version": "0.0.1", 317 | "from": "https://github.com/dodo/reconnect-core/tarball/merged", 318 | "resolved": "https://github.com/dodo/reconnect-core/tarball/merged" 319 | }, 320 | "request": { 321 | "version": "2.81.0", 322 | "from": "request@>=2.65.0 <3.0.0", 323 | "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz" 324 | }, 325 | "safe-buffer": { 326 | "version": "5.0.1", 327 | "from": "safe-buffer@>=5.0.1 <6.0.0", 328 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz" 329 | }, 330 | "sntp": { 331 | "version": "1.0.9", 332 | "from": "sntp@>=1.0.0 <2.0.0", 333 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" 334 | }, 335 | "sshpk": { 336 | "version": "1.11.0", 337 | "from": "sshpk@>=1.7.0 <2.0.0", 338 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.11.0.tgz", 339 | "dependencies": { 340 | "assert-plus": { 341 | "version": "1.0.0", 342 | "from": "assert-plus@>=1.0.0 <2.0.0", 343 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" 344 | } 345 | } 346 | }, 347 | "stringstream": { 348 | "version": "0.0.5", 349 | "from": "stringstream@>=0.0.4 <0.1.0", 350 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" 351 | }, 352 | "tough-cookie": { 353 | "version": "2.3.2", 354 | "from": "tough-cookie@>=2.3.0 <2.4.0", 355 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz" 356 | }, 357 | "tunnel-agent": { 358 | "version": "0.6.0", 359 | "from": "tunnel-agent@>=0.6.0 <0.7.0", 360 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" 361 | }, 362 | "tweetnacl": { 363 | "version": "0.14.5", 364 | "from": "tweetnacl@>=0.14.0 <0.15.0", 365 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 366 | "optional": true 367 | }, 368 | "ultron": { 369 | "version": "1.0.2", 370 | "from": "ultron@>=1.0.0 <1.1.0", 371 | "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz" 372 | }, 373 | "uuid": { 374 | "version": "3.0.1", 375 | "from": "uuid@>=3.0.0 <4.0.0", 376 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz" 377 | }, 378 | "verror": { 379 | "version": "1.3.6", 380 | "from": "verror@1.3.6", 381 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz" 382 | }, 383 | "ws": { 384 | "version": "1.1.4", 385 | "from": "ws@>=1.1.1 <2.0.0", 386 | "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.4.tgz" 387 | } 388 | } 389 | } 390 | -------------------------------------------------------------------------------- /npm-shrinkwrap.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rubdub", 3 | "version": "0.1.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@xmpp/jid": { 8 | "version": "0.0.2", 9 | "resolved": "https://registry.npmjs.org/@xmpp/jid/-/jid-0.0.2.tgz", 10 | "integrity": "sha1-DVKMqdWNr8gzZlVk/+YvMyoxZ/I=" 11 | }, 12 | "@xmpp/streamparser": { 13 | "version": "0.0.6", 14 | "resolved": "https://registry.npmjs.org/@xmpp/streamparser/-/streamparser-0.0.6.tgz", 15 | "integrity": "sha1-EYAz6p23yGoctGED8mnr/3n28eo=", 16 | "requires": { 17 | "@xmpp/xml": "^0.1.3", 18 | "inherits": "^2.0.3", 19 | "ltx": "^2.5.0" 20 | } 21 | }, 22 | "@xmpp/xml": { 23 | "version": "0.1.3", 24 | "resolved": "https://registry.npmjs.org/@xmpp/xml/-/xml-0.1.3.tgz", 25 | "integrity": "sha1-HxQ5nlPkGWiFWGmPbGLnHjmoam4=", 26 | "requires": { 27 | "inherits": "^2.0.3", 28 | "ltx": "^2.6.2" 29 | } 30 | }, 31 | "ajv": { 32 | "version": "6.10.2", 33 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", 34 | "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", 35 | "requires": { 36 | "fast-deep-equal": "^2.0.1", 37 | "fast-json-stable-stringify": "^2.0.0", 38 | "json-schema-traverse": "^0.4.1", 39 | "uri-js": "^4.2.2" 40 | } 41 | }, 42 | "asn1": { 43 | "version": "0.2.4", 44 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 45 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 46 | "requires": { 47 | "safer-buffer": "~2.1.0" 48 | } 49 | }, 50 | "assert-plus": { 51 | "version": "1.0.0", 52 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 53 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 54 | }, 55 | "async": { 56 | "version": "1.2.1", 57 | "resolved": "https://registry.npmjs.org/async/-/async-1.2.1.tgz", 58 | "integrity": "sha1-pIFqF81f9RbfosdpikUzabl5DeA=" 59 | }, 60 | "asynckit": { 61 | "version": "0.4.0", 62 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 63 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 64 | }, 65 | "aws-sign2": { 66 | "version": "0.7.0", 67 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 68 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 69 | }, 70 | "aws4": { 71 | "version": "1.8.0", 72 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 73 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" 74 | }, 75 | "backoff": { 76 | "version": "2.3.0", 77 | "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.3.0.tgz", 78 | "integrity": "sha1-7nx+OAk/kuRyhZ22NedlJFT8Ieo=" 79 | }, 80 | "balanced-match": { 81 | "version": "1.0.0", 82 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 83 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 84 | "dev": true 85 | }, 86 | "bcrypt-pbkdf": { 87 | "version": "1.0.2", 88 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 89 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 90 | "requires": { 91 | "tweetnacl": "^0.14.3" 92 | } 93 | }, 94 | "brace-expansion": { 95 | "version": "1.1.11", 96 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 97 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 98 | "dev": true, 99 | "requires": { 100 | "balanced-match": "^1.0.0", 101 | "concat-map": "0.0.1" 102 | } 103 | }, 104 | "buffer-from": { 105 | "version": "1.1.1", 106 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 107 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 108 | }, 109 | "caseless": { 110 | "version": "0.12.0", 111 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 112 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 113 | }, 114 | "combined-stream": { 115 | "version": "1.0.8", 116 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 117 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 118 | "requires": { 119 | "delayed-stream": "~1.0.0" 120 | } 121 | }, 122 | "commander": { 123 | "version": "2.20.1", 124 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.1.tgz", 125 | "integrity": "sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg==" 126 | }, 127 | "concat-map": { 128 | "version": "0.0.1", 129 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 130 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 131 | "dev": true 132 | }, 133 | "console-polyfill": { 134 | "version": "0.3.0", 135 | "resolved": "https://registry.npmjs.org/console-polyfill/-/console-polyfill-0.3.0.tgz", 136 | "integrity": "sha512-w+JSDZS7XML43Xnwo2x5O5vxB0ID7T5BdqDtyqT6uiCAX2kZAgcWxNaGqT97tZfSHzfOcvrfsDAodKcJ3UvnXQ==" 137 | }, 138 | "core-util-is": { 139 | "version": "1.0.2", 140 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 141 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 142 | }, 143 | "dashdash": { 144 | "version": "1.14.1", 145 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 146 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 147 | "requires": { 148 | "assert-plus": "^1.0.0" 149 | } 150 | }, 151 | "debug": { 152 | "version": "2.6.9", 153 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 154 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 155 | "requires": { 156 | "ms": "2.0.0" 157 | } 158 | }, 159 | "decache": { 160 | "version": "3.1.0", 161 | "resolved": "https://registry.npmjs.org/decache/-/decache-3.1.0.tgz", 162 | "integrity": "sha1-T1A2+9ZYH8yXI3rDlUokS5U2wto=", 163 | "optional": true, 164 | "requires": { 165 | "find": "^0.2.4" 166 | } 167 | }, 168 | "deep-equal": { 169 | "version": "1.0.1", 170 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 171 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", 172 | "dev": true 173 | }, 174 | "define-properties": { 175 | "version": "1.1.3", 176 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 177 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 178 | "dev": true, 179 | "requires": { 180 | "object-keys": "^1.0.12" 181 | } 182 | }, 183 | "defined": { 184 | "version": "1.0.0", 185 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 186 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 187 | "dev": true 188 | }, 189 | "delayed-stream": { 190 | "version": "1.0.0", 191 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 192 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 193 | }, 194 | "ecc-jsbn": { 195 | "version": "0.1.2", 196 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 197 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 198 | "requires": { 199 | "jsbn": "~0.1.0", 200 | "safer-buffer": "^2.1.0" 201 | } 202 | }, 203 | "error-stack-parser": { 204 | "version": "1.3.3", 205 | "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-1.3.3.tgz", 206 | "integrity": "sha1-+tpuOpzSsOCA5tb8dRQYZJc081w=", 207 | "requires": { 208 | "stackframe": "^0.3.1" 209 | } 210 | }, 211 | "es-abstract": { 212 | "version": "1.14.2", 213 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.2.tgz", 214 | "integrity": "sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==", 215 | "dev": true, 216 | "requires": { 217 | "es-to-primitive": "^1.2.0", 218 | "function-bind": "^1.1.1", 219 | "has": "^1.0.3", 220 | "has-symbols": "^1.0.0", 221 | "is-callable": "^1.1.4", 222 | "is-regex": "^1.0.4", 223 | "object-inspect": "^1.6.0", 224 | "object-keys": "^1.1.1", 225 | "string.prototype.trimleft": "^2.0.0", 226 | "string.prototype.trimright": "^2.0.0" 227 | } 228 | }, 229 | "es-to-primitive": { 230 | "version": "1.2.0", 231 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 232 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 233 | "dev": true, 234 | "requires": { 235 | "is-callable": "^1.1.4", 236 | "is-date-object": "^1.0.1", 237 | "is-symbol": "^1.0.2" 238 | } 239 | }, 240 | "extend": { 241 | "version": "3.0.2", 242 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 243 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 244 | }, 245 | "extsprintf": { 246 | "version": "1.3.0", 247 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 248 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 249 | }, 250 | "fast-deep-equal": { 251 | "version": "2.0.1", 252 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 253 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" 254 | }, 255 | "fast-json-stable-stringify": { 256 | "version": "2.0.0", 257 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 258 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 259 | }, 260 | "find": { 261 | "version": "0.2.9", 262 | "resolved": "https://registry.npmjs.org/find/-/find-0.2.9.tgz", 263 | "integrity": "sha1-S3Px/55WrZG3bnFkB/5f/mVUu4w=", 264 | "optional": true, 265 | "requires": { 266 | "traverse-chain": "~0.1.0" 267 | } 268 | }, 269 | "for-each": { 270 | "version": "0.3.3", 271 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 272 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 273 | "dev": true, 274 | "requires": { 275 | "is-callable": "^1.1.3" 276 | } 277 | }, 278 | "forever-agent": { 279 | "version": "0.6.1", 280 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 281 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 282 | }, 283 | "form-data": { 284 | "version": "2.3.3", 285 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 286 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 287 | "requires": { 288 | "asynckit": "^0.4.0", 289 | "combined-stream": "^1.0.6", 290 | "mime-types": "^2.1.12" 291 | } 292 | }, 293 | "fs.realpath": { 294 | "version": "1.0.0", 295 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 296 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 297 | "dev": true 298 | }, 299 | "function-bind": { 300 | "version": "1.1.1", 301 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 302 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 303 | "dev": true 304 | }, 305 | "getpass": { 306 | "version": "0.1.7", 307 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 308 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 309 | "requires": { 310 | "assert-plus": "^1.0.0" 311 | } 312 | }, 313 | "glob": { 314 | "version": "7.1.4", 315 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 316 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 317 | "dev": true, 318 | "requires": { 319 | "fs.realpath": "^1.0.0", 320 | "inflight": "^1.0.4", 321 | "inherits": "2", 322 | "minimatch": "^3.0.4", 323 | "once": "^1.3.0", 324 | "path-is-absolute": "^1.0.0" 325 | } 326 | }, 327 | "har-schema": { 328 | "version": "2.0.0", 329 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 330 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 331 | }, 332 | "har-validator": { 333 | "version": "5.1.3", 334 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 335 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 336 | "requires": { 337 | "ajv": "^6.5.5", 338 | "har-schema": "^2.0.0" 339 | } 340 | }, 341 | "has": { 342 | "version": "1.0.3", 343 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 344 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 345 | "dev": true, 346 | "requires": { 347 | "function-bind": "^1.1.1" 348 | } 349 | }, 350 | "has-symbols": { 351 | "version": "1.0.0", 352 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 353 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 354 | "dev": true 355 | }, 356 | "hat": { 357 | "version": "0.0.3", 358 | "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz", 359 | "integrity": "sha1-uwFKnmSzeIrtgAWRdBPU/z1QLYo=" 360 | }, 361 | "http-signature": { 362 | "version": "1.2.0", 363 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 364 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 365 | "requires": { 366 | "assert-plus": "^1.0.0", 367 | "jsprim": "^1.2.2", 368 | "sshpk": "^1.7.0" 369 | } 370 | }, 371 | "inflight": { 372 | "version": "1.0.6", 373 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 374 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 375 | "dev": true, 376 | "requires": { 377 | "once": "^1.3.0", 378 | "wrappy": "1" 379 | } 380 | }, 381 | "inherits": { 382 | "version": "2.0.3", 383 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 384 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 385 | }, 386 | "is-callable": { 387 | "version": "1.1.4", 388 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 389 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", 390 | "dev": true 391 | }, 392 | "is-date-object": { 393 | "version": "1.0.1", 394 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 395 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 396 | "dev": true 397 | }, 398 | "is-regex": { 399 | "version": "1.0.4", 400 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 401 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 402 | "dev": true, 403 | "requires": { 404 | "has": "^1.0.1" 405 | } 406 | }, 407 | "is-symbol": { 408 | "version": "1.0.2", 409 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 410 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 411 | "dev": true, 412 | "requires": { 413 | "has-symbols": "^1.0.0" 414 | } 415 | }, 416 | "is-typedarray": { 417 | "version": "1.0.0", 418 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 419 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 420 | }, 421 | "is_js": { 422 | "version": "0.9.0", 423 | "resolved": "https://registry.npmjs.org/is_js/-/is_js-0.9.0.tgz", 424 | "integrity": "sha1-CrlFQFArp6+iTIVqqYVWFmnpxS0=" 425 | }, 426 | "isstream": { 427 | "version": "0.1.2", 428 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 429 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 430 | }, 431 | "jsbn": { 432 | "version": "0.1.1", 433 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 434 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 435 | }, 436 | "json-schema": { 437 | "version": "0.2.3", 438 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 439 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 440 | }, 441 | "json-schema-traverse": { 442 | "version": "0.4.1", 443 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 444 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 445 | }, 446 | "json-stringify-safe": { 447 | "version": "5.0.1", 448 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 449 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 450 | }, 451 | "jsprim": { 452 | "version": "1.4.1", 453 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 454 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 455 | "requires": { 456 | "assert-plus": "1.0.0", 457 | "extsprintf": "1.3.0", 458 | "json-schema": "0.2.3", 459 | "verror": "1.10.0" 460 | } 461 | }, 462 | "lodash.assign": { 463 | "version": "4.2.0", 464 | "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", 465 | "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" 466 | }, 467 | "lru-cache": { 468 | "version": "2.2.4", 469 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", 470 | "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=" 471 | }, 472 | "ltx": { 473 | "version": "2.7.1", 474 | "resolved": "https://registry.npmjs.org/ltx/-/ltx-2.7.1.tgz", 475 | "integrity": "sha1-Dly9y1vxeM+ngx6kHcMj2XQiMVo=", 476 | "requires": { 477 | "inherits": "^2.0.1" 478 | } 479 | }, 480 | "mime-db": { 481 | "version": "1.40.0", 482 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", 483 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" 484 | }, 485 | "mime-types": { 486 | "version": "2.1.24", 487 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", 488 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", 489 | "requires": { 490 | "mime-db": "1.40.0" 491 | } 492 | }, 493 | "minimatch": { 494 | "version": "3.0.4", 495 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 496 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 497 | "dev": true, 498 | "requires": { 499 | "brace-expansion": "^1.1.7" 500 | } 501 | }, 502 | "minimist": { 503 | "version": "1.2.0", 504 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 505 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 506 | "dev": true 507 | }, 508 | "ms": { 509 | "version": "2.0.0", 510 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 511 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 512 | }, 513 | "node-xmpp-core": { 514 | "version": "5.0.9", 515 | "resolved": "https://registry.npmjs.org/node-xmpp-core/-/node-xmpp-core-5.0.9.tgz", 516 | "integrity": "sha1-XCjCjtsfs/i+uixnYHd2E/SPNCo=", 517 | "requires": { 518 | "@xmpp/jid": "^0.0.2", 519 | "@xmpp/streamparser": "^0.0.6", 520 | "@xmpp/xml": "^0.1.3", 521 | "debug": "^2.2.0", 522 | "inherits": "^2.0.1", 523 | "lodash.assign": "^4.0.0", 524 | "node-xmpp-tls-connect": "^1.0.1", 525 | "reconnect-core": "https://github.com/dodo/reconnect-core/tarball/merged" 526 | } 527 | }, 528 | "node-xmpp-server": { 529 | "version": "2.2.7", 530 | "resolved": "https://registry.npmjs.org/node-xmpp-server/-/node-xmpp-server-2.2.7.tgz", 531 | "integrity": "sha1-mzLGuHU+gba1sokYWJ6T38d1lNA=", 532 | "requires": { 533 | "debug": "^2.2.0", 534 | "hat": "^0.0.3", 535 | "node-xmpp-core": "^5.0.9", 536 | "ws": "^1.1.1" 537 | } 538 | }, 539 | "node-xmpp-tls-connect": { 540 | "version": "1.0.1", 541 | "resolved": "https://registry.npmjs.org/node-xmpp-tls-connect/-/node-xmpp-tls-connect-1.0.1.tgz", 542 | "integrity": "sha1-kazkOsJrE4hhsr5HjfnfGdYdxcM=" 543 | }, 544 | "oauth-sign": { 545 | "version": "0.9.0", 546 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 547 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 548 | }, 549 | "object-inspect": { 550 | "version": "1.6.0", 551 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", 552 | "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", 553 | "dev": true 554 | }, 555 | "object-keys": { 556 | "version": "1.1.1", 557 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 558 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 559 | "dev": true 560 | }, 561 | "once": { 562 | "version": "1.4.0", 563 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 564 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 565 | "dev": true, 566 | "requires": { 567 | "wrappy": "1" 568 | } 569 | }, 570 | "options": { 571 | "version": "0.0.6", 572 | "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", 573 | "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" 574 | }, 575 | "path-is-absolute": { 576 | "version": "1.0.1", 577 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 578 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 579 | "dev": true 580 | }, 581 | "path-parse": { 582 | "version": "1.0.6", 583 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 584 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 585 | "dev": true 586 | }, 587 | "performance-now": { 588 | "version": "2.1.0", 589 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 590 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 591 | }, 592 | "psl": { 593 | "version": "1.4.0", 594 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", 595 | "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==" 596 | }, 597 | "punycode": { 598 | "version": "2.1.1", 599 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 600 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 601 | }, 602 | "qs": { 603 | "version": "6.5.2", 604 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 605 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 606 | }, 607 | "reconnect-core": { 608 | "version": "https://github.com/dodo/reconnect-core/tarball/merged", 609 | "integrity": "sha1-udryrcRbGabMX9LwSPjZQGzs5Jg=", 610 | "requires": { 611 | "backoff": "~2.3.0" 612 | } 613 | }, 614 | "request": { 615 | "version": "2.88.0", 616 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 617 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 618 | "requires": { 619 | "aws-sign2": "~0.7.0", 620 | "aws4": "^1.8.0", 621 | "caseless": "~0.12.0", 622 | "combined-stream": "~1.0.6", 623 | "extend": "~3.0.2", 624 | "forever-agent": "~0.6.1", 625 | "form-data": "~2.3.2", 626 | "har-validator": "~5.1.0", 627 | "http-signature": "~1.2.0", 628 | "is-typedarray": "~1.0.0", 629 | "isstream": "~0.1.2", 630 | "json-stringify-safe": "~5.0.1", 631 | "mime-types": "~2.1.19", 632 | "oauth-sign": "~0.9.0", 633 | "performance-now": "^2.1.0", 634 | "qs": "~6.5.2", 635 | "safe-buffer": "^5.1.2", 636 | "tough-cookie": "~2.4.3", 637 | "tunnel-agent": "^0.6.0", 638 | "uuid": "^3.3.2" 639 | } 640 | }, 641 | "request-ip": { 642 | "version": "2.0.2", 643 | "resolved": "https://registry.npmjs.org/request-ip/-/request-ip-2.0.2.tgz", 644 | "integrity": "sha1-3urm1K8hdoSX24zQX6NxQ/jxJX4=", 645 | "requires": { 646 | "is_js": "^0.9.0" 647 | } 648 | }, 649 | "resolve": { 650 | "version": "1.11.1", 651 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", 652 | "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", 653 | "dev": true, 654 | "requires": { 655 | "path-parse": "^1.0.6" 656 | } 657 | }, 658 | "resumer": { 659 | "version": "0.0.0", 660 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 661 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 662 | "dev": true, 663 | "requires": { 664 | "through": "~2.3.4" 665 | } 666 | }, 667 | "rollbar": { 668 | "version": "2.13.0", 669 | "resolved": "https://registry.npmjs.org/rollbar/-/rollbar-2.13.0.tgz", 670 | "integrity": "sha512-bIJeTkaeZ8nD/fw/bTkf1m1jlCfZkx6yE+qdzZM+QE1M0dDO0uW4LEXlBrVEYrmn359ITubRTlt4vH5Ezaulhg==", 671 | "requires": { 672 | "async": "~1.2.1", 673 | "buffer-from": ">=1.1", 674 | "console-polyfill": "0.3.0", 675 | "debug": "2.6.9", 676 | "decache": "^3.0.5", 677 | "error-stack-parser": "1.3.3", 678 | "json-stringify-safe": "~5.0.0", 679 | "lru-cache": "~2.2.1", 680 | "request-ip": "~2.0.1", 681 | "source-map": ">=0.5.0", 682 | "uuid": "3.0.x" 683 | }, 684 | "dependencies": { 685 | "uuid": { 686 | "version": "3.0.1", 687 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", 688 | "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=" 689 | } 690 | } 691 | }, 692 | "safe-buffer": { 693 | "version": "5.2.0", 694 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 695 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" 696 | }, 697 | "safer-buffer": { 698 | "version": "2.1.2", 699 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 700 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 701 | }, 702 | "source-map": { 703 | "version": "0.7.3", 704 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", 705 | "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" 706 | }, 707 | "sshpk": { 708 | "version": "1.16.1", 709 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 710 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 711 | "requires": { 712 | "asn1": "~0.2.3", 713 | "assert-plus": "^1.0.0", 714 | "bcrypt-pbkdf": "^1.0.0", 715 | "dashdash": "^1.12.0", 716 | "ecc-jsbn": "~0.1.1", 717 | "getpass": "^0.1.1", 718 | "jsbn": "~0.1.0", 719 | "safer-buffer": "^2.0.2", 720 | "tweetnacl": "~0.14.0" 721 | } 722 | }, 723 | "stackframe": { 724 | "version": "0.3.1", 725 | "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-0.3.1.tgz", 726 | "integrity": "sha1-M6qE8Rd6VUjIk1Uzy/6zQgl19aQ=" 727 | }, 728 | "string.prototype.trim": { 729 | "version": "1.1.2", 730 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", 731 | "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", 732 | "dev": true, 733 | "requires": { 734 | "define-properties": "^1.1.2", 735 | "es-abstract": "^1.5.0", 736 | "function-bind": "^1.0.2" 737 | } 738 | }, 739 | "string.prototype.trimleft": { 740 | "version": "2.1.0", 741 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", 742 | "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", 743 | "dev": true, 744 | "requires": { 745 | "define-properties": "^1.1.3", 746 | "function-bind": "^1.1.1" 747 | } 748 | }, 749 | "string.prototype.trimright": { 750 | "version": "2.1.0", 751 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", 752 | "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", 753 | "dev": true, 754 | "requires": { 755 | "define-properties": "^1.1.3", 756 | "function-bind": "^1.1.1" 757 | } 758 | }, 759 | "tape": { 760 | "version": "4.11.0", 761 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.11.0.tgz", 762 | "integrity": "sha512-yixvDMX7q7JIs/omJSzSZrqulOV51EC9dK8dM0TzImTIkHWfe2/kFyL5v+d9C+SrCMaICk59ujsqFAVidDqDaA==", 763 | "dev": true, 764 | "requires": { 765 | "deep-equal": "~1.0.1", 766 | "defined": "~1.0.0", 767 | "for-each": "~0.3.3", 768 | "function-bind": "~1.1.1", 769 | "glob": "~7.1.4", 770 | "has": "~1.0.3", 771 | "inherits": "~2.0.4", 772 | "minimist": "~1.2.0", 773 | "object-inspect": "~1.6.0", 774 | "resolve": "~1.11.1", 775 | "resumer": "~0.0.0", 776 | "string.prototype.trim": "~1.1.2", 777 | "through": "~2.3.8" 778 | }, 779 | "dependencies": { 780 | "inherits": { 781 | "version": "2.0.4", 782 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 783 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 784 | "dev": true 785 | } 786 | } 787 | }, 788 | "through": { 789 | "version": "2.3.8", 790 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 791 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 792 | "dev": true 793 | }, 794 | "tough-cookie": { 795 | "version": "2.4.3", 796 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 797 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 798 | "requires": { 799 | "psl": "^1.1.24", 800 | "punycode": "^1.4.1" 801 | }, 802 | "dependencies": { 803 | "punycode": { 804 | "version": "1.4.1", 805 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 806 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 807 | } 808 | } 809 | }, 810 | "traverse-chain": { 811 | "version": "0.1.0", 812 | "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", 813 | "integrity": "sha1-YdvC1Ttp/2CRoSoWj9fUMxB+QPE=", 814 | "optional": true 815 | }, 816 | "tunnel-agent": { 817 | "version": "0.6.0", 818 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 819 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 820 | "requires": { 821 | "safe-buffer": "^5.0.1" 822 | } 823 | }, 824 | "tweetnacl": { 825 | "version": "0.14.5", 826 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 827 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 828 | }, 829 | "ultron": { 830 | "version": "1.0.2", 831 | "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", 832 | "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" 833 | }, 834 | "uri-js": { 835 | "version": "4.2.2", 836 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 837 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 838 | "requires": { 839 | "punycode": "^2.1.0" 840 | } 841 | }, 842 | "uuid": { 843 | "version": "3.3.3", 844 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", 845 | "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" 846 | }, 847 | "verror": { 848 | "version": "1.10.0", 849 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 850 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 851 | "requires": { 852 | "assert-plus": "^1.0.0", 853 | "core-util-is": "1.0.2", 854 | "extsprintf": "^1.2.0" 855 | } 856 | }, 857 | "wrappy": { 858 | "version": "1.0.2", 859 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 860 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 861 | "dev": true 862 | }, 863 | "ws": { 864 | "version": "1.1.5", 865 | "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", 866 | "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", 867 | "requires": { 868 | "options": ">=0.0.5", 869 | "ultron": "1.0.x" 870 | } 871 | } 872 | } 873 | } 874 | --------------------------------------------------------------------------------