├── web ├── .gitignore ├── index.ts ├── tsconfig.json ├── package.json ├── dat-gateway.ts ├── peer-discovery.ts ├── webrtc-transport.ts ├── signalhub.ts └── package-lock.json ├── core ├── .gitignore ├── tsconfig.json ├── package.json ├── index.ts └── package-lock.json ├── node ├── .gitignore ├── tsconfig.json ├── test │ └── test.ts ├── index.ts ├── package.json ├── discovery-channel.ts ├── tcp-transport.ts ├── hyperdiscovery.ts └── package-lock.json ├── .gitignore ├── test ├── background.js ├── index.html ├── test-node.js ├── package.json ├── manifest.json ├── utils.js └── test-web.js ├── for-each-submodule.sh ├── webext ├── package.json ├── tcp-transport.js ├── socket-stream.js ├── service-discovery.js └── package-lock.json ├── LICENSE ├── package.json └── Readme.md /web/.gitignore: -------------------------------------------------------------------------------- 1 | *.js 2 | *.map 3 | -------------------------------------------------------------------------------- /core/.gitignore: -------------------------------------------------------------------------------- 1 | *.js 2 | *.map 3 | -------------------------------------------------------------------------------- /node/.gitignore: -------------------------------------------------------------------------------- 1 | *.js 2 | *.map 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | test/test-bundle.js 3 | test/vendor -------------------------------------------------------------------------------- /test/background.js: -------------------------------------------------------------------------------- 1 | browser.tabs.create({ 2 | active: true, 3 | url: browser.runtime.getURL('index.html'), 4 | }) -------------------------------------------------------------------------------- /for-each-submodule.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo $* 4 | WD=`pwd` 5 | for DIR in "core" "web" "node" "webext" "test" 6 | do 7 | echo "Enter $DIR" 8 | cd $WD/$DIR 9 | $* 10 | done 11 | -------------------------------------------------------------------------------- /web/index.ts: -------------------------------------------------------------------------------- 1 | import DatGateway from "./dat-gateway"; 2 | import PeerDiscovery from "./peer-discovery"; 3 | import WebRTCTransport from "./webrtc-transport"; 4 | 5 | export { 6 | DatGateway, 7 | PeerDiscovery, 8 | WebRTCTransport, 9 | } -------------------------------------------------------------------------------- /web/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2017", 4 | "module": "commonjs", 5 | "sourceMap": true 6 | }, 7 | "include": [ 8 | "*.ts", 9 | ], 10 | "exclude": [ 11 | "node_modules" 12 | ] 13 | } -------------------------------------------------------------------------------- /core/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2017", 4 | "module": "commonjs", 5 | "sourceMap": true 6 | }, 7 | "include": [ 8 | "index.ts" 9 | ], 10 | "exclude": [ 11 | "node_modules" 12 | ] 13 | } -------------------------------------------------------------------------------- /node/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2017", 4 | "module": "commonjs", 5 | "sourceMap": true 6 | }, 7 | "include": [ 8 | "*.ts", 9 | ], 10 | "exclude": [ 11 | "node_modules" 12 | ] 13 | } -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Dat Discovery test 5 | 6 | 7 | 8 |
9 | 10 | 11 | -------------------------------------------------------------------------------- /webext/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sammacbeth/discovery-swarm-webext", 3 | "version": "1.0.9", 4 | "description": "", 5 | "scripts": { 6 | "build": "echo \"Nothing to build\"", 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@sammacbeth/libdweb": "0.0.2", 13 | "browserify": "^16.2.3" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /core/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sammacbeth/discovery-swarm", 3 | "version": "1.0.9", 4 | "description": "", 5 | "files": [ 6 | "*.ts", 7 | "*.js", 8 | "*.map" 9 | ], 10 | "scripts": { 11 | "build": "tsc" 12 | }, 13 | "author": "", 14 | "license": "ISC", 15 | "dependencies": { 16 | "hypercore-protocol": "^6.7.1", 17 | "pump": "^3.0.0" 18 | }, 19 | "devDependencies": { 20 | "@types/node": "^10.11.7", 21 | "typescript": "^3.1.2" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sammacbeth/discovery-swarm-web", 3 | "version": "1.0.9", 4 | "description": "", 5 | "files": [ 6 | "*.ts", 7 | "*.js", 8 | "*.map" 9 | ], 10 | "scripts": { 11 | "build": "tsc" 12 | }, 13 | "author": "", 14 | "license": "ISC", 15 | "dependencies": { 16 | "@sammacbeth/discovery-swarm": "1.0.9", 17 | "signalhub": "^4.9.0", 18 | "simple-peer": "^9.1.2", 19 | "websocket-stream": "^5.1.2" 20 | }, 21 | "devDependencies": { 22 | "@types/node": "^10.12.0", 23 | "typescript": "^3.1.3" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /node/test/test.ts: -------------------------------------------------------------------------------- 1 | import * as hyperdrive from 'hyperdrive'; 2 | import * as ram from 'random-access-memory'; 3 | 4 | import HyperDiscovery from "./hyperdiscovery"; 5 | import TCPTransport from "./tcp-transport"; 6 | 7 | const archive = hyperdrive(ram); 8 | archive.on('ready', () => { 9 | const network1 = new HyperDiscovery({ 10 | announce: true, 11 | }); 12 | const mockTransport = new TCPTransport(); 13 | mockTransport.port = 1234; 14 | const network2 = new HyperDiscovery({}); 15 | // network1.on('peer', console.log); 16 | network2.on('peer', console.log); 17 | network1.join(archive.key, { 18 | transport: { 19 | tcp: mockTransport, 20 | } 21 | }); 22 | network2.join(archive.key); 23 | }); 24 | 25 | -------------------------------------------------------------------------------- /node/index.ts: -------------------------------------------------------------------------------- 1 | import { SwarmOptions } from "@sammacbeth/discovery-swarm"; 2 | import * as datDefaults from "dat-swarm-defaults"; 3 | import HyperDiscovery, { SwarmOptions as DiscoveryOptions } from "./hyperdiscovery"; 4 | import DiscoveryChannel from "./discovery-channel"; 5 | import TCPTransport from "./tcp-transport"; 6 | 7 | export default (swarmOpts: Partial, discoveryOpts: DiscoveryOptions) => { 8 | return { 9 | ...swarmOpts, 10 | introducers: [ 11 | new HyperDiscovery(discoveryOpts), 12 | new DiscoveryChannel(datDefaults({})), 13 | ], 14 | transport: { 15 | tcp: new TCPTransport(), 16 | } 17 | }; 18 | }; 19 | 20 | export { 21 | TCPTransport, 22 | HyperDiscovery, 23 | DiscoveryChannel, 24 | } 25 | -------------------------------------------------------------------------------- /node/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sammacbeth/discovery-swarm-node", 3 | "version": "1.0.9", 4 | "description": "", 5 | "files": [ 6 | "*.ts", 7 | "*.js", 8 | "*.map" 9 | ], 10 | "scripts": { 11 | "test": "echo \"Error: no test specified\" && exit 1", 12 | "build": "tsc" 13 | }, 14 | "author": "Sam Macbeth", 15 | "license": "ISC", 16 | "devDependencies": { 17 | "@types/node": "^10.11.7", 18 | "hyperdrive": "^9.14.0", 19 | "mocha": "^5.2.0", 20 | "random-access-memory": "^3.0.0", 21 | "typescript": "^3.1.2" 22 | }, 23 | "dependencies": { 24 | "@hyperswarm/network": "0.0.3", 25 | "@sammacbeth/discovery-swarm": "1.0.9", 26 | "dat-swarm-defaults": "^1.0.1", 27 | "discovery-channel": "^5.5.1" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /test/test-node.js: -------------------------------------------------------------------------------- 1 | const nodeSwarmConfig = require('@sammacbeth/discovery-swarm-node').default; 2 | const WebRTCTransport = require('@sammacbeth/discovery-swarm-web/webrtc-transport').default; 3 | const wrtc = require('wrtc'); 4 | 5 | const { setupNetwork, createHyperDrive, waitForMetadata } = require('./utils'); 6 | 7 | const key = 'd116652eca93bc6608f1c09e5fb72b3f654aa3be2a3bca09bccfbe4131ff9e23'; 8 | 9 | const opts = nodeSwarmConfig({ 10 | debug: true, 11 | id: Buffer.from('dat-node-test'), 12 | sparse: false, 13 | port: 3282 14 | }, {}); 15 | const wrtcIntro = new WebRTCTransport([ 16 | 'https://signal.dat-web.eu', 17 | ], { 18 | wrtc, 19 | trickle: false, 20 | }); 21 | opts.transport.webrtc = wrtcIntro; 22 | 23 | (async () => { 24 | const archive = await createHyperDrive(key); 25 | network = await setupNetwork(archive, opts); 26 | await waitForMetadata(archive); 27 | console.log('archive ready'); 28 | })(); -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2018 Sam Macbeth 2 | 3 | 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: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | 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. -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sammacbeth/pluggable-discovery-swarm", 3 | "version": "1.0.9", 4 | "description": "A pluggable implementation of [discovery-swarm](https://github.com/mafintosh/discovery-swarm). Enables multiple different _introductors_, _announcers_ and _transports_ to be specified at runtime and used to discover and connect to peers.", 5 | "directories": { 6 | "test": "test" 7 | }, 8 | "scripts": { 9 | "install": "./for-each-submodule.sh npm install", 10 | "build": "./for-each-submodule.sh npm run build", 11 | "publish": "./for-each-submodule.sh npm publish --access public", 12 | "test": "echo \"Error: no test specified\" && exit 1" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/sammacbeth/pluggable-discovery-swarm.git" 17 | }, 18 | "author": "Sam Macbeth", 19 | "license": "MIT", 20 | "bugs": { 21 | "url": "https://github.com/sammacbeth/pluggable-discovery-swarm/issues" 22 | }, 23 | "homepage": "https://github.com/sammacbeth/pluggable-discovery-swarm#readme" 24 | } 25 | -------------------------------------------------------------------------------- /test/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sammacbeth/discovery-swarm-test", 3 | "version": "1.0.9", 4 | "description": "", 5 | "main": "background.js", 6 | "scripts": { 7 | "build": "browserify -r fs:graceful-fs -e ./test-web.js > ./test-bundle.js", 8 | "run": "env MOZ_DISABLE_CONTENT_SANDBOX=1 web-ext run -s ./ --firefox=firefoxdeveloperedition --no-reload", 9 | "vendor": "mkdir -p vendor && cp node_modules/mocha/mocha.css vendor/", 10 | "test": "npm run vendor && npm run build && npm run run" 11 | }, 12 | "author": "", 13 | "license": "ISC", 14 | "dependencies": { 15 | "@sammacbeth/discovery-swarm": "1.0.9", 16 | "@sammacbeth/discovery-swarm-node": "1.0.9", 17 | "@sammacbeth/discovery-swarm-web": "1.0.9", 18 | "@sammacbeth/discovery-swarm-webext": "1.0.9", 19 | "@sammacbeth/libdweb": "0.0.2", 20 | "browserify": "^16.2.3", 21 | "chai": "^4.2.0", 22 | "hyperdrive": "^9.14.0", 23 | "mocha": "^5.2.0", 24 | "random-access-memory": "^3.0.0", 25 | "signalhub": "^4.9.0", 26 | "web-ext": "^2.9.1", 27 | "wrtc": "^0.2.1" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /web/dat-gateway.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from "events"; 2 | import * as Websocket from "websocket-stream"; 3 | 4 | 5 | export default class DatGatewayIntroducer extends EventEmitter { 6 | 7 | gateway: string 8 | multiplexStream: boolean 9 | 10 | constructor(server, multiplexStream = false) { 11 | super(); 12 | this.gateway = server; 13 | this.multiplexStream = multiplexStream; 14 | } 15 | 16 | async join(discoveryKey, opts) { 17 | if (opts.key) { 18 | const gatewayUrl = `${this.gateway}/${opts.key.toString('hex')}`; 19 | const peer = { 20 | id: this.multiplexStream ? this.gateway : gatewayUrl, 21 | channel: discoveryKey, 22 | retries: 1, 23 | stream: () => Websocket(gatewayUrl), 24 | } 25 | if (this.multiplexStream) { 26 | // ping gateway to load feed 27 | await fetch(`${gatewayUrl.replace('ws:', 'http:').replace('wss:', 'https')}/`, { 28 | credentials: 'omit', 29 | method: 'HEAD', 30 | }); 31 | } 32 | this.emit('peer', peer); 33 | } 34 | } 35 | 36 | leave() {} 37 | } 38 | -------------------------------------------------------------------------------- /test/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 2, 3 | "version": "0.1", 4 | "name": "Discovery Swarm Web Tests", 5 | "description": "", 6 | "permissions": [], 7 | "background": { 8 | "scripts": ["background.js"] 9 | }, 10 | "experiment_apis": { 11 | "TCPSocket": { 12 | "schema": "node_modules/@sammacbeth/libdweb/src/TCPSocket/TCPSocket.json", 13 | "child": { 14 | "scopes": ["addon_child"], 15 | "paths": [["TCPSocket"]], 16 | "script": "node_modules/@sammacbeth/libdweb/src/TCPSocket/Socket.js" 17 | } 18 | }, 19 | "ServiceDiscovery": { 20 | "schema": "node_modules/@sammacbeth/libdweb/src/ServiceDiscovery/ServiceDiscovery.json", 21 | "child": { 22 | "scopes": ["addon_child"], 23 | "paths": [["ServiceDiscovery"]], 24 | "script": "node_modules/@sammacbeth/libdweb/src/ServiceDiscovery/client.js" 25 | }, 26 | "parent": { 27 | "scopes": ["addon_parent"], 28 | "paths": [["ServiceDiscovery"]], 29 | "script": "node_modules/@sammacbeth/libdweb/src/ServiceDiscovery/host.js" 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /node/discovery-channel.ts: -------------------------------------------------------------------------------- 1 | import * as DC from "discovery-channel"; 2 | import { EventEmitter } from "events"; 3 | import { Introducer, JoinOptions, Peer } from "@sammacbeth/discovery-swarm"; 4 | 5 | export interface DiscoveryOptions { 6 | dns?: boolean 7 | dht?: boolean 8 | hash?: (any) => any 9 | } 10 | 11 | export default class DiscoveryChannel extends EventEmitter implements Introducer { 12 | 13 | channel: DC 14 | 15 | constructor(opts?: DiscoveryOptions) { 16 | super(); 17 | this.channel = DC({ 18 | hash: false, 19 | ...opts 20 | }); 21 | this.channel.on('peer', (id: Buffer, peer) => { 22 | this.emit('peer', { 23 | id: `${peer.host}:${peer.port}`, 24 | host: peer.host, 25 | port: peer.port, 26 | channel: id || peer.channel, 27 | type: 'tcp', 28 | }); 29 | }); 30 | } 31 | 32 | join(discoveryKey: Buffer, opts?: Partial) { 33 | console.log('join', discoveryKey.toString('hex')); 34 | if (opts.announce) { 35 | this.channel.join(discoveryKey, opts.transport.tcp.address); 36 | } else { 37 | this.channel.join(discoveryKey); 38 | } 39 | } 40 | 41 | leave(discoveryKey: Buffer) { 42 | this.channel.leave(discoveryKey); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /webext/tcp-transport.js: -------------------------------------------------------------------------------- 1 | const events = require('events'); 2 | const SocketStream = require('./socket-stream'); 3 | 4 | class TCPTransport extends events.EventEmitter { 5 | constructor(TCPSocket) { 6 | super(); 7 | this.socket = TCPSocket || browser.TCPSocket; 8 | } 9 | 10 | listen(port) { 11 | return new Promise((resolve) => { 12 | this.socket.listen({ port }).then(async (server) => { 13 | this.address = server.localPort; 14 | resolve({ 15 | close: () => server.close(), 16 | }); 17 | for await (const socket of server.connections) { 18 | console.log('incoming connection from', `${socket.host}:${socket.port}`); 19 | await socket.opened; 20 | this.emit('connection', { 21 | id: `${socket.host}:${socket.port}`, 22 | host: socket.host, 23 | port: socket.port, 24 | stream: () => new SocketStream(socket), 25 | }); 26 | } 27 | }); 28 | }); 29 | } 30 | 31 | async connect({ host, port }) { 32 | console.log('connect to', host, port); 33 | const socket = await browser.TCPSocket.connect({ host, port }) 34 | await socket.opened; 35 | return new SocketStream(socket); 36 | } 37 | } 38 | 39 | module.exports = TCPTransport; -------------------------------------------------------------------------------- /node/tcp-transport.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from "events"; 2 | import { createServer, connect } from "net"; 3 | import { Transport, Server, Peer } from "@sammacbeth/discovery-swarm"; 4 | import { Duplex } from "stream"; 5 | 6 | export default class TCPTransport extends EventEmitter implements Transport { 7 | 8 | address: number 9 | 10 | constructor() { 11 | super(); 12 | } 13 | 14 | listen(port: number) : Promise { 15 | return new Promise((resolve) => { 16 | const server = createServer((socket) => { 17 | this.emit('connection', { 18 | id: `${socket.remoteAddress}:${socket.remotePort}`, 19 | host: socket.remoteAddress, 20 | port: socket.remotePort, 21 | stream: () => socket, 22 | }); 23 | }); 24 | this.address = port; 25 | server.listen(port, () => { 26 | resolve({ 27 | close: () => server.close() 28 | }); 29 | }); 30 | }); 31 | } 32 | 33 | connect({ host, port }: Peer) : Promise { 34 | return new Promise((resolve) => { 35 | const socket = connect(port, host, () => { 36 | resolve(socket); 37 | console.log('connected', host, port); 38 | }); 39 | socket.on('error', (e) => { 40 | console.error('error', e); 41 | socket.destroy(); 42 | }); 43 | }); 44 | } 45 | } -------------------------------------------------------------------------------- /webext/socket-stream.js: -------------------------------------------------------------------------------- 1 | const events = require('events') 2 | const { Duplex } = require('readable-stream'); 3 | 4 | class Stream extends Duplex { 5 | constructor(socket) { 6 | super(); 7 | this._socket = socket; 8 | this._buffer = []; 9 | this.on('finish', () => { 10 | console.log('socket finish') 11 | this._socket.close(); 12 | }); 13 | this._run(); 14 | } 15 | 16 | async _run() { 17 | if (this._flowing) { 18 | return; 19 | } 20 | this._flowing = true; 21 | while (this._socket.readyState === 'open') { 22 | const data = await this._socket.read(); 23 | if (this.ended) { 24 | break; 25 | } 26 | this.push(Buffer.from(data)); 27 | } 28 | this._flowing = false; 29 | } 30 | 31 | _read() { 32 | } 33 | 34 | write(chunk, encoding, callback) { 35 | if (typeof chunk === 'string') { 36 | const encoder = new TextEncoder(encoding || this._encoding); 37 | chunk = encoder.encode(chunk); 38 | } 39 | const write = this._socket.write(chunk.buffer); 40 | if (callback) { 41 | write.then(() => callback(null), (err) => callback(err)); 42 | } 43 | return true; 44 | } 45 | 46 | _destroy(err, cb) { 47 | console.log('socket destroy', err); 48 | this._socket.close(); 49 | cb(err); 50 | } 51 | } 52 | 53 | module.exports = Stream; -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # Pluggable-discovery-swarm 2 | 3 | A pluggable implementation of [discovery-swarm](https://github.com/mafintosh/discovery-swarm). 4 | Enables multiple different _introductors_, _announcers_ and _transports_ to be specified at runtime 5 | and used to discover and connect to peers. 6 | 7 | Currently implements: 8 | * Dat Gateway introducer: peers with [dat-gateway](https://github.com/RangerMauve/dat-gateway) servers over Websockets (web + node). 9 | * TCP Transport for webextensions: Connect with peers over TCP, using [libdweb](https://github.com/mozilla/libdweb) (webextensions). 10 | * LanDiscovery: Announce and discover peers on LAN, using [libdweb](https://github.com/mozilla/libdweb) (webextensions). 11 | 12 | ## Usage 13 | 14 | ```javascript 15 | const Swarm = require('discovery-swarm'); 16 | const DatGatewayIntroducer = require('discovery-swarm/web/dat-gateway'); 17 | const TCPTransport = require('discovery-swarm/webext/tcp-transport'); 18 | const LanDiscovery = require('discovery-swarm/webext/service-discovery'); 19 | 20 | const swarm = new Swarm({ 21 | introducers: [ 22 | new DatGatewayIntroducer(), 23 | new LanDiscovery({ announce: true }), 24 | ], 25 | transport: { 26 | tcp: new TCPTransport(), 27 | }, 28 | }); 29 | swarm.listen(); 30 | swarm.join(key); 31 | swarm.on('peer', (peer) => { 32 | console.log('got a peer', peer); 33 | }); 34 | ``` 35 | 36 | ## License 37 | 38 | MIT. 39 | -------------------------------------------------------------------------------- /test/utils.js: -------------------------------------------------------------------------------- 1 | const hyperdrive = require('hyperdrive'); 2 | const ram = require('random-access-memory'); 3 | const disc = require('@sammacbeth/discovery-swarm').default; 4 | // const disc = require('discovery-swarm'); 5 | 6 | async function createNetwork(archive, opts, cb) { 7 | const swarmOpts = Object.assign({ 8 | hash: false, 9 | stream: opts.stream, 10 | }, opts); 11 | const swarm = disc(swarmOpts); 12 | await swarm.listen(opts.port); 13 | swarm.join(archive.discoveryKey, { 14 | announce: !(opts.upload === false), 15 | key: archive.key, 16 | }, cb); 17 | return swarm; 18 | }; 19 | 20 | async function setupNetwork(archive, opts) { 21 | const netOpts = Object.assign({ 22 | stream: () => { 23 | const stream = archive.replicate({ 24 | upload: true, 25 | download: true, 26 | live: true, 27 | }); 28 | return stream; 29 | } 30 | }, opts); 31 | return createNetwork(archive, netOpts); 32 | }; 33 | 34 | async function createHyperDrive(key) { 35 | archive = hyperdrive(ram, key); 36 | await new Promise((resolve) => { 37 | archive.ready(resolve); 38 | }) 39 | return archive; 40 | }; 41 | 42 | async function waitForMetadata(archive) { 43 | await new Promise((resolve, reject) => { 44 | archive.metadata.update(err => { 45 | if (err) reject(err) 46 | else resolve() 47 | }) 48 | }); 49 | }; 50 | 51 | module.exports = { 52 | createNetwork, 53 | setupNetwork, 54 | createHyperDrive, 55 | waitForMetadata, 56 | }; -------------------------------------------------------------------------------- /node/hyperdiscovery.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from "events"; 2 | import { Socket } from "net"; 3 | import { Introducer, JoinOptions, Peer } from "@sammacbeth/discovery-swarm"; 4 | import * as Discovery from "@hyperswarm/discovery"; 5 | 6 | export interface SwarmOptions { 7 | bootstrap?: string[] 8 | ephemeral?: boolean 9 | socket?: Socket 10 | announce?: boolean 11 | } 12 | 13 | interface Topic extends EventEmitter { 14 | destroy: () => void 15 | update: () => void 16 | } 17 | 18 | export default class HyperDiscovery extends EventEmitter implements Introducer { 19 | 20 | network: Discovery 21 | topics: Map 22 | announce: boolean 23 | 24 | constructor(opts?: SwarmOptions) { 25 | super(); 26 | this.network = Discovery(opts); 27 | this.announce = !!opts.announce; 28 | this.topics = new Map(); 29 | } 30 | 31 | join(discoveryKey: Buffer, opts?: Partial) { 32 | const key = discoveryKey.toString('hex'); 33 | if (!this.topics.has(key)) { 34 | let topic : Topic; 35 | if (this.announce || (opts && opts.announce)) { 36 | topic = this.network.announce(discoveryKey, { 37 | port: opts.transport.tcp.address, 38 | }); 39 | } else { 40 | topic = this.network.lookup(discoveryKey); 41 | } 42 | topic.on('peer', (peer) => { 43 | const peerInfo : Peer = { 44 | id: `${peer.host}:${peer.port}`, 45 | host: peer.host, 46 | port: peer.port, 47 | channel: peer.topic, 48 | type: 'tcp', 49 | }; 50 | this.emit('peer', peerInfo); 51 | this.network.holepunch(peer); 52 | }); 53 | this.topics.set(key, topic); 54 | } 55 | } 56 | 57 | leave(discoveryKey: Buffer) { 58 | const key = discoveryKey.toString('hex'); 59 | if (this.topics.has(key)) { 60 | const topic = this.topics.get(key); 61 | topic.destroy(); 62 | this.topics.delete(key); 63 | } 64 | } 65 | 66 | } -------------------------------------------------------------------------------- /web/peer-discovery.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from "events"; 2 | import { Introducer, JoinOptions } from "@sammacbeth/discovery-swarm"; 3 | 4 | function parsePeer(peer: string) { 5 | if (peer.startsWith('wrtc://')) { 6 | const [host, id] = peer.substring(7).split('/'); 7 | return { 8 | id, 9 | host, 10 | type: 'webrtc', 11 | }; 12 | } else if (peer.startsWith('tcp://')) { 13 | const host = peer.substring(6, peer.lastIndexOf(':')); 14 | const port = peer.substring(host.length + 7); 15 | return { 16 | id: peer, 17 | host, 18 | port: parseInt(port), 19 | type: 'tcp', 20 | }; 21 | } 22 | throw Error(`Unknown protocol ${peer}`); 23 | } 24 | 25 | export default class PeerDiscovery extends EventEmitter implements Introducer { 26 | 27 | server: string 28 | joined: Map 29 | self: Set 30 | 31 | constructor(server) { 32 | super(); 33 | this.server = server; 34 | this.joined = new Map(); 35 | this.self = new Set(); 36 | } 37 | 38 | async join(discoveryKey: Buffer, opts: JoinOptions) { 39 | const key = discoveryKey.toString('hex'); 40 | if (this.joined.has(key)) { 41 | return; 42 | } 43 | 44 | const fetchAndEmit = async () => this._emitPeers(discoveryKey, await this._fetchPeers(discoveryKey)); 45 | this.joined.set(key, setInterval(fetchAndEmit, 60000)) 46 | fetchAndEmit(); 47 | 48 | if (opts.announce && opts.transport) { 49 | const wrtc = opts.transport.webrtc ? `${opts.transport.webrtc.address}/${opts.id.toString('hex')}` : false; 50 | const tcp = opts.transport.tcp ? opts.transport.tcp.address : false; 51 | const announceResponse = await fetch(`${this.server}/${key}`, { 52 | method: 'POST', 53 | body: JSON.stringify({ wrtc, tcp }), 54 | }); 55 | const addresses = await announceResponse.json(); 56 | Object.values(addresses).forEach((addr: string) => { 57 | if (addr) { 58 | this.self.add(addr); 59 | } 60 | }); 61 | } 62 | } 63 | 64 | _fetchPeers(discoveryKey) { 65 | const key = discoveryKey.toString('hex'); 66 | return fetch(`${this.server}/${key}`) 67 | .then(res => res.json()) 68 | } 69 | 70 | _emitPeers (channel, peers) { 71 | peers.forEach((peer) => { 72 | try { 73 | const peerInfo = parsePeer(peer); 74 | this.emit('peer', { 75 | ...peerInfo, 76 | channel, 77 | }); 78 | } catch (e) { 79 | console.warn('Got invalid peer', e); 80 | } 81 | }); 82 | } 83 | 84 | leave(discoveryKey) { 85 | const key = discoveryKey.toString('hex'); 86 | clearInterval(this.joined.get(key)); 87 | this.joined.delete(key); 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /webext/service-discovery.js: -------------------------------------------------------------------------------- 1 | const events = require('events'); 2 | const crypto = require('crypto'); 3 | 4 | class LanDiscovery extends events.EventEmitter { 5 | constructor(opts) { 6 | super(); 7 | if (!opts) opts = {}; 8 | this.id = opts.id || crypto.randomBytes(32); 9 | this.joined = new Set(); 10 | this.announce = !!opts.announce; 11 | this.announced = new Map(); 12 | this.self = {}; 13 | this.discoveryRunning = false; 14 | } 15 | 16 | async join(discoveryKey, opts) { 17 | const key = discoveryKey.toString('hex'); 18 | if (this.joined.has(key)) { 19 | return; 20 | } 21 | this.joined.add(key); 22 | 23 | if (this.announce && opts.transport.tcp.port && !this.announced.has(key)) { 24 | const discovery = browser.ServiceDiscovery.announce({ 25 | name: key, 26 | type: 'dat', 27 | protocol: 'tcp', 28 | port: opts.transport.tcp.port, 29 | attributes: { 30 | peerId: this.id.toString('hex'), 31 | } 32 | }); 33 | discovery.then((service) => { 34 | this.self.host = service.host; 35 | this.self.port = service.port; 36 | this.announced.set(key, service); 37 | console.log('announced service', service); 38 | }); 39 | } 40 | this.runDiscovery(); 41 | } 42 | 43 | leave(discoveryKey) { 44 | const key = discoveryKey.toString('hex'); 45 | this.joined.delete(key); 46 | if (this.announced.has(key)) { 47 | const discovery = this.announced.get(key); 48 | if (discovery) { 49 | discovery.expire(); 50 | } 51 | this.announced.delete(key); 52 | } 53 | } 54 | 55 | async runDiscovery() { 56 | if (this.discoveryRunning) { 57 | return; 58 | } 59 | this.discoveryRunning = true; 60 | const services = browser.ServiceDiscovery.discover({ 61 | type: 'dat', 62 | protocol: 'tcp', 63 | }); 64 | for await (const service of services) { 65 | if (!this.joined.size === 0) { 66 | break; 67 | } 68 | if ((service.host === this.self.host && service.port === this.self.port) || 69 | service.attributes.peerId === this.id.toString('hex')) { 70 | // don't connect to self 71 | continue; 72 | } 73 | if (service.lost) { 74 | continue; 75 | } 76 | [...this.joined] 77 | .filter(key => key.substring(0, 30) === service.name.substring(0, 30)) 78 | .forEach((key) => { 79 | this.emit('peer', { 80 | id: `${service.host}:${service.port}`, 81 | host: service.host, 82 | port: service.port, 83 | channel: Buffer.from(key, 'hex'), 84 | type: 'tcp', 85 | retries: 2, 86 | }); 87 | }); 88 | } 89 | this.discoveryRunning = false; 90 | } 91 | } 92 | 93 | module.exports = LanDiscovery; 94 | -------------------------------------------------------------------------------- /web/webrtc-transport.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from "events"; 2 | import * as SimplePeer from "simple-peer"; 3 | import * as Signalhub from "signalhub"; 4 | import { Transport, Server, Peer } from "@sammacbeth/discovery-swarm"; 5 | import { Readable, Duplex } from "stream"; 6 | import { randomBytes } from "crypto"; 7 | 8 | const APP = 'dat-webrtc'; 9 | 10 | export default class WebRTCTransport extends EventEmitter implements Transport { 11 | 12 | hub: Signalhub 13 | peerOpts: any 14 | address: string 15 | peerId: string 16 | 17 | constructor(servers, peerOpts) { 18 | super(); 19 | this.address = servers[0].replace('https://', ''); 20 | this.hub = Signalhub(APP, servers); 21 | this.peerOpts = peerOpts; 22 | } 23 | 24 | listen(port: number, id: Buffer): Promise { 25 | this.peerId = id.toString('hex'); 26 | return new Promise((resolve) => { 27 | const stream: Readable = this.hub.subscribe(this.peerId); 28 | console.log('listening to ', this.peerId); 29 | stream.on('data', async (message) => { 30 | if (message.id === this.peerId) { 31 | return; 32 | } 33 | if (message.type === 'offer') { 34 | console.log('got offer', message.id); 35 | const peer = new SimplePeer({ initiator: false, ...this.peerOpts }); 36 | peer.once('signal', (signal) => { 37 | this.hub.broadcast(this.peerId, { 38 | id: this.peerId, 39 | type: 'signal', 40 | target: message.id, 41 | signal, 42 | }); 43 | }); 44 | peer.signal(message.offer); 45 | const timeout = new Promise((resolve, reject) => setTimeout(reject, 10000)); 46 | const connection = new Promise(resolve => peer.once('connect', resolve)); 47 | try { 48 | await Promise.race([timeout, connection]); 49 | console.log('connected', message.id); 50 | this.emit('connection', { 51 | id: message.id, 52 | stream: () => peer, 53 | }); 54 | } catch (e) { 55 | // timeout 56 | } 57 | } 58 | }); 59 | resolve({ 60 | close: () => this.hub.close(), 61 | }); 62 | }); 63 | } 64 | 65 | async connect({ id, host }: Peer): Promise { 66 | // TODO host can indicate different signal server 67 | const sharesMyHub = this.hub.urls.indexOf(host) > -1 68 | const hub = sharesMyHub ? this.hub : Signalhub(APP, [`https://${host}`]); 69 | const myId = this.peerId || randomBytes(32).toString('hex'); 70 | const stream: Readable = hub.subscribe(id); 71 | // create peer and broadcast offer to peer 72 | const peer = new SimplePeer({ initiator: true, ...this.peerOpts }); 73 | peer.once('signal', (offer) => { 74 | console.log('offer', id); 75 | hub.broadcast(id, { 76 | id: myId, 77 | type: 'offer', 78 | offer, 79 | }); 80 | }); 81 | 82 | // wait for response from signal server 83 | stream.on('data', (message) => { 84 | if (message.id === myId || message.target !== myId || message.type !== 'signal') { 85 | return; 86 | } 87 | console.log('got signal', message.id); 88 | peer.signal(message.signal); 89 | }); 90 | 91 | const connection = new Promise((resolve) => peer.once('connect', resolve)); 92 | const timeout = new Promise((resolve, reject) => setTimeout(reject, 10000)); 93 | try { 94 | await Promise.race([timeout, connection]); 95 | } catch (e) { 96 | throw new Error('connection timeout') 97 | } finally { 98 | stream.destroy(); 99 | if (!sharesMyHub) { 100 | hub.close(); 101 | } 102 | } 103 | console.log('connected', id); 104 | return peer; 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /web/signalhub.ts: -------------------------------------------------------------------------------- 1 | import * as Peer from "simple-peer"; 2 | import * as Signalhub from "signalhub"; 3 | import { Introducer, JoinOptions } from "@sammacbeth/discovery-swarm"; 4 | import { EventEmitter } from "events"; 5 | import { Readable } from "stream"; 6 | 7 | 8 | export default class SignalHubIntroducer extends EventEmitter implements Introducer { 9 | 10 | signalhub: Signalhub 11 | _streams: Map 12 | _offers: Map 13 | _connections: Set 14 | peerOpts: any 15 | 16 | constructor(servers: string[], peerOpts) { 17 | super(); 18 | this.signalhub = Signalhub('dat-discovery', servers); 19 | this._streams = new Map(); 20 | this._offers = new Map(); 21 | this._connections = new Set(); 22 | this.peerOpts = peerOpts; 23 | } 24 | 25 | join(discoveryKey: Buffer, opts: JoinOptions) { 26 | const key = discoveryKey.toString('hex'); 27 | const myId = opts.id.toString('hex'); 28 | if (this._streams.has(key)) { 29 | return; 30 | } 31 | const stream: Readable = this.signalhub.subscribe(key); 32 | stream.on('data', (message) => { 33 | console.log('message', message); 34 | if (message.id === myId) { 35 | return 36 | } 37 | if (message.type === 'offer' && !this._connections.has(message.id)) { 38 | console.log('saw offer'); 39 | this.emit('peer', { 40 | id: message.id, 41 | channel: discoveryKey, 42 | type: 'webrtc', 43 | stream: async () => { 44 | console.log('connect peer', message.id); 45 | const peer = new Peer({ initiator: false, ...this.peerOpts }); 46 | peer.once('signal', (signal) => { 47 | console.log('braodcast signal'); 48 | this.signalhub.broadcast(key, { 49 | id: myId, 50 | type: 'signal', 51 | target: message.id, 52 | signal, 53 | }); 54 | }) 55 | peer.signal(message.offer); 56 | const timeout = new Promise((resolve, reject) => setTimeout(reject, 10000)); 57 | const connection = new Promise(resolve => peer.once('connect', resolve)); 58 | await Promise.race([timeout, connection]); 59 | console.log('xxx connected'); 60 | this._connections.add(message.id); 61 | peer.on('close', () => this._connections.delete(message.id)); 62 | return peer; 63 | } 64 | }) 65 | } else if (message.type === 'signal' && message.target === myId) { 66 | console.log('saw signal from', message.id); 67 | // offer response signal 68 | if (!this._offers.has(key)) { 69 | return; 70 | } 71 | const peer = this._offers.get(key); 72 | peer.signal(message.signal); 73 | peer.on('connect', () => { 74 | console.log('connected'); 75 | this.emit('peer', { 76 | id: message.id, 77 | stream: () => peer, 78 | }); 79 | this._connections.add(message.id); 80 | peer.on('close', () => this._connections.delete(message.id)); 81 | }); 82 | // broadcast a new offer 83 | this.broadcastOffer(key, myId); 84 | } 85 | }); 86 | this._streams.set(key, stream); 87 | 88 | if (opts.announce) { 89 | this.broadcastOffer(key, myId); 90 | } 91 | } 92 | 93 | broadcastOffer(key: string, peerId: string) { 94 | const peer = new Peer({ initiator: true, ...this.peerOpts }); 95 | this._offers.set(key, peer); 96 | peer.once('signal', (offer) => { 97 | console.log('broadcast', peerId, offer); 98 | this.signalhub.broadcast(key, { 99 | id: peerId, 100 | type: 'offer', 101 | offer, 102 | }) 103 | }); 104 | } 105 | 106 | leave(discoveryKey: Buffer) { 107 | const key = discoveryKey.toString('hex'); 108 | if (this._streams.has(key)) { 109 | this._streams.get(key).destroy(); 110 | this._streams.delete(key); 111 | } 112 | if (this._offers.has(key)) { 113 | this._offers.get(key).destroy(); 114 | this._offers.delete(key); 115 | } 116 | } 117 | 118 | } -------------------------------------------------------------------------------- /test/test-web.js: -------------------------------------------------------------------------------- 1 | const mocha = require('mocha').mocha; 2 | const chai = require('chai'); 3 | 4 | const DatGatewayIntroducer = require('@sammacbeth/discovery-swarm-web/dat-gateway'); 5 | const TCPTransport = require('@sammacbeth/discovery-swarm-webext/tcp-transport'); 6 | const SignalHubIntroducer = require('@sammacbeth/discovery-swarm-web/signalhub').default; 7 | const WebRTCTransport = require('@sammacbeth/discovery-swarm-web/webrtc-transport').default; 8 | const LanDiscovery = require('@sammacbeth/discovery-swarm-webext/service-discovery'); 9 | const { setupNetwork, createHyperDrive, waitForMetadata } = require('./utils'); 10 | 11 | mocha.setup('bdd'); 12 | const expect = chai.expect; 13 | 14 | async function testReplicated(archive, testFile = 'dat.json') { 15 | return new Promise((resolve, reject) => { 16 | archive.readdir('/', (err, files) => { 17 | expect(files.length).to.not.equal(0); 18 | expect(files.indexOf(testFile) !== -1).to.be.true; 19 | resolve(); 20 | }); 21 | }); 22 | } 23 | 24 | describe('hyperdrive replication', () => { 25 | 26 | let archive; 27 | let network; 28 | const key = 'd116652eca93bc6608f1c09e5fb72b3f654aa3be2a3bca09bccfbe4131ff9e23'; 29 | 30 | afterEach(() => { 31 | if (network) { 32 | network.destroy(); 33 | } 34 | if (archive) { 35 | archive.close(); 36 | } 37 | }); 38 | 39 | context('no network', () => { 40 | 41 | beforeEach(async () => { 42 | archive = await createHyperDrive(key); 43 | }); 44 | 45 | it('hyperdrive has no data', (done) => { 46 | archive.readdir('/', (err, files) => { 47 | expect(files.length).to.equal(0); 48 | done(err); 49 | }); 50 | }); 51 | }); 52 | 53 | context('gateway replication', () => { 54 | 55 | beforeEach(async () => { 56 | archive = await createHyperDrive(key); 57 | }); 58 | 59 | it('replicates', async function () { 60 | this.timeout(5000); 61 | const gatewayServers = ['ws://gateway.mauve.moe:3000']; 62 | const opts = { 63 | sparse: true, 64 | introducers: [new DatGatewayIntroducer(gatewayServers)], 65 | }; 66 | network = await setupNetwork(archive, opts); 67 | await waitForMetadata(archive); 68 | 69 | return testReplicated(archive); 70 | }); 71 | }); 72 | 73 | async function selfReplicationTest(net1, net2, emitPeers) { 74 | // create a hyperdrive 75 | archive = await createHyperDrive(); 76 | 77 | // setup archive to get full hyperdrive contents 78 | network = await setupNetwork(archive, net1); 79 | 80 | const data = 'hello world'; 81 | await new Promise((res, rej) => { 82 | archive.writeFile('test.txt', data, (err) => { 83 | if (err) { 84 | rej(err); 85 | } else { 86 | res(); 87 | } 88 | }); 89 | }); 90 | 91 | const archive2 = await createHyperDrive(archive.key.toString('hex')); 92 | const network2 = await setupNetwork(archive2, net2); 93 | const ready = waitForMetadata(archive2); 94 | 95 | await testReplicated(archive, 'test.txt'); 96 | 97 | // get address of network1 server and emit as peer to network2 98 | emitPeers(network, network2); 99 | 100 | await ready 101 | await testReplicated(archive2, 'test.txt'); 102 | await new Promise((resolve, reject) => { 103 | archive2.readFile('/test.txt', 'utf-8', (err, contents) => { 104 | if (err) reject(err); 105 | expect(contents).to.equal(data); 106 | resolve(); 107 | }); 108 | }); 109 | } 110 | 111 | context('TCPSocket replication', () => { 112 | 113 | it('replicates to a dat-node server', async function () { 114 | this.timeout(5000); 115 | 116 | archive = await createHyperDrive(key); 117 | const opts = { 118 | sparse: true, 119 | transport: { 120 | tcp: new TCPTransport(), 121 | }, 122 | }; 123 | 124 | network = await setupNetwork(archive, opts); 125 | setTimeout(() => { 126 | network.emit('peer', { 127 | id: 'dat-node', 128 | host: 'localhost', 129 | port: 3282, 130 | type: 'tcp', 131 | channel: archive.discoveryKey, 132 | retries: 0, 133 | }); 134 | }, 10); 135 | await waitForMetadata(archive); 136 | return testReplicated(archive); 137 | }); 138 | 139 | it('replicates to itself', function () { 140 | this.timeout(5000); 141 | return selfReplicationTest({ 142 | transport: { 143 | tcp: new TCPTransport(), 144 | }, 145 | }, { 146 | sparse: true, 147 | transport: { 148 | tcp: new TCPTransport(), 149 | } 150 | }, (network, network2) => { 151 | network2.emit('peer', { 152 | id: 'network1', 153 | host: 'localhost', 154 | port: network._servers.get('tcp').port, 155 | type: 'tcp', 156 | channel: archive.discoveryKey, 157 | retries: 0, 158 | }); 159 | }); 160 | }); 161 | }); 162 | 163 | context('Signalhub Webrtc Replication', () => { 164 | 165 | const signalServers = [ 166 | 'https://signal.dat-web.eu', 167 | ]; 168 | 169 | it('replicates to itself', async function () { 170 | this.timeout(5000); 171 | const t1 = new SignalHubIntroducer(signalServers, { trickle: false }); 172 | const t2 = new SignalHubIntroducer(signalServers, { trickle: false }); 173 | return selfReplicationTest({ 174 | introducers: [t1], 175 | transport: { 176 | webrtc: t1, 177 | }, 178 | }, { 179 | sparse: true, 180 | introducers: [t2], 181 | transport: { 182 | webrtc: t2, 183 | } 184 | }, () => { 185 | }); 186 | }); 187 | 188 | it('replicates to a node server', async function () { 189 | this.timeout(5000); 190 | 191 | archive = await createHyperDrive(key); 192 | const wrtc = new SignalHubIntroducer(signalServers, { trickle: true }); 193 | const opts = { 194 | debug: true, 195 | sparse: true, 196 | introducers: [ 197 | wrtc 198 | ], 199 | }; 200 | 201 | network = await setupNetwork(archive, opts); 202 | await waitForMetadata(archive); 203 | return testReplicated(archive); 204 | }); 205 | }); 206 | 207 | context('WebrtcTransport Replication', () => { 208 | 209 | const signalServers = [ 210 | 'https://signal.dat-web.eu', 211 | ]; 212 | 213 | it('replicates to itself', async function () { 214 | this.timeout(5000); 215 | const t1 = new WebRTCTransport(signalServers, { trickle: false }); 216 | const t2 = new WebRTCTransport(signalServers, { trickle: false }); 217 | return selfReplicationTest({ 218 | transport: { 219 | webrtc: t1, 220 | }, 221 | }, { 222 | sparse: true, 223 | transport: { 224 | webrtc: t2, 225 | } 226 | }, (n1, n2) => { 227 | n2.emit('peer', { 228 | id: t1.peerId, 229 | type: 'webrtc', 230 | channel: archive.discoveryKey, 231 | host: t1.address, 232 | }); 233 | }); 234 | }); 235 | 236 | it('replicates to a node server', async function () { 237 | this.timeout(5000); 238 | 239 | archive = await createHyperDrive(key); 240 | const webrtc = new WebRTCTransport(signalServers, { trickle: false }); 241 | const opts = { 242 | debug: true, 243 | sparse: true, 244 | transport: { 245 | webrtc, 246 | }, 247 | }; 248 | 249 | network = await setupNetwork(archive, opts); 250 | setTimeout(() => { 251 | network.emit('peer', { 252 | id: Buffer.from('dat-node-test').toString('hex'), 253 | type: 'webrtc', 254 | channel: archive.discoveryKey, 255 | }); 256 | }, 10); 257 | await waitForMetadata(archive); 258 | return testReplicated(archive); 259 | }); 260 | 261 | it('replicates to other signal servers', async function () { 262 | this.timeout(5000); 263 | const t1 = new WebRTCTransport(signalServers, { trickle: false }); 264 | const t2 = new WebRTCTransport(['https://signalhub-jccqtwhdwc.now.sh'], { trickle: false }); 265 | return selfReplicationTest({ 266 | transport: { 267 | webrtc: t1, 268 | }, 269 | }, { 270 | sparse: true, 271 | transport: { 272 | webrtc: t2, 273 | } 274 | }, (n1, n2) => { 275 | n2.emit('peer', { 276 | id: t1.peerId, 277 | type: 'webrtc', 278 | channel: archive.discoveryKey, 279 | host: t1.address, 280 | }); 281 | }); 282 | }); 283 | 284 | }); 285 | 286 | context('Discovery', () => { 287 | 288 | let announcer; 289 | let introducer; 290 | 291 | beforeEach(async () => { 292 | archive = await createHyperDrive(key); 293 | }); 294 | 295 | afterEach(() => { 296 | announcer.leave(archive.discoveryKey); 297 | introducer.leave(archive.discoveryKey); 298 | }); 299 | 300 | it('emits a peer when searching for a discovery key', function(done) { 301 | this.timeout(5000); 302 | announcer = new LanDiscovery({ announce: true }); 303 | const opts = { 304 | transport: { 305 | tcp: { port: 3154 } 306 | } 307 | }; 308 | announcer.join(archive.discoveryKey, opts); 309 | introducer = new LanDiscovery({ announce: false }); 310 | introducer.on('peer', (peer) => { 311 | console.log('peer', peer); 312 | chai.expect(peer.port).to.equal(3154); 313 | chai.expect(peer.channel).to.eql(archive.discoveryKey); 314 | done(); 315 | }); 316 | introducer.join(archive.discoveryKey); 317 | }); 318 | }); 319 | 320 | }); 321 | 322 | // mocha.checkLeaks(); 323 | mocha.run(); -------------------------------------------------------------------------------- /core/index.ts: -------------------------------------------------------------------------------- 1 | import { Duplex } from "stream"; 2 | import { EventEmitter } from "events"; 3 | import { randomBytes } from "crypto"; 4 | import * as pump from "pump"; 5 | import * as hypercoreProtocol from 'hypercore-protocol'; 6 | 7 | const RECONNECT_WAIT = [1000, 1000, 5000, 15000] 8 | 9 | export interface TransportMap { 10 | [type: string]: Transport 11 | } 12 | 13 | export interface JoinOptions { 14 | id: Buffer 15 | announce: boolean 16 | transport: TransportMap 17 | key?: Buffer 18 | } 19 | 20 | export interface SwarmOptions extends JoinOptions { 21 | debug: boolean 22 | maxConnections: number 23 | stream: (peer: Peer) => Duplex 24 | introducers: Introducer[] 25 | transport: TransportMap 26 | } 27 | 28 | export interface Introducer extends EventEmitter { 29 | join(key: Buffer, opts?: JoinOptions) 30 | leave(key: Buffer) 31 | } 32 | 33 | export interface Server { 34 | close: () => void 35 | } 36 | 37 | export interface Address { 38 | host: string 39 | port: number 40 | } 41 | 42 | export interface Transport extends EventEmitter { 43 | listen(port: number, id: Buffer) : Promise 44 | connect(address: Peer) : Promise 45 | address: any 46 | } 47 | 48 | export interface Peer extends Partial
{ 49 | id: string 50 | channel?: Buffer 51 | connection?: Duplex 52 | replStream?: Duplex 53 | retries?: number 54 | stream?: () => Promise 55 | type?: string 56 | mtime?: number 57 | } 58 | 59 | export class Swarm extends EventEmitter { 60 | 61 | debug: boolean 62 | id: Buffer 63 | maxConnections: number 64 | totalConnections: number 65 | introducers: Introducer[] 66 | _joined: Set 67 | _options: JoinOptions 68 | _stream?: (peer: Peer) => Duplex 69 | _peers: Map 70 | _onPeer: (peer: Peer) => void 71 | _servers: Map 72 | 73 | constructor(opts?: Partial) { 74 | super(); 75 | if (!opts) opts = {}; 76 | this.debug = opts.debug; 77 | this.id = opts.id || randomBytes(32); 78 | 79 | this.maxConnections = opts.maxConnections || 0; 80 | this.totalConnections = 0; 81 | 82 | this._stream = opts.stream; 83 | this._options = { 84 | id: this.id, 85 | announce: true, 86 | transport: opts.transport, 87 | }; 88 | 89 | this._joined = new Set(); 90 | this._peers = new Map(); 91 | 92 | this._onPeer = this.onPeer.bind(this); 93 | this.introducers = opts.introducers || []; 94 | this.introducers.forEach((introducer) => { 95 | introducer.on('peer', this._onPeer); 96 | }); 97 | this._servers = new Map(); 98 | 99 | this.on('peer', this.onPeer.bind(this)); 100 | } 101 | 102 | close() { 103 | return this.destroy(); 104 | } 105 | 106 | destroy() { 107 | this.introducers.forEach((introducer) => { 108 | introducer.removeListener('peer', this._onPeer); 109 | }); 110 | this._joined.forEach((key) => { 111 | this.leave(Buffer.from(key, 'hex')); 112 | }); 113 | this._servers.forEach((server, type) => { 114 | server.close(); 115 | this._options.transport[type].removeListener('connection', this._onPeer); 116 | }); 117 | } 118 | 119 | get queued(): number { 120 | return 0; 121 | } 122 | 123 | get connecting(): number { 124 | return this.totalConnections - this.connected; 125 | } 126 | 127 | get connected(): number { 128 | return this._peers.size; 129 | } 130 | 131 | join(name: Buffer, opts: Partial) { 132 | const joinOpts: JoinOptions = Object.assign(opts, this._options); 133 | const discoveryKey = name.toString('hex'); 134 | if (this._joined.has(discoveryKey)) { 135 | // already joined 136 | return 137 | } 138 | this._joined.add(discoveryKey); 139 | 140 | // ask introducers for peers 141 | this.introducers.forEach((introducer) => { 142 | introducer.join(name, joinOpts); 143 | }); 144 | } 145 | 146 | leave(name: Buffer) { 147 | const key = name.toString('hex'); 148 | this._joined.delete(key); 149 | for (const [id, peer] of this._peers.entries()) { 150 | if (peer.channel && peer.channel.toString('hex') === key) { 151 | if (peer.connection) { 152 | peer.connection.destroy(); 153 | } 154 | this._peers.delete(id); 155 | } 156 | } 157 | 158 | this.introducers.forEach((introducer) => { 159 | introducer.leave(name); 160 | }); 161 | } 162 | 163 | async listen(port?: number, onlistening?: () => void) { 164 | if (this._options.transport) { 165 | await Promise.all(Object.keys(this._options.transport).map((name) => { 166 | return this._options.transport[name].listen(port, this.id).then((server) => { 167 | if (this.debug) { 168 | console.log(`${name} server listening`); 169 | } 170 | this._servers.set(name, server); 171 | this._options.transport[name].on('connection', this._onPeer); 172 | }); 173 | })); 174 | } 175 | onlistening && onlistening(); 176 | } 177 | 178 | onPeer(peer: Peer) { 179 | if (this._peers.has(peer.id)) { 180 | // already connected, or self 181 | const existingPeer = this._peers.get(peer.id); 182 | if (existingPeer.connection && existingPeer.replStream) { 183 | // already connected - emit the channel 184 | existingPeer.replStream.emit('feed', peer.channel) 185 | } else if (existingPeer.retries === 0 || Date.now() - existingPeer.mtime < 60000) { 186 | return; 187 | } 188 | } 189 | if (this.debug) { 190 | console.log('peer', peer); 191 | } 192 | if (this.maxConnections > 0 && this.totalConnections >= this.maxConnections) { 193 | return; 194 | } 195 | if (peer.channel && !this._joined.has(peer.channel.toString('hex'))) { 196 | // not listening to this key 197 | return; 198 | } 199 | 200 | this._peers.set(peer.id, peer); 201 | // when peer stream is not provided by the discoverer, find a transport that can make the connection 202 | if (!peer.stream && peer.type && this._options.transport[peer.type]) { 203 | peer.stream = async () => { 204 | return await this._options.transport[peer.type].connect(peer); 205 | }; 206 | } 207 | peer.retries = peer.retries || 4; 208 | 209 | if (peer.stream && this._stream) { 210 | const connectPeer = async () => { 211 | peer.mtime = Date.now(); 212 | try { 213 | const peerStream = await peer.stream(); 214 | this.totalConnections += 1; 215 | const replStream = this._stream(peer); 216 | peer.replStream = replStream; 217 | peer.connection = pump(peerStream, replStream, peerStream, (err) => { 218 | if (this.debug) { 219 | console.error('stream error', err, peer.id); 220 | } 221 | peer.connection = null; 222 | peer.replStream = null; 223 | if (peer.retries < RECONNECT_WAIT.length && this._peers.has(peer.id)) { 224 | setTimeout(connectPeer, RECONNECT_WAIT[peer.retries]); 225 | peer.retries += 1; 226 | } else { 227 | // TODO temp ban? 228 | this.totalConnections -= 1; 229 | } 230 | }); 231 | peerStream.on('end', () => { 232 | peer.connection = null; 233 | }); 234 | if (this.debug) { 235 | replStream.on('handshake', () => console.log('handshaked', peer.id)); 236 | replStream.on('feed', (f) => console.log('feed', peer.id, f.toString('hex'))); 237 | peerStream.on('close', () => console.log('stream closed')); 238 | peerStream.on('error', (err) => console.error('stream error', peer.id, err)); 239 | replStream.on('error', (err) => console.error('repl error', peer.id, err)); 240 | } 241 | } catch (e) { 242 | console.error('could not connect to peer', e); 243 | } 244 | 245 | } 246 | connectPeer(); 247 | } 248 | } 249 | } 250 | 251 | interface ReplicationOptions { 252 | live?: boolean 253 | stream?: Duplex 254 | } 255 | 256 | export interface HypercoreLike { 257 | key: Buffer 258 | discoveryKey: Buffer 259 | replicate: (opts?: ReplicationOptions) => Duplex 260 | ready: (callback: () => void) => void 261 | } 262 | 263 | export class MultiSwarm { 264 | 265 | swarm: Swarm 266 | archives: Map 267 | 268 | constructor(opts?: Partial) { 269 | this.swarm = new Swarm(Object.assign({ 270 | hash: false, 271 | stream: this.replicate.bind(this), 272 | }, opts)); 273 | this.archives = new Map(); 274 | } 275 | 276 | listen(port?: number) { 277 | return this.swarm.listen(port); 278 | } 279 | 280 | add(archive: HypercoreLike) { 281 | archive.ready(() => { 282 | const key = archive.discoveryKey.toString('hex'); 283 | this.archives.set(key, archive); 284 | this.swarm.join(archive.discoveryKey, { 285 | key: archive.key, 286 | }); 287 | }); 288 | } 289 | 290 | remove(archive: HypercoreLike) { 291 | const key = archive.discoveryKey.toString('hex'); 292 | this.archives.delete(key); 293 | this.swarm.leave(archive.discoveryKey); 294 | } 295 | 296 | replicate(opts: Peer) : Duplex { 297 | const stream: Duplex = hypercoreProtocol({ 298 | live: true, 299 | id: this.swarm.id, 300 | encrypt: true 301 | }); 302 | 303 | const add = (dk: Buffer) => { 304 | const key = dk.toString('hex'); 305 | if (!this.archives.has(key)) { 306 | return; 307 | } 308 | const archive = this.archives.get(key); 309 | archive.replicate({ 310 | live: true, 311 | stream, 312 | }); 313 | }; 314 | 315 | stream.on('feed', add); 316 | if (opts.channel) { 317 | add(opts.channel); 318 | } 319 | 320 | return stream; 321 | } 322 | 323 | destroy() { 324 | this.swarm.destroy(); 325 | } 326 | } 327 | 328 | export default (...args) => new Swarm(...args); -------------------------------------------------------------------------------- /core/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sammacbeth/discovery-swarm", 3 | "version": "1.0.9", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/node": { 8 | "version": "10.12.1", 9 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.1.tgz", 10 | "integrity": "sha512-i1sl+WCX2OCHeUi9oi7PiCNUtYFrpWhpcx878vpeq/tlZTKzcFdHePlyFHVbWqeuKN0SRPl/9ZFDSTsfv9h7VQ==", 11 | "dev": true 12 | }, 13 | "blake2b": { 14 | "version": "2.1.3", 15 | "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.3.tgz", 16 | "integrity": "sha512-pkDss4xFVbMb4270aCyGD3qLv92314Et+FsKzilCLxDz5DuZ2/1g3w4nmBbu6nKApPspnjG7JcwTjGZnduB1yg==", 17 | "requires": { 18 | "blake2b-wasm": "^1.1.0", 19 | "nanoassert": "^1.0.0" 20 | } 21 | }, 22 | "blake2b-wasm": { 23 | "version": "1.1.7", 24 | "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-1.1.7.tgz", 25 | "integrity": "sha512-oFIHvXhlz/DUgF0kq5B1CqxIDjIJwh9iDeUUGQUcvgiGz7Wdw03McEO7CfLBy7QKGdsydcMCgO9jFNBAFCtFcA==", 26 | "requires": { 27 | "nanoassert": "^1.0.0" 28 | } 29 | }, 30 | "buffer-alloc-unsafe": { 31 | "version": "1.1.0", 32 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 33 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" 34 | }, 35 | "buffer-from": { 36 | "version": "1.1.1", 37 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 38 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 39 | }, 40 | "core-util-is": { 41 | "version": "1.0.2", 42 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 43 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 44 | }, 45 | "end-of-stream": { 46 | "version": "1.4.1", 47 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 48 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 49 | "requires": { 50 | "once": "^1.4.0" 51 | } 52 | }, 53 | "hypercore-protocol": { 54 | "version": "6.7.1", 55 | "resolved": "https://registry.npmjs.org/hypercore-protocol/-/hypercore-protocol-6.7.1.tgz", 56 | "integrity": "sha512-6jjMwL/XgeAl9BDUWmAJmIum7ynHGqajCnXt5VbJuxNLKkPI8WQS2kpMfcvotI5QHKMu/15+92ZPM6WoYDtd8g==", 57 | "requires": { 58 | "buffer-alloc-unsafe": "^1.0.0", 59 | "buffer-from": "^1.0.0", 60 | "inherits": "^2.0.3", 61 | "protocol-buffers-encodings": "^1.1.0", 62 | "readable-stream": "^2.2.6", 63 | "sodium-universal": "^2.0.0", 64 | "sorted-indexof": "^1.0.0", 65 | "varint": "^5.0.0" 66 | } 67 | }, 68 | "inherits": { 69 | "version": "2.0.3", 70 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 71 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 72 | }, 73 | "ini": { 74 | "version": "1.3.5", 75 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 76 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 77 | "optional": true 78 | }, 79 | "isarray": { 80 | "version": "1.0.0", 81 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 82 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 83 | }, 84 | "nan": { 85 | "version": "2.11.1", 86 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", 87 | "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", 88 | "optional": true 89 | }, 90 | "nanoassert": { 91 | "version": "1.1.0", 92 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-1.1.0.tgz", 93 | "integrity": "sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40=" 94 | }, 95 | "node-gyp-build": { 96 | "version": "3.5.0", 97 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.5.0.tgz", 98 | "integrity": "sha512-qjEE8eIWVyqZhkAFUzytGpOGvLHeX5kXBB6MYyTOCPZBrBlsLyXAAzTsp/hWMbVlg8kVpzDJCZZowIrnKpwmqQ==", 99 | "optional": true 100 | }, 101 | "once": { 102 | "version": "1.4.0", 103 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 104 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 105 | "requires": { 106 | "wrappy": "1" 107 | } 108 | }, 109 | "process-nextick-args": { 110 | "version": "2.0.0", 111 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 112 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 113 | }, 114 | "protocol-buffers-encodings": { 115 | "version": "1.1.0", 116 | "resolved": "https://registry.npmjs.org/protocol-buffers-encodings/-/protocol-buffers-encodings-1.1.0.tgz", 117 | "integrity": "sha512-SmjEuAf3hc3h3rWZ6V1YaaQw2MNJWK848gLJgzx/sefOJdNLujKinJVXIS0q2cBQpQn2Q32TinawZyDZPzm4kQ==", 118 | "requires": { 119 | "signed-varint": "^2.0.1", 120 | "varint": "^5.0.0" 121 | } 122 | }, 123 | "pump": { 124 | "version": "3.0.0", 125 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 126 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 127 | "requires": { 128 | "end-of-stream": "^1.1.0", 129 | "once": "^1.3.1" 130 | } 131 | }, 132 | "readable-stream": { 133 | "version": "2.3.6", 134 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 135 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 136 | "requires": { 137 | "core-util-is": "~1.0.0", 138 | "inherits": "~2.0.3", 139 | "isarray": "~1.0.0", 140 | "process-nextick-args": "~2.0.0", 141 | "safe-buffer": "~5.1.1", 142 | "string_decoder": "~1.1.1", 143 | "util-deprecate": "~1.0.1" 144 | } 145 | }, 146 | "safe-buffer": { 147 | "version": "5.1.2", 148 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 149 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 150 | }, 151 | "signed-varint": { 152 | "version": "2.0.1", 153 | "resolved": "https://registry.npmjs.org/signed-varint/-/signed-varint-2.0.1.tgz", 154 | "integrity": "sha1-UKmYnafJjCxh2tEZvJdHDvhSgSk=", 155 | "requires": { 156 | "varint": "~5.0.0" 157 | } 158 | }, 159 | "siphash24": { 160 | "version": "1.1.1", 161 | "resolved": "https://registry.npmjs.org/siphash24/-/siphash24-1.1.1.tgz", 162 | "integrity": "sha512-dKKwjIoTOa587TARYLlBRXq2lkbu5Iz35XrEVWpelhBP1m8r2BGOy1QlaZe84GTFHG/BTucEUd2btnNc8QzIVA==", 163 | "requires": { 164 | "nanoassert": "^1.0.0" 165 | } 166 | }, 167 | "sodium-javascript": { 168 | "version": "0.5.5", 169 | "resolved": "https://registry.npmjs.org/sodium-javascript/-/sodium-javascript-0.5.5.tgz", 170 | "integrity": "sha512-UMmCHovws/sxIBZsIRhIl8uRPou/RFDD0vVop81T1hG106NLLgqajKKuHAOtAP6hflnZ0UrVA2VFwddTd/NQyA==", 171 | "requires": { 172 | "blake2b": "^2.1.1", 173 | "nanoassert": "^1.0.0", 174 | "siphash24": "^1.0.1", 175 | "xsalsa20": "^1.0.0" 176 | } 177 | }, 178 | "sodium-native": { 179 | "version": "2.2.2", 180 | "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-2.2.2.tgz", 181 | "integrity": "sha512-TdAa+PlmWki2Spx3TJyGFVkj6gLsxs5HV/i/j2COZ5INEaCmLz15NIHgUAT/GQ0KrG8Ddy6tkvuP7B5YJpmW6g==", 182 | "optional": true, 183 | "requires": { 184 | "ini": "^1.3.5", 185 | "nan": "^2.4.0", 186 | "node-gyp-build": "^3.0.0" 187 | } 188 | }, 189 | "sodium-universal": { 190 | "version": "2.0.0", 191 | "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-2.0.0.tgz", 192 | "integrity": "sha512-csdVyakzHJRyCevY4aZC2Eacda8paf+4nmRGF2N7KxCLKY2Ajn72JsExaQlJQ2BiXJncp44p3T+b80cU+2TTsg==", 193 | "requires": { 194 | "sodium-javascript": "~0.5.0", 195 | "sodium-native": "^2.0.0" 196 | } 197 | }, 198 | "sorted-indexof": { 199 | "version": "1.0.0", 200 | "resolved": "https://registry.npmjs.org/sorted-indexof/-/sorted-indexof-1.0.0.tgz", 201 | "integrity": "sha1-F8dC/3zxh+L1mhXfm4HxemLOCJk=" 202 | }, 203 | "string_decoder": { 204 | "version": "1.1.1", 205 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 206 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 207 | "requires": { 208 | "safe-buffer": "~5.1.0" 209 | } 210 | }, 211 | "typescript": { 212 | "version": "3.1.5", 213 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.5.tgz", 214 | "integrity": "sha512-muYNWV9j5+3mXoKD6oPONKuGUmYiFX14gfo9lWm9ZXRHOqVDQiB4q1CzFPbF4QLV2E9TZXH6oK55oQ94rn3PpA==", 215 | "dev": true 216 | }, 217 | "util-deprecate": { 218 | "version": "1.0.2", 219 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 220 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 221 | }, 222 | "varint": { 223 | "version": "5.0.0", 224 | "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", 225 | "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=" 226 | }, 227 | "wrappy": { 228 | "version": "1.0.2", 229 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 230 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 231 | }, 232 | "xsalsa20": { 233 | "version": "1.0.2", 234 | "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.0.2.tgz", 235 | "integrity": "sha512-g1DFmZ5JJ9Qzvt4dMw6m9IydqoCSP381ucU5zm46Owbk3bwmqAr8eEJirOPc7PrXRn45drzOpAyDp8jsnoyXyw==" 236 | } 237 | } 238 | } 239 | -------------------------------------------------------------------------------- /web/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sammacbeth/discovery-swarm-web", 3 | "version": "1.0.9", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@sammacbeth/discovery-swarm": { 8 | "version": "1.0.9", 9 | "resolved": "https://registry.npmjs.org/@sammacbeth/discovery-swarm/-/discovery-swarm-1.0.9.tgz", 10 | "integrity": "sha512-NNeeYYyBWlfImfYrLQSkIrtayb6nADSTWLltDDMagBgUWWi3rqRULdWo8dx4XYjPGQSQrwsuzidFuYKc8EOo9Q==", 11 | "requires": { 12 | "hypercore-protocol": "^6.7.1", 13 | "pump": "^3.0.0" 14 | }, 15 | "dependencies": { 16 | "pump": { 17 | "version": "3.0.0", 18 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 19 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 20 | "requires": { 21 | "end-of-stream": "^1.1.0", 22 | "once": "^1.3.1" 23 | } 24 | } 25 | } 26 | }, 27 | "@types/node": { 28 | "version": "10.12.1", 29 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.1.tgz", 30 | "integrity": "sha512-i1sl+WCX2OCHeUi9oi7PiCNUtYFrpWhpcx878vpeq/tlZTKzcFdHePlyFHVbWqeuKN0SRPl/9ZFDSTsfv9h7VQ==", 31 | "dev": true 32 | }, 33 | "ajv": { 34 | "version": "5.5.2", 35 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 36 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 37 | "requires": { 38 | "co": "^4.6.0", 39 | "fast-deep-equal": "^1.0.0", 40 | "fast-json-stable-stringify": "^2.0.0", 41 | "json-schema-traverse": "^0.3.0" 42 | } 43 | }, 44 | "ap": { 45 | "version": "0.1.0", 46 | "resolved": "https://registry.npmjs.org/ap/-/ap-0.1.0.tgz", 47 | "integrity": "sha1-2KPyZhU3k5ihtTymzBpmag+/4VA=" 48 | }, 49 | "asn1": { 50 | "version": "0.2.4", 51 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 52 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 53 | "requires": { 54 | "safer-buffer": "~2.1.0" 55 | } 56 | }, 57 | "assert-plus": { 58 | "version": "1.0.0", 59 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 60 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 61 | }, 62 | "async-limiter": { 63 | "version": "1.0.0", 64 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", 65 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" 66 | }, 67 | "asynckit": { 68 | "version": "0.4.0", 69 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 70 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 71 | }, 72 | "aws-sign2": { 73 | "version": "0.7.0", 74 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 75 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 76 | }, 77 | "aws4": { 78 | "version": "1.8.0", 79 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 80 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" 81 | }, 82 | "bcrypt-pbkdf": { 83 | "version": "1.0.2", 84 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 85 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 86 | "requires": { 87 | "tweetnacl": "^0.14.3" 88 | } 89 | }, 90 | "blake2b": { 91 | "version": "2.1.3", 92 | "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.3.tgz", 93 | "integrity": "sha512-pkDss4xFVbMb4270aCyGD3qLv92314Et+FsKzilCLxDz5DuZ2/1g3w4nmBbu6nKApPspnjG7JcwTjGZnduB1yg==", 94 | "requires": { 95 | "blake2b-wasm": "^1.1.0", 96 | "nanoassert": "^1.0.0" 97 | } 98 | }, 99 | "blake2b-wasm": { 100 | "version": "1.1.7", 101 | "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-1.1.7.tgz", 102 | "integrity": "sha512-oFIHvXhlz/DUgF0kq5B1CqxIDjIJwh9iDeUUGQUcvgiGz7Wdw03McEO7CfLBy7QKGdsydcMCgO9jFNBAFCtFcA==", 103 | "requires": { 104 | "nanoassert": "^1.0.0" 105 | } 106 | }, 107 | "body": { 108 | "version": "0.1.0", 109 | "resolved": "https://registry.npmjs.org/body/-/body-0.1.0.tgz", 110 | "integrity": "sha1-5xT+KM2ISKo0zfLJ8kK74uFdHNg=", 111 | "requires": { 112 | "content-types": "~0.1.0" 113 | } 114 | }, 115 | "buffer-alloc-unsafe": { 116 | "version": "1.1.0", 117 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 118 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" 119 | }, 120 | "buffer-from": { 121 | "version": "1.1.1", 122 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 123 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 124 | }, 125 | "caseless": { 126 | "version": "0.12.0", 127 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 128 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 129 | }, 130 | "co": { 131 | "version": "4.6.0", 132 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 133 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 134 | }, 135 | "combined-stream": { 136 | "version": "1.0.7", 137 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", 138 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", 139 | "requires": { 140 | "delayed-stream": "~1.0.0" 141 | } 142 | }, 143 | "content-types": { 144 | "version": "0.1.0", 145 | "resolved": "https://registry.npmjs.org/content-types/-/content-types-0.1.0.tgz", 146 | "integrity": "sha1-DnkLOr/vkPbst3roWF25CZyvdXg=", 147 | "requires": { 148 | "iterators": "~0.1.0" 149 | } 150 | }, 151 | "core-util-is": { 152 | "version": "1.0.2", 153 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 154 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 155 | }, 156 | "corsify": { 157 | "version": "2.1.0", 158 | "resolved": "https://registry.npmjs.org/corsify/-/corsify-2.1.0.tgz", 159 | "integrity": "sha1-EaRbxHqzDFTQC7hp6hgC+82aCdA=", 160 | "requires": { 161 | "http-methods": "~0.1.0" 162 | } 163 | }, 164 | "dashdash": { 165 | "version": "1.14.1", 166 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 167 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 168 | "requires": { 169 | "assert-plus": "^1.0.0" 170 | } 171 | }, 172 | "debug": { 173 | "version": "3.2.6", 174 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 175 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 176 | "requires": { 177 | "ms": "^2.1.1" 178 | } 179 | }, 180 | "delayed-stream": { 181 | "version": "1.0.0", 182 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 183 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 184 | }, 185 | "dom-walk": { 186 | "version": "0.1.1", 187 | "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", 188 | "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" 189 | }, 190 | "duplexify": { 191 | "version": "3.6.1", 192 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", 193 | "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", 194 | "requires": { 195 | "end-of-stream": "^1.0.0", 196 | "inherits": "^2.0.1", 197 | "readable-stream": "^2.0.0", 198 | "stream-shift": "^1.0.0" 199 | } 200 | }, 201 | "ecc-jsbn": { 202 | "version": "0.1.2", 203 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 204 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 205 | "requires": { 206 | "jsbn": "~0.1.0", 207 | "safer-buffer": "^2.1.0" 208 | } 209 | }, 210 | "end-of-stream": { 211 | "version": "1.4.1", 212 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 213 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 214 | "requires": { 215 | "once": "^1.4.0" 216 | } 217 | }, 218 | "event-source-stream": { 219 | "version": "1.6.0", 220 | "resolved": "https://registry.npmjs.org/event-source-stream/-/event-source-stream-1.6.0.tgz", 221 | "integrity": "sha512-8IUJAGKSIQAwJegCZ3xhn+9FSKFlPcFejW5/UCkGXBqKlJlTm/QI9W3dkFmzWbfCt2kNPcQYO4pechKUoUIIQg==", 222 | "requires": { 223 | "once": "^1.3.1", 224 | "readable-stream": "^2.2.2", 225 | "request": "^2.36.0", 226 | "split2": "^0.1.2" 227 | } 228 | }, 229 | "extend": { 230 | "version": "3.0.2", 231 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 232 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 233 | }, 234 | "extsprintf": { 235 | "version": "1.3.0", 236 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 237 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 238 | }, 239 | "fast-deep-equal": { 240 | "version": "1.1.0", 241 | "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 242 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" 243 | }, 244 | "fast-json-stable-stringify": { 245 | "version": "2.0.0", 246 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 247 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 248 | }, 249 | "for-each": { 250 | "version": "0.3.3", 251 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 252 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 253 | "requires": { 254 | "is-callable": "^1.1.3" 255 | } 256 | }, 257 | "forever-agent": { 258 | "version": "0.6.1", 259 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 260 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 261 | }, 262 | "form-data": { 263 | "version": "2.3.3", 264 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 265 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 266 | "requires": { 267 | "asynckit": "^0.4.0", 268 | "combined-stream": "^1.0.6", 269 | "mime-types": "^2.1.12" 270 | } 271 | }, 272 | "get-browser-rtc": { 273 | "version": "1.0.2", 274 | "resolved": "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.0.2.tgz", 275 | "integrity": "sha1-u81AyEUaftTvXDc7gWmkCd0dEdk=" 276 | }, 277 | "getpass": { 278 | "version": "0.1.7", 279 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 280 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 281 | "requires": { 282 | "assert-plus": "^1.0.0" 283 | } 284 | }, 285 | "global": { 286 | "version": "4.3.2", 287 | "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", 288 | "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", 289 | "requires": { 290 | "min-document": "^2.19.0", 291 | "process": "~0.5.1" 292 | } 293 | }, 294 | "har-schema": { 295 | "version": "2.0.0", 296 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 297 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 298 | }, 299 | "har-validator": { 300 | "version": "5.1.0", 301 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", 302 | "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", 303 | "requires": { 304 | "ajv": "^5.3.0", 305 | "har-schema": "^2.0.0" 306 | } 307 | }, 308 | "http-methods": { 309 | "version": "0.1.0", 310 | "resolved": "https://registry.npmjs.org/http-methods/-/http-methods-0.1.0.tgz", 311 | "integrity": "sha1-KWkbb8WPT36Bo2BdyoJoKwaORDA=", 312 | "requires": { 313 | "body": "~0.1.0", 314 | "content-types": "~0.1.0" 315 | } 316 | }, 317 | "http-signature": { 318 | "version": "1.2.0", 319 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 320 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 321 | "requires": { 322 | "assert-plus": "^1.0.0", 323 | "jsprim": "^1.2.2", 324 | "sshpk": "^1.7.0" 325 | } 326 | }, 327 | "hypercore-protocol": { 328 | "version": "6.7.1", 329 | "resolved": "https://registry.npmjs.org/hypercore-protocol/-/hypercore-protocol-6.7.1.tgz", 330 | "integrity": "sha512-6jjMwL/XgeAl9BDUWmAJmIum7ynHGqajCnXt5VbJuxNLKkPI8WQS2kpMfcvotI5QHKMu/15+92ZPM6WoYDtd8g==", 331 | "requires": { 332 | "buffer-alloc-unsafe": "^1.0.0", 333 | "buffer-from": "^1.0.0", 334 | "inherits": "^2.0.3", 335 | "protocol-buffers-encodings": "^1.1.0", 336 | "readable-stream": "^2.2.6", 337 | "sodium-universal": "^2.0.0", 338 | "sorted-indexof": "^1.0.0", 339 | "varint": "^5.0.0" 340 | } 341 | }, 342 | "inherits": { 343 | "version": "2.0.3", 344 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 345 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 346 | }, 347 | "ini": { 348 | "version": "1.3.5", 349 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 350 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 351 | "optional": true 352 | }, 353 | "is-callable": { 354 | "version": "1.1.4", 355 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 356 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" 357 | }, 358 | "is-function": { 359 | "version": "1.0.1", 360 | "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", 361 | "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" 362 | }, 363 | "is-typedarray": { 364 | "version": "1.0.0", 365 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 366 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 367 | }, 368 | "isarray": { 369 | "version": "1.0.0", 370 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 371 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 372 | }, 373 | "isstream": { 374 | "version": "0.1.2", 375 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 376 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 377 | }, 378 | "iterators": { 379 | "version": "0.1.0", 380 | "resolved": "https://registry.npmjs.org/iterators/-/iterators-0.1.0.tgz", 381 | "integrity": "sha1-0D9mbKTmEwE4VlmXys6lQWQgMVY=", 382 | "requires": { 383 | "ap": "~0.1.0" 384 | } 385 | }, 386 | "jsbn": { 387 | "version": "0.1.1", 388 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 389 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 390 | }, 391 | "json-schema": { 392 | "version": "0.2.3", 393 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 394 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 395 | }, 396 | "json-schema-traverse": { 397 | "version": "0.3.1", 398 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 399 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" 400 | }, 401 | "json-stringify-safe": { 402 | "version": "5.0.1", 403 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 404 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 405 | }, 406 | "jsprim": { 407 | "version": "1.4.1", 408 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 409 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 410 | "requires": { 411 | "assert-plus": "1.0.0", 412 | "extsprintf": "1.3.0", 413 | "json-schema": "0.2.3", 414 | "verror": "1.10.0" 415 | } 416 | }, 417 | "mime-db": { 418 | "version": "1.37.0", 419 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 420 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" 421 | }, 422 | "mime-types": { 423 | "version": "2.1.21", 424 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 425 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 426 | "requires": { 427 | "mime-db": "~1.37.0" 428 | } 429 | }, 430 | "min-document": { 431 | "version": "2.19.0", 432 | "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", 433 | "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", 434 | "requires": { 435 | "dom-walk": "^0.1.0" 436 | } 437 | }, 438 | "minimist": { 439 | "version": "1.2.0", 440 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 441 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 442 | }, 443 | "ms": { 444 | "version": "2.1.1", 445 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 446 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 447 | }, 448 | "nan": { 449 | "version": "2.11.1", 450 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", 451 | "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", 452 | "optional": true 453 | }, 454 | "nanoassert": { 455 | "version": "1.1.0", 456 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-1.1.0.tgz", 457 | "integrity": "sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40=" 458 | }, 459 | "nets": { 460 | "version": "3.2.0", 461 | "resolved": "https://registry.npmjs.org/nets/-/nets-3.2.0.tgz", 462 | "integrity": "sha1-1RH7q3rxHaAT8huX7pF0fTOFLTg=", 463 | "requires": { 464 | "request": "^2.65.0", 465 | "xhr": "^2.1.0" 466 | } 467 | }, 468 | "node-gyp-build": { 469 | "version": "3.5.0", 470 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.5.0.tgz", 471 | "integrity": "sha512-qjEE8eIWVyqZhkAFUzytGpOGvLHeX5kXBB6MYyTOCPZBrBlsLyXAAzTsp/hWMbVlg8kVpzDJCZZowIrnKpwmqQ==", 472 | "optional": true 473 | }, 474 | "oauth-sign": { 475 | "version": "0.9.0", 476 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 477 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 478 | }, 479 | "object-keys": { 480 | "version": "0.4.0", 481 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", 482 | "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" 483 | }, 484 | "once": { 485 | "version": "1.4.0", 486 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 487 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 488 | "requires": { 489 | "wrappy": "1" 490 | } 491 | }, 492 | "parse-headers": { 493 | "version": "2.0.1", 494 | "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", 495 | "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", 496 | "requires": { 497 | "for-each": "^0.3.2", 498 | "trim": "0.0.1" 499 | } 500 | }, 501 | "performance-now": { 502 | "version": "2.1.0", 503 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 504 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 505 | }, 506 | "process": { 507 | "version": "0.5.2", 508 | "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", 509 | "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" 510 | }, 511 | "process-nextick-args": { 512 | "version": "2.0.0", 513 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 514 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 515 | }, 516 | "protocol-buffers-encodings": { 517 | "version": "1.1.0", 518 | "resolved": "https://registry.npmjs.org/protocol-buffers-encodings/-/protocol-buffers-encodings-1.1.0.tgz", 519 | "integrity": "sha512-SmjEuAf3hc3h3rWZ6V1YaaQw2MNJWK848gLJgzx/sefOJdNLujKinJVXIS0q2cBQpQn2Q32TinawZyDZPzm4kQ==", 520 | "requires": { 521 | "signed-varint": "^2.0.1", 522 | "varint": "^5.0.0" 523 | } 524 | }, 525 | "psl": { 526 | "version": "1.1.29", 527 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", 528 | "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" 529 | }, 530 | "pump": { 531 | "version": "1.0.3", 532 | "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", 533 | "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", 534 | "requires": { 535 | "end-of-stream": "^1.1.0", 536 | "once": "^1.3.1" 537 | } 538 | }, 539 | "punycode": { 540 | "version": "1.4.1", 541 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 542 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 543 | }, 544 | "qs": { 545 | "version": "6.5.2", 546 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 547 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 548 | }, 549 | "random-iterate": { 550 | "version": "1.0.1", 551 | "resolved": "https://registry.npmjs.org/random-iterate/-/random-iterate-1.0.1.tgz", 552 | "integrity": "sha1-99l9kt7mZl7F9toIx/ljytSyrJk=" 553 | }, 554 | "randombytes": { 555 | "version": "2.0.6", 556 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", 557 | "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", 558 | "requires": { 559 | "safe-buffer": "^5.1.0" 560 | } 561 | }, 562 | "readable-stream": { 563 | "version": "2.3.6", 564 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 565 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 566 | "requires": { 567 | "core-util-is": "~1.0.0", 568 | "inherits": "~2.0.3", 569 | "isarray": "~1.0.0", 570 | "process-nextick-args": "~2.0.0", 571 | "safe-buffer": "~5.1.1", 572 | "string_decoder": "~1.1.1", 573 | "util-deprecate": "~1.0.1" 574 | } 575 | }, 576 | "request": { 577 | "version": "2.88.0", 578 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 579 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 580 | "requires": { 581 | "aws-sign2": "~0.7.0", 582 | "aws4": "^1.8.0", 583 | "caseless": "~0.12.0", 584 | "combined-stream": "~1.0.6", 585 | "extend": "~3.0.2", 586 | "forever-agent": "~0.6.1", 587 | "form-data": "~2.3.2", 588 | "har-validator": "~5.1.0", 589 | "http-signature": "~1.2.0", 590 | "is-typedarray": "~1.0.0", 591 | "isstream": "~0.1.2", 592 | "json-stringify-safe": "~5.0.1", 593 | "mime-types": "~2.1.19", 594 | "oauth-sign": "~0.9.0", 595 | "performance-now": "^2.1.0", 596 | "qs": "~6.5.2", 597 | "safe-buffer": "^5.1.2", 598 | "tough-cookie": "~2.4.3", 599 | "tunnel-agent": "^0.6.0", 600 | "uuid": "^3.3.2" 601 | } 602 | }, 603 | "safe-buffer": { 604 | "version": "5.1.2", 605 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 606 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 607 | }, 608 | "safer-buffer": { 609 | "version": "2.1.2", 610 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 611 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 612 | }, 613 | "signalhub": { 614 | "version": "4.9.0", 615 | "resolved": "https://registry.npmjs.org/signalhub/-/signalhub-4.9.0.tgz", 616 | "integrity": "sha512-qi5uv7vYIbpVyIeDH5tJdIAmrQkXdK1D75QL4otFgJNGBVACE6/pYh9Dl8NQexCy8J2XWtK+TJjQRJptkE1cpw==", 617 | "requires": { 618 | "corsify": "^2.1.0", 619 | "end-of-stream": "^1.1.0", 620 | "event-source-stream": "^1.3.1", 621 | "inherits": "^2.0.1", 622 | "minimist": "^1.1.1", 623 | "nets": "^3.1.0", 624 | "pump": "^1.0.0", 625 | "random-iterate": "^1.0.1", 626 | "size-limit-stream": "^1.0.0", 627 | "stream-collector": "^1.0.1", 628 | "through2": "^0.6.5" 629 | } 630 | }, 631 | "signed-varint": { 632 | "version": "2.0.1", 633 | "resolved": "https://registry.npmjs.org/signed-varint/-/signed-varint-2.0.1.tgz", 634 | "integrity": "sha1-UKmYnafJjCxh2tEZvJdHDvhSgSk=", 635 | "requires": { 636 | "varint": "~5.0.0" 637 | } 638 | }, 639 | "simple-peer": { 640 | "version": "9.1.2", 641 | "resolved": "https://registry.npmjs.org/simple-peer/-/simple-peer-9.1.2.tgz", 642 | "integrity": "sha512-MUWWno5o5cvISKOH4pYQ18PQJLpDaNWoKUbrPPKuspCLCkkh+zhtuQyTE8h2U2Ags+/OUN5wnUe92+9B8/Sm2Q==", 643 | "requires": { 644 | "debug": "^3.1.0", 645 | "get-browser-rtc": "^1.0.0", 646 | "inherits": "^2.0.1", 647 | "randombytes": "^2.0.3", 648 | "readable-stream": "^2.3.4" 649 | } 650 | }, 651 | "siphash24": { 652 | "version": "1.1.1", 653 | "resolved": "https://registry.npmjs.org/siphash24/-/siphash24-1.1.1.tgz", 654 | "integrity": "sha512-dKKwjIoTOa587TARYLlBRXq2lkbu5Iz35XrEVWpelhBP1m8r2BGOy1QlaZe84GTFHG/BTucEUd2btnNc8QzIVA==", 655 | "requires": { 656 | "nanoassert": "^1.0.0" 657 | } 658 | }, 659 | "size-limit-stream": { 660 | "version": "1.0.0", 661 | "resolved": "https://registry.npmjs.org/size-limit-stream/-/size-limit-stream-1.0.0.tgz", 662 | "integrity": "sha1-HsJLrQFVDohV7im/A2vtjp7gXcM=", 663 | "requires": { 664 | "through2": "^0.6.3" 665 | } 666 | }, 667 | "sodium-javascript": { 668 | "version": "0.5.5", 669 | "resolved": "https://registry.npmjs.org/sodium-javascript/-/sodium-javascript-0.5.5.tgz", 670 | "integrity": "sha512-UMmCHovws/sxIBZsIRhIl8uRPou/RFDD0vVop81T1hG106NLLgqajKKuHAOtAP6hflnZ0UrVA2VFwddTd/NQyA==", 671 | "requires": { 672 | "blake2b": "^2.1.1", 673 | "nanoassert": "^1.0.0", 674 | "siphash24": "^1.0.1", 675 | "xsalsa20": "^1.0.0" 676 | } 677 | }, 678 | "sodium-native": { 679 | "version": "2.2.3", 680 | "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-2.2.3.tgz", 681 | "integrity": "sha512-0rQvKwlWW86YmmAhosnJ6/2PR3mdAtfuWW147L4x3/gwfL7XiJ7mf2BPvBwU16vsYQNY1yxOQg9YT/MN6qoZOA==", 682 | "optional": true, 683 | "requires": { 684 | "ini": "^1.3.5", 685 | "nan": "^2.4.0", 686 | "node-gyp-build": "^3.0.0" 687 | } 688 | }, 689 | "sodium-universal": { 690 | "version": "2.0.0", 691 | "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-2.0.0.tgz", 692 | "integrity": "sha512-csdVyakzHJRyCevY4aZC2Eacda8paf+4nmRGF2N7KxCLKY2Ajn72JsExaQlJQ2BiXJncp44p3T+b80cU+2TTsg==", 693 | "requires": { 694 | "sodium-javascript": "~0.5.0", 695 | "sodium-native": "^2.0.0" 696 | } 697 | }, 698 | "sorted-indexof": { 699 | "version": "1.0.0", 700 | "resolved": "https://registry.npmjs.org/sorted-indexof/-/sorted-indexof-1.0.0.tgz", 701 | "integrity": "sha1-F8dC/3zxh+L1mhXfm4HxemLOCJk=" 702 | }, 703 | "split2": { 704 | "version": "0.1.2", 705 | "resolved": "https://registry.npmjs.org/split2/-/split2-0.1.2.tgz", 706 | "integrity": "sha1-pNVguR8EFo8hzZvdVptveNUWRZM=", 707 | "requires": { 708 | "through2": "~0.4.1" 709 | }, 710 | "dependencies": { 711 | "isarray": { 712 | "version": "0.0.1", 713 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 714 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 715 | }, 716 | "readable-stream": { 717 | "version": "1.0.34", 718 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 719 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 720 | "requires": { 721 | "core-util-is": "~1.0.0", 722 | "inherits": "~2.0.1", 723 | "isarray": "0.0.1", 724 | "string_decoder": "~0.10.x" 725 | } 726 | }, 727 | "string_decoder": { 728 | "version": "0.10.31", 729 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 730 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 731 | }, 732 | "through2": { 733 | "version": "0.4.2", 734 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", 735 | "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", 736 | "requires": { 737 | "readable-stream": "~1.0.17", 738 | "xtend": "~2.1.1" 739 | } 740 | } 741 | } 742 | }, 743 | "sshpk": { 744 | "version": "1.15.2", 745 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", 746 | "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", 747 | "requires": { 748 | "asn1": "~0.2.3", 749 | "assert-plus": "^1.0.0", 750 | "bcrypt-pbkdf": "^1.0.0", 751 | "dashdash": "^1.12.0", 752 | "ecc-jsbn": "~0.1.1", 753 | "getpass": "^0.1.1", 754 | "jsbn": "~0.1.0", 755 | "safer-buffer": "^2.0.2", 756 | "tweetnacl": "~0.14.0" 757 | } 758 | }, 759 | "stream-collector": { 760 | "version": "1.0.1", 761 | "resolved": "https://registry.npmjs.org/stream-collector/-/stream-collector-1.0.1.tgz", 762 | "integrity": "sha1-TU5V8XE1YSGyxfZVn5RHBaso2xU=", 763 | "requires": { 764 | "once": "^1.3.1" 765 | } 766 | }, 767 | "stream-shift": { 768 | "version": "1.0.0", 769 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", 770 | "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" 771 | }, 772 | "string_decoder": { 773 | "version": "1.1.1", 774 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 775 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 776 | "requires": { 777 | "safe-buffer": "~5.1.0" 778 | } 779 | }, 780 | "through2": { 781 | "version": "0.6.5", 782 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", 783 | "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", 784 | "requires": { 785 | "readable-stream": ">=1.0.33-1 <1.1.0-0", 786 | "xtend": ">=4.0.0 <4.1.0-0" 787 | }, 788 | "dependencies": { 789 | "isarray": { 790 | "version": "0.0.1", 791 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 792 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 793 | }, 794 | "readable-stream": { 795 | "version": "1.0.34", 796 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 797 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 798 | "requires": { 799 | "core-util-is": "~1.0.0", 800 | "inherits": "~2.0.1", 801 | "isarray": "0.0.1", 802 | "string_decoder": "~0.10.x" 803 | } 804 | }, 805 | "string_decoder": { 806 | "version": "0.10.31", 807 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 808 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 809 | }, 810 | "xtend": { 811 | "version": "4.0.1", 812 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 813 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 814 | } 815 | } 816 | }, 817 | "tough-cookie": { 818 | "version": "2.4.3", 819 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 820 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 821 | "requires": { 822 | "psl": "^1.1.24", 823 | "punycode": "^1.4.1" 824 | } 825 | }, 826 | "trim": { 827 | "version": "0.0.1", 828 | "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", 829 | "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" 830 | }, 831 | "tunnel-agent": { 832 | "version": "0.6.0", 833 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 834 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 835 | "requires": { 836 | "safe-buffer": "^5.0.1" 837 | } 838 | }, 839 | "tweetnacl": { 840 | "version": "0.14.5", 841 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 842 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 843 | }, 844 | "typescript": { 845 | "version": "3.1.5", 846 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.5.tgz", 847 | "integrity": "sha512-muYNWV9j5+3mXoKD6oPONKuGUmYiFX14gfo9lWm9ZXRHOqVDQiB4q1CzFPbF4QLV2E9TZXH6oK55oQ94rn3PpA==", 848 | "dev": true 849 | }, 850 | "ultron": { 851 | "version": "1.1.1", 852 | "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", 853 | "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" 854 | }, 855 | "util-deprecate": { 856 | "version": "1.0.2", 857 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 858 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 859 | }, 860 | "uuid": { 861 | "version": "3.3.2", 862 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 863 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 864 | }, 865 | "varint": { 866 | "version": "5.0.0", 867 | "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", 868 | "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=" 869 | }, 870 | "verror": { 871 | "version": "1.10.0", 872 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 873 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 874 | "requires": { 875 | "assert-plus": "^1.0.0", 876 | "core-util-is": "1.0.2", 877 | "extsprintf": "^1.2.0" 878 | } 879 | }, 880 | "websocket-stream": { 881 | "version": "5.1.2", 882 | "resolved": "https://registry.npmjs.org/websocket-stream/-/websocket-stream-5.1.2.tgz", 883 | "integrity": "sha512-lchLOk435iDWs0jNuL+hiU14i3ERSrMA0IKSiJh7z6X/i4XNsutBZrtqu2CPOZuA4G/zabiqVAos0vW+S7GEVw==", 884 | "requires": { 885 | "duplexify": "^3.5.1", 886 | "inherits": "^2.0.1", 887 | "readable-stream": "^2.3.3", 888 | "safe-buffer": "^5.1.1", 889 | "ws": "^3.2.0", 890 | "xtend": "^4.0.0" 891 | }, 892 | "dependencies": { 893 | "xtend": { 894 | "version": "4.0.1", 895 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 896 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 897 | } 898 | } 899 | }, 900 | "wrappy": { 901 | "version": "1.0.2", 902 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 903 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 904 | }, 905 | "ws": { 906 | "version": "3.3.3", 907 | "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", 908 | "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", 909 | "requires": { 910 | "async-limiter": "~1.0.0", 911 | "safe-buffer": "~5.1.0", 912 | "ultron": "~1.1.0" 913 | } 914 | }, 915 | "xhr": { 916 | "version": "2.5.0", 917 | "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", 918 | "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", 919 | "requires": { 920 | "global": "~4.3.0", 921 | "is-function": "^1.0.1", 922 | "parse-headers": "^2.0.0", 923 | "xtend": "^4.0.0" 924 | }, 925 | "dependencies": { 926 | "xtend": { 927 | "version": "4.0.1", 928 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 929 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 930 | } 931 | } 932 | }, 933 | "xsalsa20": { 934 | "version": "1.0.2", 935 | "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.0.2.tgz", 936 | "integrity": "sha512-g1DFmZ5JJ9Qzvt4dMw6m9IydqoCSP381ucU5zm46Owbk3bwmqAr8eEJirOPc7PrXRn45drzOpAyDp8jsnoyXyw==" 937 | }, 938 | "xtend": { 939 | "version": "2.1.2", 940 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", 941 | "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", 942 | "requires": { 943 | "object-keys": "~0.4.0" 944 | } 945 | } 946 | } 947 | } 948 | -------------------------------------------------------------------------------- /webext/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sammacbeth/discovery-swarm-webext", 3 | "version": "1.0.9", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@sammacbeth/libdweb": { 8 | "version": "0.0.2", 9 | "resolved": "https://registry.npmjs.org/@sammacbeth/libdweb/-/libdweb-0.0.2.tgz", 10 | "integrity": "sha512-rYFICSAL1A+BjRLxsvgIs1DxV8XmQtZdkBFwV9vLSyiszEaFs/cIiDWD2s0NtzN30i6PCgoiMKy0LwtbEsOJ7A==" 11 | }, 12 | "JSONStream": { 13 | "version": "1.3.5", 14 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", 15 | "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", 16 | "requires": { 17 | "jsonparse": "^1.2.0", 18 | "through": ">=2.2.7 <3" 19 | } 20 | }, 21 | "acorn": { 22 | "version": "6.0.2", 23 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.2.tgz", 24 | "integrity": "sha512-GXmKIvbrN3TV7aVqAzVFaMW8F8wzVX7voEBRO3bDA64+EX37YSayggRJP5Xig6HYHBkWKpFg9W5gg6orklubhg==" 25 | }, 26 | "acorn-dynamic-import": { 27 | "version": "4.0.0", 28 | "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", 29 | "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==" 30 | }, 31 | "acorn-node": { 32 | "version": "1.6.2", 33 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.6.2.tgz", 34 | "integrity": "sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg==", 35 | "requires": { 36 | "acorn": "^6.0.2", 37 | "acorn-dynamic-import": "^4.0.0", 38 | "acorn-walk": "^6.1.0", 39 | "xtend": "^4.0.1" 40 | } 41 | }, 42 | "acorn-walk": { 43 | "version": "6.1.0", 44 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.0.tgz", 45 | "integrity": "sha512-ugTb7Lq7u4GfWSqqpwE0bGyoBZNMTok/zDBXxfEG0QM50jNlGhIWjRC1pPN7bvV1anhF+bs+/gNcRw+o55Evbg==" 46 | }, 47 | "array-filter": { 48 | "version": "0.0.1", 49 | "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", 50 | "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" 51 | }, 52 | "array-map": { 53 | "version": "0.0.0", 54 | "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", 55 | "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" 56 | }, 57 | "array-reduce": { 58 | "version": "0.0.0", 59 | "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", 60 | "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" 61 | }, 62 | "asn1.js": { 63 | "version": "4.10.1", 64 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", 65 | "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", 66 | "requires": { 67 | "bn.js": "^4.0.0", 68 | "inherits": "^2.0.1", 69 | "minimalistic-assert": "^1.0.0" 70 | } 71 | }, 72 | "assert": { 73 | "version": "1.4.1", 74 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", 75 | "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", 76 | "requires": { 77 | "util": "0.10.3" 78 | }, 79 | "dependencies": { 80 | "inherits": { 81 | "version": "2.0.1", 82 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 83 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" 84 | }, 85 | "util": { 86 | "version": "0.10.3", 87 | "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", 88 | "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", 89 | "requires": { 90 | "inherits": "2.0.1" 91 | } 92 | } 93 | } 94 | }, 95 | "balanced-match": { 96 | "version": "1.0.0", 97 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 98 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 99 | }, 100 | "base64-js": { 101 | "version": "1.3.0", 102 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", 103 | "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" 104 | }, 105 | "bn.js": { 106 | "version": "4.11.8", 107 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", 108 | "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" 109 | }, 110 | "brace-expansion": { 111 | "version": "1.1.11", 112 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 113 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 114 | "requires": { 115 | "balanced-match": "^1.0.0", 116 | "concat-map": "0.0.1" 117 | } 118 | }, 119 | "brorand": { 120 | "version": "1.1.0", 121 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 122 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" 123 | }, 124 | "browser-pack": { 125 | "version": "6.1.0", 126 | "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", 127 | "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", 128 | "requires": { 129 | "JSONStream": "^1.0.3", 130 | "combine-source-map": "~0.8.0", 131 | "defined": "^1.0.0", 132 | "safe-buffer": "^5.1.1", 133 | "through2": "^2.0.0", 134 | "umd": "^3.0.0" 135 | } 136 | }, 137 | "browser-resolve": { 138 | "version": "1.11.3", 139 | "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", 140 | "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", 141 | "requires": { 142 | "resolve": "1.1.7" 143 | }, 144 | "dependencies": { 145 | "resolve": { 146 | "version": "1.1.7", 147 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 148 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" 149 | } 150 | } 151 | }, 152 | "browserify": { 153 | "version": "16.2.3", 154 | "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", 155 | "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", 156 | "requires": { 157 | "JSONStream": "^1.0.3", 158 | "assert": "^1.4.0", 159 | "browser-pack": "^6.0.1", 160 | "browser-resolve": "^1.11.0", 161 | "browserify-zlib": "~0.2.0", 162 | "buffer": "^5.0.2", 163 | "cached-path-relative": "^1.0.0", 164 | "concat-stream": "^1.6.0", 165 | "console-browserify": "^1.1.0", 166 | "constants-browserify": "~1.0.0", 167 | "crypto-browserify": "^3.0.0", 168 | "defined": "^1.0.0", 169 | "deps-sort": "^2.0.0", 170 | "domain-browser": "^1.2.0", 171 | "duplexer2": "~0.1.2", 172 | "events": "^2.0.0", 173 | "glob": "^7.1.0", 174 | "has": "^1.0.0", 175 | "htmlescape": "^1.1.0", 176 | "https-browserify": "^1.0.0", 177 | "inherits": "~2.0.1", 178 | "insert-module-globals": "^7.0.0", 179 | "labeled-stream-splicer": "^2.0.0", 180 | "mkdirp": "^0.5.0", 181 | "module-deps": "^6.0.0", 182 | "os-browserify": "~0.3.0", 183 | "parents": "^1.0.1", 184 | "path-browserify": "~0.0.0", 185 | "process": "~0.11.0", 186 | "punycode": "^1.3.2", 187 | "querystring-es3": "~0.2.0", 188 | "read-only-stream": "^2.0.0", 189 | "readable-stream": "^2.0.2", 190 | "resolve": "^1.1.4", 191 | "shasum": "^1.0.0", 192 | "shell-quote": "^1.6.1", 193 | "stream-browserify": "^2.0.0", 194 | "stream-http": "^2.0.0", 195 | "string_decoder": "^1.1.1", 196 | "subarg": "^1.0.0", 197 | "syntax-error": "^1.1.1", 198 | "through2": "^2.0.0", 199 | "timers-browserify": "^1.0.1", 200 | "tty-browserify": "0.0.1", 201 | "url": "~0.11.0", 202 | "util": "~0.10.1", 203 | "vm-browserify": "^1.0.0", 204 | "xtend": "^4.0.0" 205 | } 206 | }, 207 | "browserify-aes": { 208 | "version": "1.2.0", 209 | "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", 210 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", 211 | "requires": { 212 | "buffer-xor": "^1.0.3", 213 | "cipher-base": "^1.0.0", 214 | "create-hash": "^1.1.0", 215 | "evp_bytestokey": "^1.0.3", 216 | "inherits": "^2.0.1", 217 | "safe-buffer": "^5.0.1" 218 | } 219 | }, 220 | "browserify-cipher": { 221 | "version": "1.0.1", 222 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", 223 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", 224 | "requires": { 225 | "browserify-aes": "^1.0.4", 226 | "browserify-des": "^1.0.0", 227 | "evp_bytestokey": "^1.0.0" 228 | } 229 | }, 230 | "browserify-des": { 231 | "version": "1.0.2", 232 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", 233 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", 234 | "requires": { 235 | "cipher-base": "^1.0.1", 236 | "des.js": "^1.0.0", 237 | "inherits": "^2.0.1", 238 | "safe-buffer": "^5.1.2" 239 | } 240 | }, 241 | "browserify-rsa": { 242 | "version": "4.0.1", 243 | "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", 244 | "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", 245 | "requires": { 246 | "bn.js": "^4.1.0", 247 | "randombytes": "^2.0.1" 248 | } 249 | }, 250 | "browserify-sign": { 251 | "version": "4.0.4", 252 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", 253 | "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", 254 | "requires": { 255 | "bn.js": "^4.1.1", 256 | "browserify-rsa": "^4.0.0", 257 | "create-hash": "^1.1.0", 258 | "create-hmac": "^1.1.2", 259 | "elliptic": "^6.0.0", 260 | "inherits": "^2.0.1", 261 | "parse-asn1": "^5.0.0" 262 | } 263 | }, 264 | "browserify-zlib": { 265 | "version": "0.2.0", 266 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", 267 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", 268 | "requires": { 269 | "pako": "~1.0.5" 270 | } 271 | }, 272 | "buffer": { 273 | "version": "5.2.1", 274 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", 275 | "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", 276 | "requires": { 277 | "base64-js": "^1.0.2", 278 | "ieee754": "^1.1.4" 279 | } 280 | }, 281 | "buffer-from": { 282 | "version": "1.1.1", 283 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 284 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 285 | }, 286 | "buffer-xor": { 287 | "version": "1.0.3", 288 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", 289 | "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" 290 | }, 291 | "builtin-status-codes": { 292 | "version": "3.0.0", 293 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", 294 | "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" 295 | }, 296 | "cached-path-relative": { 297 | "version": "1.0.1", 298 | "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", 299 | "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=" 300 | }, 301 | "cipher-base": { 302 | "version": "1.0.4", 303 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", 304 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", 305 | "requires": { 306 | "inherits": "^2.0.1", 307 | "safe-buffer": "^5.0.1" 308 | } 309 | }, 310 | "combine-source-map": { 311 | "version": "0.8.0", 312 | "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", 313 | "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", 314 | "requires": { 315 | "convert-source-map": "~1.1.0", 316 | "inline-source-map": "~0.6.0", 317 | "lodash.memoize": "~3.0.3", 318 | "source-map": "~0.5.3" 319 | } 320 | }, 321 | "concat-map": { 322 | "version": "0.0.1", 323 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 324 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 325 | }, 326 | "concat-stream": { 327 | "version": "1.6.2", 328 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 329 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 330 | "requires": { 331 | "buffer-from": "^1.0.0", 332 | "inherits": "^2.0.3", 333 | "readable-stream": "^2.2.2", 334 | "typedarray": "^0.0.6" 335 | } 336 | }, 337 | "console-browserify": { 338 | "version": "1.1.0", 339 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", 340 | "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", 341 | "requires": { 342 | "date-now": "^0.1.4" 343 | } 344 | }, 345 | "constants-browserify": { 346 | "version": "1.0.0", 347 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", 348 | "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" 349 | }, 350 | "convert-source-map": { 351 | "version": "1.1.3", 352 | "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", 353 | "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" 354 | }, 355 | "core-util-is": { 356 | "version": "1.0.2", 357 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 358 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 359 | }, 360 | "create-ecdh": { 361 | "version": "4.0.3", 362 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", 363 | "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", 364 | "requires": { 365 | "bn.js": "^4.1.0", 366 | "elliptic": "^6.0.0" 367 | } 368 | }, 369 | "create-hash": { 370 | "version": "1.2.0", 371 | "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", 372 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", 373 | "requires": { 374 | "cipher-base": "^1.0.1", 375 | "inherits": "^2.0.1", 376 | "md5.js": "^1.3.4", 377 | "ripemd160": "^2.0.1", 378 | "sha.js": "^2.4.0" 379 | } 380 | }, 381 | "create-hmac": { 382 | "version": "1.1.7", 383 | "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", 384 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", 385 | "requires": { 386 | "cipher-base": "^1.0.3", 387 | "create-hash": "^1.1.0", 388 | "inherits": "^2.0.1", 389 | "ripemd160": "^2.0.0", 390 | "safe-buffer": "^5.0.1", 391 | "sha.js": "^2.4.8" 392 | } 393 | }, 394 | "crypto-browserify": { 395 | "version": "3.12.0", 396 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", 397 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", 398 | "requires": { 399 | "browserify-cipher": "^1.0.0", 400 | "browserify-sign": "^4.0.0", 401 | "create-ecdh": "^4.0.0", 402 | "create-hash": "^1.1.0", 403 | "create-hmac": "^1.1.0", 404 | "diffie-hellman": "^5.0.0", 405 | "inherits": "^2.0.1", 406 | "pbkdf2": "^3.0.3", 407 | "public-encrypt": "^4.0.0", 408 | "randombytes": "^2.0.0", 409 | "randomfill": "^1.0.3" 410 | } 411 | }, 412 | "date-now": { 413 | "version": "0.1.4", 414 | "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", 415 | "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" 416 | }, 417 | "defined": { 418 | "version": "1.0.0", 419 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 420 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" 421 | }, 422 | "deps-sort": { 423 | "version": "2.0.0", 424 | "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", 425 | "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", 426 | "requires": { 427 | "JSONStream": "^1.0.3", 428 | "shasum": "^1.0.0", 429 | "subarg": "^1.0.0", 430 | "through2": "^2.0.0" 431 | } 432 | }, 433 | "des.js": { 434 | "version": "1.0.0", 435 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", 436 | "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", 437 | "requires": { 438 | "inherits": "^2.0.1", 439 | "minimalistic-assert": "^1.0.0" 440 | } 441 | }, 442 | "detective": { 443 | "version": "5.1.0", 444 | "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz", 445 | "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==", 446 | "requires": { 447 | "acorn-node": "^1.3.0", 448 | "defined": "^1.0.0", 449 | "minimist": "^1.1.1" 450 | } 451 | }, 452 | "diffie-hellman": { 453 | "version": "5.0.3", 454 | "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", 455 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", 456 | "requires": { 457 | "bn.js": "^4.1.0", 458 | "miller-rabin": "^4.0.0", 459 | "randombytes": "^2.0.0" 460 | } 461 | }, 462 | "domain-browser": { 463 | "version": "1.2.0", 464 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", 465 | "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" 466 | }, 467 | "duplexer2": { 468 | "version": "0.1.4", 469 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", 470 | "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", 471 | "requires": { 472 | "readable-stream": "^2.0.2" 473 | } 474 | }, 475 | "elliptic": { 476 | "version": "6.4.1", 477 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", 478 | "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", 479 | "requires": { 480 | "bn.js": "^4.4.0", 481 | "brorand": "^1.0.1", 482 | "hash.js": "^1.0.0", 483 | "hmac-drbg": "^1.0.0", 484 | "inherits": "^2.0.1", 485 | "minimalistic-assert": "^1.0.0", 486 | "minimalistic-crypto-utils": "^1.0.0" 487 | } 488 | }, 489 | "events": { 490 | "version": "2.1.0", 491 | "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", 492 | "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==" 493 | }, 494 | "evp_bytestokey": { 495 | "version": "1.0.3", 496 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", 497 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", 498 | "requires": { 499 | "md5.js": "^1.3.4", 500 | "safe-buffer": "^5.1.1" 501 | } 502 | }, 503 | "fs.realpath": { 504 | "version": "1.0.0", 505 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 506 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 507 | }, 508 | "function-bind": { 509 | "version": "1.1.1", 510 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 511 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 512 | }, 513 | "get-assigned-identifiers": { 514 | "version": "1.2.0", 515 | "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", 516 | "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" 517 | }, 518 | "glob": { 519 | "version": "7.1.3", 520 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 521 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 522 | "requires": { 523 | "fs.realpath": "^1.0.0", 524 | "inflight": "^1.0.4", 525 | "inherits": "2", 526 | "minimatch": "^3.0.4", 527 | "once": "^1.3.0", 528 | "path-is-absolute": "^1.0.0" 529 | } 530 | }, 531 | "has": { 532 | "version": "1.0.3", 533 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 534 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 535 | "requires": { 536 | "function-bind": "^1.1.1" 537 | } 538 | }, 539 | "hash-base": { 540 | "version": "3.0.4", 541 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", 542 | "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", 543 | "requires": { 544 | "inherits": "^2.0.1", 545 | "safe-buffer": "^5.0.1" 546 | } 547 | }, 548 | "hash.js": { 549 | "version": "1.1.5", 550 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", 551 | "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", 552 | "requires": { 553 | "inherits": "^2.0.3", 554 | "minimalistic-assert": "^1.0.1" 555 | } 556 | }, 557 | "hmac-drbg": { 558 | "version": "1.0.1", 559 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 560 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 561 | "requires": { 562 | "hash.js": "^1.0.3", 563 | "minimalistic-assert": "^1.0.0", 564 | "minimalistic-crypto-utils": "^1.0.1" 565 | } 566 | }, 567 | "htmlescape": { 568 | "version": "1.1.1", 569 | "resolved": "http://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", 570 | "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=" 571 | }, 572 | "https-browserify": { 573 | "version": "1.0.0", 574 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", 575 | "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" 576 | }, 577 | "ieee754": { 578 | "version": "1.1.12", 579 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", 580 | "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" 581 | }, 582 | "inflight": { 583 | "version": "1.0.6", 584 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 585 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 586 | "requires": { 587 | "once": "^1.3.0", 588 | "wrappy": "1" 589 | } 590 | }, 591 | "inherits": { 592 | "version": "2.0.3", 593 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 594 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 595 | }, 596 | "inline-source-map": { 597 | "version": "0.6.2", 598 | "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", 599 | "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", 600 | "requires": { 601 | "source-map": "~0.5.3" 602 | } 603 | }, 604 | "insert-module-globals": { 605 | "version": "7.2.0", 606 | "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", 607 | "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", 608 | "requires": { 609 | "JSONStream": "^1.0.3", 610 | "acorn-node": "^1.5.2", 611 | "combine-source-map": "^0.8.0", 612 | "concat-stream": "^1.6.1", 613 | "is-buffer": "^1.1.0", 614 | "path-is-absolute": "^1.0.1", 615 | "process": "~0.11.0", 616 | "through2": "^2.0.0", 617 | "undeclared-identifiers": "^1.1.2", 618 | "xtend": "^4.0.0" 619 | } 620 | }, 621 | "is-buffer": { 622 | "version": "1.1.6", 623 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 624 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 625 | }, 626 | "isarray": { 627 | "version": "1.0.0", 628 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 629 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 630 | }, 631 | "json-stable-stringify": { 632 | "version": "0.0.1", 633 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", 634 | "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", 635 | "requires": { 636 | "jsonify": "~0.0.0" 637 | } 638 | }, 639 | "jsonify": { 640 | "version": "0.0.0", 641 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 642 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" 643 | }, 644 | "jsonparse": { 645 | "version": "1.3.1", 646 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", 647 | "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" 648 | }, 649 | "labeled-stream-splicer": { 650 | "version": "2.0.1", 651 | "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz", 652 | "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==", 653 | "requires": { 654 | "inherits": "^2.0.1", 655 | "isarray": "^2.0.4", 656 | "stream-splicer": "^2.0.0" 657 | }, 658 | "dependencies": { 659 | "isarray": { 660 | "version": "2.0.4", 661 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", 662 | "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==" 663 | } 664 | } 665 | }, 666 | "lodash.memoize": { 667 | "version": "3.0.4", 668 | "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", 669 | "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" 670 | }, 671 | "md5.js": { 672 | "version": "1.3.5", 673 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", 674 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", 675 | "requires": { 676 | "hash-base": "^3.0.0", 677 | "inherits": "^2.0.1", 678 | "safe-buffer": "^5.1.2" 679 | } 680 | }, 681 | "miller-rabin": { 682 | "version": "4.0.1", 683 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", 684 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", 685 | "requires": { 686 | "bn.js": "^4.0.0", 687 | "brorand": "^1.0.1" 688 | } 689 | }, 690 | "minimalistic-assert": { 691 | "version": "1.0.1", 692 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 693 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" 694 | }, 695 | "minimalistic-crypto-utils": { 696 | "version": "1.0.1", 697 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 698 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" 699 | }, 700 | "minimatch": { 701 | "version": "3.0.4", 702 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 703 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 704 | "requires": { 705 | "brace-expansion": "^1.1.7" 706 | } 707 | }, 708 | "minimist": { 709 | "version": "1.2.0", 710 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 711 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 712 | }, 713 | "mkdirp": { 714 | "version": "0.5.1", 715 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 716 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 717 | "requires": { 718 | "minimist": "0.0.8" 719 | }, 720 | "dependencies": { 721 | "minimist": { 722 | "version": "0.0.8", 723 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 724 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 725 | } 726 | } 727 | }, 728 | "module-deps": { 729 | "version": "6.1.0", 730 | "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.1.0.tgz", 731 | "integrity": "sha512-NPs5N511VD1rrVJihSso/LiBShRbJALYBKzDW91uZYy7BpjnO4bGnZL3HjZ9yKcFdZUWwaYjDz9zxbuP7vKMuQ==", 732 | "requires": { 733 | "JSONStream": "^1.0.3", 734 | "browser-resolve": "^1.7.0", 735 | "cached-path-relative": "^1.0.0", 736 | "concat-stream": "~1.6.0", 737 | "defined": "^1.0.0", 738 | "detective": "^5.0.2", 739 | "duplexer2": "^0.1.2", 740 | "inherits": "^2.0.1", 741 | "parents": "^1.0.0", 742 | "readable-stream": "^2.0.2", 743 | "resolve": "^1.4.0", 744 | "stream-combiner2": "^1.1.1", 745 | "subarg": "^1.0.0", 746 | "through2": "^2.0.0", 747 | "xtend": "^4.0.0" 748 | } 749 | }, 750 | "once": { 751 | "version": "1.4.0", 752 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 753 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 754 | "requires": { 755 | "wrappy": "1" 756 | } 757 | }, 758 | "os-browserify": { 759 | "version": "0.3.0", 760 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", 761 | "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" 762 | }, 763 | "pako": { 764 | "version": "1.0.6", 765 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", 766 | "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" 767 | }, 768 | "parents": { 769 | "version": "1.0.1", 770 | "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", 771 | "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", 772 | "requires": { 773 | "path-platform": "~0.11.15" 774 | } 775 | }, 776 | "parse-asn1": { 777 | "version": "5.1.1", 778 | "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", 779 | "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", 780 | "requires": { 781 | "asn1.js": "^4.0.0", 782 | "browserify-aes": "^1.0.0", 783 | "create-hash": "^1.1.0", 784 | "evp_bytestokey": "^1.0.0", 785 | "pbkdf2": "^3.0.3" 786 | } 787 | }, 788 | "path-browserify": { 789 | "version": "0.0.1", 790 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", 791 | "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" 792 | }, 793 | "path-is-absolute": { 794 | "version": "1.0.1", 795 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 796 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 797 | }, 798 | "path-parse": { 799 | "version": "1.0.6", 800 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 801 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 802 | }, 803 | "path-platform": { 804 | "version": "0.11.15", 805 | "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", 806 | "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=" 807 | }, 808 | "pbkdf2": { 809 | "version": "3.0.17", 810 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", 811 | "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", 812 | "requires": { 813 | "create-hash": "^1.1.2", 814 | "create-hmac": "^1.1.4", 815 | "ripemd160": "^2.0.1", 816 | "safe-buffer": "^5.0.1", 817 | "sha.js": "^2.4.8" 818 | } 819 | }, 820 | "process": { 821 | "version": "0.11.10", 822 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 823 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" 824 | }, 825 | "process-nextick-args": { 826 | "version": "2.0.0", 827 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 828 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 829 | }, 830 | "public-encrypt": { 831 | "version": "4.0.3", 832 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", 833 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", 834 | "requires": { 835 | "bn.js": "^4.1.0", 836 | "browserify-rsa": "^4.0.0", 837 | "create-hash": "^1.1.0", 838 | "parse-asn1": "^5.0.0", 839 | "randombytes": "^2.0.1", 840 | "safe-buffer": "^5.1.2" 841 | } 842 | }, 843 | "punycode": { 844 | "version": "1.4.1", 845 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 846 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 847 | }, 848 | "querystring": { 849 | "version": "0.2.0", 850 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 851 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" 852 | }, 853 | "querystring-es3": { 854 | "version": "0.2.1", 855 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", 856 | "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" 857 | }, 858 | "randombytes": { 859 | "version": "2.0.6", 860 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", 861 | "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", 862 | "requires": { 863 | "safe-buffer": "^5.1.0" 864 | } 865 | }, 866 | "randomfill": { 867 | "version": "1.0.4", 868 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", 869 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", 870 | "requires": { 871 | "randombytes": "^2.0.5", 872 | "safe-buffer": "^5.1.0" 873 | } 874 | }, 875 | "read-only-stream": { 876 | "version": "2.0.0", 877 | "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", 878 | "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", 879 | "requires": { 880 | "readable-stream": "^2.0.2" 881 | } 882 | }, 883 | "readable-stream": { 884 | "version": "2.3.6", 885 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 886 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 887 | "requires": { 888 | "core-util-is": "~1.0.0", 889 | "inherits": "~2.0.3", 890 | "isarray": "~1.0.0", 891 | "process-nextick-args": "~2.0.0", 892 | "safe-buffer": "~5.1.1", 893 | "string_decoder": "~1.1.1", 894 | "util-deprecate": "~1.0.1" 895 | } 896 | }, 897 | "resolve": { 898 | "version": "1.8.1", 899 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", 900 | "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", 901 | "requires": { 902 | "path-parse": "^1.0.5" 903 | } 904 | }, 905 | "ripemd160": { 906 | "version": "2.0.2", 907 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", 908 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", 909 | "requires": { 910 | "hash-base": "^3.0.0", 911 | "inherits": "^2.0.1" 912 | } 913 | }, 914 | "safe-buffer": { 915 | "version": "5.1.2", 916 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 917 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 918 | }, 919 | "sha.js": { 920 | "version": "2.4.11", 921 | "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 922 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 923 | "requires": { 924 | "inherits": "^2.0.1", 925 | "safe-buffer": "^5.0.1" 926 | } 927 | }, 928 | "shasum": { 929 | "version": "1.0.2", 930 | "resolved": "http://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", 931 | "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", 932 | "requires": { 933 | "json-stable-stringify": "~0.0.0", 934 | "sha.js": "~2.4.4" 935 | } 936 | }, 937 | "shell-quote": { 938 | "version": "1.6.1", 939 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", 940 | "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", 941 | "requires": { 942 | "array-filter": "~0.0.0", 943 | "array-map": "~0.0.0", 944 | "array-reduce": "~0.0.0", 945 | "jsonify": "~0.0.0" 946 | } 947 | }, 948 | "simple-concat": { 949 | "version": "1.0.0", 950 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", 951 | "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" 952 | }, 953 | "source-map": { 954 | "version": "0.5.7", 955 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 956 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 957 | }, 958 | "stream-browserify": { 959 | "version": "2.0.1", 960 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", 961 | "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", 962 | "requires": { 963 | "inherits": "~2.0.1", 964 | "readable-stream": "^2.0.2" 965 | } 966 | }, 967 | "stream-combiner2": { 968 | "version": "1.1.1", 969 | "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", 970 | "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", 971 | "requires": { 972 | "duplexer2": "~0.1.0", 973 | "readable-stream": "^2.0.2" 974 | } 975 | }, 976 | "stream-http": { 977 | "version": "2.8.3", 978 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", 979 | "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", 980 | "requires": { 981 | "builtin-status-codes": "^3.0.0", 982 | "inherits": "^2.0.1", 983 | "readable-stream": "^2.3.6", 984 | "to-arraybuffer": "^1.0.0", 985 | "xtend": "^4.0.0" 986 | } 987 | }, 988 | "stream-splicer": { 989 | "version": "2.0.0", 990 | "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", 991 | "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", 992 | "requires": { 993 | "inherits": "^2.0.1", 994 | "readable-stream": "^2.0.2" 995 | } 996 | }, 997 | "string_decoder": { 998 | "version": "1.1.1", 999 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1000 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1001 | "requires": { 1002 | "safe-buffer": "~5.1.0" 1003 | } 1004 | }, 1005 | "subarg": { 1006 | "version": "1.0.0", 1007 | "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", 1008 | "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", 1009 | "requires": { 1010 | "minimist": "^1.1.0" 1011 | } 1012 | }, 1013 | "syntax-error": { 1014 | "version": "1.4.0", 1015 | "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", 1016 | "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", 1017 | "requires": { 1018 | "acorn-node": "^1.2.0" 1019 | } 1020 | }, 1021 | "through": { 1022 | "version": "2.3.8", 1023 | "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", 1024 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 1025 | }, 1026 | "through2": { 1027 | "version": "2.0.3", 1028 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", 1029 | "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", 1030 | "requires": { 1031 | "readable-stream": "^2.1.5", 1032 | "xtend": "~4.0.1" 1033 | } 1034 | }, 1035 | "timers-browserify": { 1036 | "version": "1.4.2", 1037 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", 1038 | "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", 1039 | "requires": { 1040 | "process": "~0.11.0" 1041 | } 1042 | }, 1043 | "to-arraybuffer": { 1044 | "version": "1.0.1", 1045 | "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", 1046 | "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" 1047 | }, 1048 | "tty-browserify": { 1049 | "version": "0.0.1", 1050 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", 1051 | "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" 1052 | }, 1053 | "typedarray": { 1054 | "version": "0.0.6", 1055 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1056 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1057 | }, 1058 | "umd": { 1059 | "version": "3.0.3", 1060 | "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", 1061 | "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==" 1062 | }, 1063 | "undeclared-identifiers": { 1064 | "version": "1.1.2", 1065 | "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz", 1066 | "integrity": "sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ==", 1067 | "requires": { 1068 | "acorn-node": "^1.3.0", 1069 | "get-assigned-identifiers": "^1.2.0", 1070 | "simple-concat": "^1.0.0", 1071 | "xtend": "^4.0.1" 1072 | } 1073 | }, 1074 | "url": { 1075 | "version": "0.11.0", 1076 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 1077 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", 1078 | "requires": { 1079 | "punycode": "1.3.2", 1080 | "querystring": "0.2.0" 1081 | }, 1082 | "dependencies": { 1083 | "punycode": { 1084 | "version": "1.3.2", 1085 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 1086 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" 1087 | } 1088 | } 1089 | }, 1090 | "util": { 1091 | "version": "0.10.4", 1092 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", 1093 | "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", 1094 | "requires": { 1095 | "inherits": "2.0.3" 1096 | } 1097 | }, 1098 | "util-deprecate": { 1099 | "version": "1.0.2", 1100 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1101 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1102 | }, 1103 | "vm-browserify": { 1104 | "version": "1.1.0", 1105 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", 1106 | "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" 1107 | }, 1108 | "wrappy": { 1109 | "version": "1.0.2", 1110 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1111 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1112 | }, 1113 | "xtend": { 1114 | "version": "4.0.1", 1115 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 1116 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 1117 | } 1118 | } 1119 | } 1120 | -------------------------------------------------------------------------------- /node/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sammacbeth/discovery-swarm-node", 3 | "version": "1.0.9", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@hyperswarm/dht": { 8 | "version": "0.0.1", 9 | "resolved": "https://registry.npmjs.org/@hyperswarm/dht/-/dht-0.0.1.tgz", 10 | "integrity": "sha512-ocwfEAXVuiuqaMPNUcBVCZn9pguRYBTjCYiI/fwbnEYInzkPGo/KG/aWBSkKqN9lpKAWXRFLYJrgo7VDnAMCpg==", 11 | "requires": { 12 | "dht-rpc": "^4.0.1", 13 | "ipv4-peers": "^1.1.1", 14 | "protocol-buffers-encodings": "^1.1.0", 15 | "record-cache": "^1.1.0" 16 | } 17 | }, 18 | "@hyperswarm/discovery": { 19 | "version": "1.1.0", 20 | "resolved": "https://registry.npmjs.org/@hyperswarm/discovery/-/discovery-1.1.0.tgz", 21 | "integrity": "sha512-SSib8T/h6J1JoehhlU6S/6olnhZ+yyl1liqBIOFBuET9iBeUK+PpmjEHbbGsOy5qwVWhx+bl7eptdV+gbD/arg==", 22 | "requires": { 23 | "@hyperswarm/dht": "0.0.1", 24 | "multicast-dns": "^7.2.0" 25 | } 26 | }, 27 | "@hyperswarm/network": { 28 | "version": "0.0.3", 29 | "resolved": "https://registry.npmjs.org/@hyperswarm/network/-/network-0.0.3.tgz", 30 | "integrity": "sha512-RV/dM41NC0qE6XN1KvEKVk0crZc/ms5Jo/mmu2vg0I1UA4QxgaAxg9RYaFUlkZZnKqDjQrY1yVnHd0yNiStsLg==", 31 | "requires": { 32 | "@hyperswarm/discovery": "^1.1.0", 33 | "utp-native": "^2.0.1" 34 | } 35 | }, 36 | "@sammacbeth/discovery-swarm": { 37 | "version": "1.0.9", 38 | "resolved": "https://registry.npmjs.org/@sammacbeth/discovery-swarm/-/discovery-swarm-1.0.9.tgz", 39 | "integrity": "sha512-NNeeYYyBWlfImfYrLQSkIrtayb6nADSTWLltDDMagBgUWWi3rqRULdWo8dx4XYjPGQSQrwsuzidFuYKc8EOo9Q==", 40 | "requires": { 41 | "hypercore-protocol": "^6.7.1", 42 | "pump": "^3.0.0" 43 | } 44 | }, 45 | "@types/node": { 46 | "version": "10.11.7", 47 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.11.7.tgz", 48 | "integrity": "sha512-yOxFfkN9xUFLyvWaeYj90mlqTJ41CsQzWKS3gXdOMOyPVacUsymejKxJ4/pMW7exouubuEeZLJawGgcNGYlTeg==", 49 | "dev": true 50 | }, 51 | "append-tree": { 52 | "version": "2.4.4", 53 | "resolved": "https://registry.npmjs.org/append-tree/-/append-tree-2.4.4.tgz", 54 | "integrity": "sha512-rPMUMkR8JjjPDDHHDZ/YeLO0KIbUGCrXgy921F6sBkEXBR9jYYxK8LUlwpZkUVi70cMR6r8uSmHZ/5HvtrntHg==", 55 | "dev": true, 56 | "requires": { 57 | "array-lru": "^1.1.1", 58 | "codecs": "^1.2.0", 59 | "from2": "^2.3.0", 60 | "inherits": "^2.0.3", 61 | "mutexify": "^1.1.0", 62 | "process-nextick-args": "^1.0.7", 63 | "protocol-buffers-encodings": "^1.1.0", 64 | "varint": "^5.0.0" 65 | } 66 | }, 67 | "array-lru": { 68 | "version": "1.1.1", 69 | "resolved": "https://registry.npmjs.org/array-lru/-/array-lru-1.1.1.tgz", 70 | "integrity": "sha1-DH4bTgIq4Wb/HoRIxZXzGB/NMzc=", 71 | "dev": true 72 | }, 73 | "atomic-batcher": { 74 | "version": "1.0.2", 75 | "resolved": "https://registry.npmjs.org/atomic-batcher/-/atomic-batcher-1.0.2.tgz", 76 | "integrity": "sha1-0WkB0QzOxZUWwZe5zNiTBom4E7Q=", 77 | "dev": true 78 | }, 79 | "balanced-match": { 80 | "version": "1.0.0", 81 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 82 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 83 | "dev": true 84 | }, 85 | "bencode": { 86 | "version": "1.0.0", 87 | "resolved": "https://registry.npmjs.org/bencode/-/bencode-1.0.0.tgz", 88 | "integrity": "sha512-N+VOSP5MkoX+xgnp6Y056iCY5TmCZg9rgPNPQe0bIiXchxYFP4vs/Tf0dTdQ+qQhP7HM2gvfFq+sUVjQsGy5Zw==", 89 | "requires": { 90 | "safe-buffer": "^5.1.1" 91 | } 92 | }, 93 | "bitfield-rle": { 94 | "version": "2.2.1", 95 | "resolved": "https://registry.npmjs.org/bitfield-rle/-/bitfield-rle-2.2.1.tgz", 96 | "integrity": "sha512-wrDhHe7LUkqaytxgbsFXoemzHRv6e8FrVNWWsQCgUfmuVYW6ke44hoGc9VdpjgfIsJ/ejmCFA8wDtDqACNAvyw==", 97 | "dev": true, 98 | "requires": { 99 | "buffer-alloc-unsafe": "^1.1.0", 100 | "varint": "^4.0.0" 101 | }, 102 | "dependencies": { 103 | "varint": { 104 | "version": "4.0.1", 105 | "resolved": "https://registry.npmjs.org/varint/-/varint-4.0.1.tgz", 106 | "integrity": "sha1-SQgpuULSSEY7KzUJeZXDv3NxmOk=", 107 | "dev": true 108 | } 109 | } 110 | }, 111 | "bittorrent-dht": { 112 | "version": "7.10.0", 113 | "resolved": "https://registry.npmjs.org/bittorrent-dht/-/bittorrent-dht-7.10.0.tgz", 114 | "integrity": "sha512-fvb6M58Ceiv/S94nu6zeaiMoJvUYOeIqRbgaClm+kJTzCAqJPtAR/31pXNYB5iEReOoKqQB5zY33gY0W6ZRWQQ==", 115 | "requires": { 116 | "bencode": "^1.0.0", 117 | "buffer-equals": "^1.0.3", 118 | "debug": "^3.1.0", 119 | "inherits": "^2.0.1", 120 | "k-bucket": "^3.3.0", 121 | "k-rpc": "^4.2.1", 122 | "lru": "^3.1.0", 123 | "randombytes": "^2.0.5", 124 | "safe-buffer": "^5.0.1", 125 | "simple-sha1": "^2.1.0" 126 | }, 127 | "dependencies": { 128 | "k-bucket": { 129 | "version": "3.3.1", 130 | "resolved": "https://registry.npmjs.org/k-bucket/-/k-bucket-3.3.1.tgz", 131 | "integrity": "sha512-kgwWqYT79rAahn4maIVTP8dIe+m1KulufWW+f1bB9DlZrRFiGpZ4iJOg2HUp4xJYBWONP3+rOPIWF/RXABU6mw==", 132 | "requires": { 133 | "buffer-equals": "^1.0.3", 134 | "inherits": "^2.0.1", 135 | "randombytes": "^2.0.3" 136 | } 137 | } 138 | } 139 | }, 140 | "blake2b": { 141 | "version": "2.1.3", 142 | "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.3.tgz", 143 | "integrity": "sha512-pkDss4xFVbMb4270aCyGD3qLv92314Et+FsKzilCLxDz5DuZ2/1g3w4nmBbu6nKApPspnjG7JcwTjGZnduB1yg==", 144 | "requires": { 145 | "blake2b-wasm": "^1.1.0", 146 | "nanoassert": "^1.0.0" 147 | } 148 | }, 149 | "blake2b-wasm": { 150 | "version": "1.1.7", 151 | "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-1.1.7.tgz", 152 | "integrity": "sha512-oFIHvXhlz/DUgF0kq5B1CqxIDjIJwh9iDeUUGQUcvgiGz7Wdw03McEO7CfLBy7QKGdsydcMCgO9jFNBAFCtFcA==", 153 | "requires": { 154 | "nanoassert": "^1.0.0" 155 | } 156 | }, 157 | "brace-expansion": { 158 | "version": "1.1.11", 159 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 160 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 161 | "dev": true, 162 | "requires": { 163 | "balanced-match": "^1.0.0", 164 | "concat-map": "0.0.1" 165 | } 166 | }, 167 | "browser-stdout": { 168 | "version": "1.3.1", 169 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 170 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 171 | "dev": true 172 | }, 173 | "buffer-alloc": { 174 | "version": "1.2.0", 175 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 176 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 177 | "dev": true, 178 | "requires": { 179 | "buffer-alloc-unsafe": "^1.1.0", 180 | "buffer-fill": "^1.0.0" 181 | } 182 | }, 183 | "buffer-alloc-unsafe": { 184 | "version": "1.1.0", 185 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 186 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" 187 | }, 188 | "buffer-equals": { 189 | "version": "1.0.4", 190 | "resolved": "http://registry.npmjs.org/buffer-equals/-/buffer-equals-1.0.4.tgz", 191 | "integrity": "sha1-A1O1T9B/2VZBcGca5vZrnPENJ/U=" 192 | }, 193 | "buffer-fill": { 194 | "version": "1.0.0", 195 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 196 | "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", 197 | "dev": true 198 | }, 199 | "buffer-from": { 200 | "version": "1.1.1", 201 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 202 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 203 | }, 204 | "bulk-write-stream": { 205 | "version": "1.1.4", 206 | "resolved": "https://registry.npmjs.org/bulk-write-stream/-/bulk-write-stream-1.1.4.tgz", 207 | "integrity": "sha512-GtKwd/4etuk1hNeprXoESBO1RSeRYJMXKf+O0qHmWdUomLT8ysNEfX/4bZFXr3BK6eukpHiEnhY2uMtEHDM2ng==", 208 | "dev": true, 209 | "requires": { 210 | "buffer-from": "^1.0.0", 211 | "inherits": "^2.0.1", 212 | "readable-stream": "^2.1.4" 213 | }, 214 | "dependencies": { 215 | "process-nextick-args": { 216 | "version": "2.0.0", 217 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 218 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 219 | "dev": true 220 | }, 221 | "readable-stream": { 222 | "version": "2.3.6", 223 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 224 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 225 | "dev": true, 226 | "requires": { 227 | "core-util-is": "~1.0.0", 228 | "inherits": "~2.0.3", 229 | "isarray": "~1.0.0", 230 | "process-nextick-args": "~2.0.0", 231 | "safe-buffer": "~5.1.1", 232 | "string_decoder": "~1.1.1", 233 | "util-deprecate": "~1.0.1" 234 | } 235 | } 236 | } 237 | }, 238 | "circular-append-file": { 239 | "version": "1.0.1", 240 | "resolved": "https://registry.npmjs.org/circular-append-file/-/circular-append-file-1.0.1.tgz", 241 | "integrity": "sha512-BUDFvrBTCdeVhg9E05PX4XgMegk6xWB69uGwyuATEg7PMfa9lGU1mzFSK0xWNW2O0i9CAQHN0oIdXI/kI2hPkg==", 242 | "requires": { 243 | "multistream": "^2.1.0" 244 | } 245 | }, 246 | "codecs": { 247 | "version": "1.2.1", 248 | "resolved": "https://registry.npmjs.org/codecs/-/codecs-1.2.1.tgz", 249 | "integrity": "sha512-SPnx+ZHXVJ0qTInRXmnxuyu8PDvSzvop5MXp1BOr/urFQI3yL2n5ewE755skTklF/hKVlWj8cinGxdR2gvLvTA==" 250 | }, 251 | "commander": { 252 | "version": "2.15.1", 253 | "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", 254 | "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", 255 | "dev": true 256 | }, 257 | "concat-map": { 258 | "version": "0.0.1", 259 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 260 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 261 | "dev": true 262 | }, 263 | "core-util-is": { 264 | "version": "1.0.2", 265 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 266 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 267 | }, 268 | "count-trailing-zeros": { 269 | "version": "1.0.1", 270 | "resolved": "https://registry.npmjs.org/count-trailing-zeros/-/count-trailing-zeros-1.0.1.tgz", 271 | "integrity": "sha1-q6bFgzvkENRbHso+bVg4RM5oLHc=", 272 | "dev": true 273 | }, 274 | "dat-swarm-defaults": { 275 | "version": "1.0.1", 276 | "resolved": "https://registry.npmjs.org/dat-swarm-defaults/-/dat-swarm-defaults-1.0.1.tgz", 277 | "integrity": "sha512-T2WlO7BVmN9USchefsP8entQiByIlJLGuzHLL9qEqOBkyKB8p0Y7XPWxP8dcL43+SkeoxU5NVe7O0bsi3xL8Jg==", 278 | "requires": { 279 | "xtend": "^4.0.1" 280 | } 281 | }, 282 | "debug": { 283 | "version": "3.1.0", 284 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 285 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 286 | "requires": { 287 | "ms": "2.0.0" 288 | } 289 | }, 290 | "dht-rpc": { 291 | "version": "4.1.0", 292 | "resolved": "https://registry.npmjs.org/dht-rpc/-/dht-rpc-4.1.0.tgz", 293 | "integrity": "sha512-f7mcLigsLWdL1zV7PgnwKKzRSk0fB6MwriCTJSVMNDz/4LmbvnxS8k8IXwTdz6W9LfQAsI7+WD714Cvnc5ro4g==", 294 | "requires": { 295 | "codecs": "^1.2.1", 296 | "ipv4-peers": "^1.1.1", 297 | "k-bucket": "^5.0.0", 298 | "protocol-buffers-encodings": "^1.1.0", 299 | "sodium-universal": "^2.0.0", 300 | "stream-collector": "^1.0.1", 301 | "time-ordered-set": "^1.0.1", 302 | "xor-distance": "^1.0.0" 303 | } 304 | }, 305 | "diff": { 306 | "version": "3.5.0", 307 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 308 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 309 | "dev": true 310 | }, 311 | "discovery-channel": { 312 | "version": "5.5.1", 313 | "resolved": "https://registry.npmjs.org/discovery-channel/-/discovery-channel-5.5.1.tgz", 314 | "integrity": "sha512-EEmZQFE0PiOsJj7G3KVCwFGbYs4QchUvzA91iHtZ6HfkIqfBEDSTGLygJrUlY1Tr77WDV+qZVrZuNghHxSL/vw==", 315 | "requires": { 316 | "bittorrent-dht": "^7.10.0", 317 | "buffer-from": "^1.0.0", 318 | "debug": "^2.6.9", 319 | "dns-discovery": "^6.0.1", 320 | "pretty-hash": "^1.0.1", 321 | "thunky": "^0.1.0" 322 | }, 323 | "dependencies": { 324 | "debug": { 325 | "version": "2.6.9", 326 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 327 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 328 | "requires": { 329 | "ms": "2.0.0" 330 | } 331 | }, 332 | "thunky": { 333 | "version": "0.1.0", 334 | "resolved": "http://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", 335 | "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=" 336 | } 337 | } 338 | }, 339 | "dns-discovery": { 340 | "version": "6.2.2", 341 | "resolved": "https://registry.npmjs.org/dns-discovery/-/dns-discovery-6.2.2.tgz", 342 | "integrity": "sha512-EZQxH4I5ZAQbV8Njlb4JXhgeIKtcXdCzLCLSJIyzEXbzEm6hNsJdX5F6oW+4a02etsaSPBX3iEDFyPg7VB91PQ==", 343 | "requires": { 344 | "circular-append-file": "^1.0.1", 345 | "debug": "^2.6.9", 346 | "dns-socket": "^3.0.0", 347 | "lru": "^2.0.0", 348 | "minimist": "^1.2.0", 349 | "multicast-dns": "^7.1.1", 350 | "network-address": "^1.1.2", 351 | "pump": "^3.0.0", 352 | "speedometer": "^1.0.0", 353 | "unordered-set": "^1.1.0" 354 | }, 355 | "dependencies": { 356 | "debug": { 357 | "version": "2.6.9", 358 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 359 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 360 | "requires": { 361 | "ms": "2.0.0" 362 | } 363 | }, 364 | "lru": { 365 | "version": "2.0.1", 366 | "resolved": "https://registry.npmjs.org/lru/-/lru-2.0.1.tgz", 367 | "integrity": "sha1-+XmHHhYuP1yiVL5GhExT1MU2RUQ=", 368 | "requires": { 369 | "inherits": "^2.0.1" 370 | } 371 | }, 372 | "minimist": { 373 | "version": "1.2.0", 374 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 375 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 376 | }, 377 | "unordered-set": { 378 | "version": "1.1.0", 379 | "resolved": "https://registry.npmjs.org/unordered-set/-/unordered-set-1.1.0.tgz", 380 | "integrity": "sha1-K6fvMW7dC5WQzFR8dPdqLxZP7Mo=" 381 | } 382 | } 383 | }, 384 | "dns-packet": { 385 | "version": "4.2.0", 386 | "resolved": "http://registry.npmjs.org/dns-packet/-/dns-packet-4.2.0.tgz", 387 | "integrity": "sha512-bn1AKpfkFbm0MIioOMHZ5qJzl2uypdBwI4nYNsqvhjsegBhcKJUlCrMPWLx6JEezRjxZmxhtIz/FkBEur2l8Cw==", 388 | "requires": { 389 | "ip": "^1.1.5", 390 | "safe-buffer": "^5.1.1" 391 | } 392 | }, 393 | "dns-socket": { 394 | "version": "3.0.0", 395 | "resolved": "https://registry.npmjs.org/dns-socket/-/dns-socket-3.0.0.tgz", 396 | "integrity": "sha512-M0WkByoJ/mTm+HtwBQLsRJPe5uGIC/lYVOp+s6ZzhbZ5iq4GxjFyxYPQhB85dgCLvVb43aJQXHDC9aUgyKGc/Q==", 397 | "requires": { 398 | "dns-packet": "^4.1.0" 399 | } 400 | }, 401 | "duplexify": { 402 | "version": "3.6.0", 403 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", 404 | "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", 405 | "dev": true, 406 | "requires": { 407 | "end-of-stream": "^1.0.0", 408 | "inherits": "^2.0.1", 409 | "readable-stream": "^2.0.0", 410 | "stream-shift": "^1.0.0" 411 | }, 412 | "dependencies": { 413 | "process-nextick-args": { 414 | "version": "2.0.0", 415 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 416 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 417 | "dev": true 418 | }, 419 | "readable-stream": { 420 | "version": "2.3.6", 421 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 422 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 423 | "dev": true, 424 | "requires": { 425 | "core-util-is": "~1.0.0", 426 | "inherits": "~2.0.3", 427 | "isarray": "~1.0.0", 428 | "process-nextick-args": "~2.0.0", 429 | "safe-buffer": "~5.1.1", 430 | "string_decoder": "~1.1.1", 431 | "util-deprecate": "~1.0.1" 432 | } 433 | } 434 | } 435 | }, 436 | "end-of-stream": { 437 | "version": "1.4.1", 438 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 439 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 440 | "requires": { 441 | "once": "^1.4.0" 442 | } 443 | }, 444 | "escape-string-regexp": { 445 | "version": "1.0.5", 446 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 447 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 448 | "dev": true 449 | }, 450 | "fast-bitfield": { 451 | "version": "1.2.1", 452 | "resolved": "https://registry.npmjs.org/fast-bitfield/-/fast-bitfield-1.2.1.tgz", 453 | "integrity": "sha512-OnsvI4w/LRwjv7y10ZTyRsl7A7ROV9SNBhr+sFVzqKjVHV1qCIESU5kHHcS1awJeE03Aa6X52F59HW+w0YI0lg==", 454 | "dev": true, 455 | "requires": { 456 | "count-trailing-zeros": "^1.0.1" 457 | } 458 | }, 459 | "flat-tree": { 460 | "version": "1.6.0", 461 | "resolved": "https://registry.npmjs.org/flat-tree/-/flat-tree-1.6.0.tgz", 462 | "integrity": "sha1-/KMM3bkAb7ZW6168ea6ydOf96e0=", 463 | "dev": true 464 | }, 465 | "from2": { 466 | "version": "2.3.0", 467 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 468 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", 469 | "dev": true, 470 | "requires": { 471 | "inherits": "^2.0.1", 472 | "readable-stream": "^2.0.0" 473 | }, 474 | "dependencies": { 475 | "process-nextick-args": { 476 | "version": "2.0.0", 477 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 478 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 479 | "dev": true 480 | }, 481 | "readable-stream": { 482 | "version": "2.3.6", 483 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 484 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 485 | "dev": true, 486 | "requires": { 487 | "core-util-is": "~1.0.0", 488 | "inherits": "~2.0.3", 489 | "isarray": "~1.0.0", 490 | "process-nextick-args": "~2.0.0", 491 | "safe-buffer": "~5.1.1", 492 | "string_decoder": "~1.1.1", 493 | "util-deprecate": "~1.0.1" 494 | } 495 | } 496 | } 497 | }, 498 | "fs.realpath": { 499 | "version": "1.0.0", 500 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 501 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 502 | "dev": true 503 | }, 504 | "glob": { 505 | "version": "7.1.2", 506 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 507 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 508 | "dev": true, 509 | "requires": { 510 | "fs.realpath": "^1.0.0", 511 | "inflight": "^1.0.4", 512 | "inherits": "2", 513 | "minimatch": "^3.0.4", 514 | "once": "^1.3.0", 515 | "path-is-absolute": "^1.0.0" 516 | } 517 | }, 518 | "growl": { 519 | "version": "1.10.5", 520 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 521 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 522 | "dev": true 523 | }, 524 | "has-flag": { 525 | "version": "3.0.0", 526 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 527 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 528 | "dev": true 529 | }, 530 | "he": { 531 | "version": "1.1.1", 532 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 533 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 534 | "dev": true 535 | }, 536 | "hypercore": { 537 | "version": "6.19.2", 538 | "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-6.19.2.tgz", 539 | "integrity": "sha512-AQS6mtwI7RDKRT3u68EEcehtI1VpaavWXxfnGDyOrR/AVBDUMdIUw8wcYCZdiZZVHarh5xKS4+VRCdJjS67LuA==", 540 | "dev": true, 541 | "requires": { 542 | "array-lru": "^1.1.0", 543 | "atomic-batcher": "^1.0.2", 544 | "bitfield-rle": "^2.2.1", 545 | "buffer-alloc-unsafe": "^1.0.0", 546 | "buffer-equals": "^1.0.4", 547 | "buffer-from": "^1.0.0", 548 | "bulk-write-stream": "^1.1.3", 549 | "codecs": "^1.2.0", 550 | "fast-bitfield": "^1.2.1", 551 | "flat-tree": "^1.6.0", 552 | "from2": "^2.3.0", 553 | "hypercore-crypto": "^1.0.0", 554 | "hypercore-protocol": "^6.4.1", 555 | "inherits": "^2.0.3", 556 | "inspect-custom-symbol": "^1.1.0", 557 | "last-one-wins": "^1.0.4", 558 | "memory-pager": "^1.0.2", 559 | "merkle-tree-stream": "^3.0.3", 560 | "pretty-hash": "^1.0.1", 561 | "process-nextick-args": "^1.0.7", 562 | "random-access-file": "^2.0.1", 563 | "sodium-universal": "^2.0.0", 564 | "sparse-bitfield": "^3.0.0", 565 | "thunky": "^1.0.1", 566 | "uint64be": "^2.0.1", 567 | "unordered-array-remove": "^1.0.2", 568 | "unordered-set": "^2.0.0" 569 | } 570 | }, 571 | "hypercore-crypto": { 572 | "version": "1.0.0", 573 | "resolved": "https://registry.npmjs.org/hypercore-crypto/-/hypercore-crypto-1.0.0.tgz", 574 | "integrity": "sha512-xFwOnNlOt8L+SovC7dTNchKaNYJb5l8rKZZwpWQnCme1r7CU4Hlhp1RDqPES6b0OpS7DkTo9iU0GltQGkpsjMw==", 575 | "dev": true, 576 | "requires": { 577 | "buffer-alloc-unsafe": "^1.1.0", 578 | "buffer-from": "^1.1.0", 579 | "sodium-universal": "^2.0.0", 580 | "uint64be": "^2.0.2" 581 | } 582 | }, 583 | "hypercore-protocol": { 584 | "version": "6.7.1", 585 | "resolved": "https://registry.npmjs.org/hypercore-protocol/-/hypercore-protocol-6.7.1.tgz", 586 | "integrity": "sha512-6jjMwL/XgeAl9BDUWmAJmIum7ynHGqajCnXt5VbJuxNLKkPI8WQS2kpMfcvotI5QHKMu/15+92ZPM6WoYDtd8g==", 587 | "requires": { 588 | "buffer-alloc-unsafe": "^1.0.0", 589 | "buffer-from": "^1.0.0", 590 | "inherits": "^2.0.3", 591 | "protocol-buffers-encodings": "^1.1.0", 592 | "readable-stream": "^2.2.6", 593 | "sodium-universal": "^2.0.0", 594 | "sorted-indexof": "^1.0.0", 595 | "varint": "^5.0.0" 596 | }, 597 | "dependencies": { 598 | "process-nextick-args": { 599 | "version": "2.0.0", 600 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 601 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 602 | }, 603 | "readable-stream": { 604 | "version": "2.3.6", 605 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 606 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 607 | "requires": { 608 | "core-util-is": "~1.0.0", 609 | "inherits": "~2.0.3", 610 | "isarray": "~1.0.0", 611 | "process-nextick-args": "~2.0.0", 612 | "safe-buffer": "~5.1.1", 613 | "string_decoder": "~1.1.1", 614 | "util-deprecate": "~1.0.1" 615 | } 616 | } 617 | } 618 | }, 619 | "hyperdrive": { 620 | "version": "9.14.0", 621 | "resolved": "https://registry.npmjs.org/hyperdrive/-/hyperdrive-9.14.0.tgz", 622 | "integrity": "sha512-LTgbsJ+9ZrdQfLaXXc01kQMttaicHhSOtUM3v/k7ORwXJziqQ2eMQ80+8Tfg67ja+w6zrdl5HYOK+mnlwQpCww==", 623 | "dev": true, 624 | "requires": { 625 | "append-tree": "^2.3.5", 626 | "duplexify": "^3.5.0", 627 | "from2": "^2.3.0", 628 | "hypercore": "^6.10.4", 629 | "inherits": "^2.0.3", 630 | "mutexify": "^1.1.0", 631 | "protocol-buffers-encodings": "^1.1.0", 632 | "random-access-file": "^2.0.1", 633 | "sodium-universal": "^2.0.0", 634 | "stream-collector": "^1.0.1", 635 | "stream-each": "^1.2.0", 636 | "thunky": "^1.0.2", 637 | "uint64be": "^2.0.1", 638 | "unixify": "^1.0.0" 639 | } 640 | }, 641 | "inflight": { 642 | "version": "1.0.6", 643 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 644 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 645 | "dev": true, 646 | "requires": { 647 | "once": "^1.3.0", 648 | "wrappy": "1" 649 | } 650 | }, 651 | "inherits": { 652 | "version": "2.0.3", 653 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 654 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 655 | }, 656 | "ini": { 657 | "version": "1.3.5", 658 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 659 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 660 | "optional": true 661 | }, 662 | "inspect-custom-symbol": { 663 | "version": "1.1.0", 664 | "resolved": "https://registry.npmjs.org/inspect-custom-symbol/-/inspect-custom-symbol-1.1.0.tgz", 665 | "integrity": "sha512-vtI2YXBRZBkU6DlfHfd0GtZENfiEiTacAXUd0ZY6HA+X7aPznpFfPmzSC+tHKXAkz9KDSdI4AYfwAMXR5t+isg==", 666 | "dev": true 667 | }, 668 | "ip": { 669 | "version": "1.1.5", 670 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", 671 | "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" 672 | }, 673 | "ipv4-peers": { 674 | "version": "1.1.1", 675 | "resolved": "https://registry.npmjs.org/ipv4-peers/-/ipv4-peers-1.1.1.tgz", 676 | "integrity": "sha1-hauGKg9SFFg+BRh2P34dd1riTXY=" 677 | }, 678 | "is-options": { 679 | "version": "1.0.1", 680 | "resolved": "https://registry.npmjs.org/is-options/-/is-options-1.0.1.tgz", 681 | "integrity": "sha512-2Xj8sA0zDrAcaoWfBiNmc6VPWAgKDpim0T3J9Djq7vbm1UjwbUWzeuLu/FwC46g3cBbAn0E5R0xwVtOobM6Xxg==", 682 | "dev": true 683 | }, 684 | "isarray": { 685 | "version": "1.0.0", 686 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 687 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 688 | }, 689 | "k-bucket": { 690 | "version": "5.0.0", 691 | "resolved": "https://registry.npmjs.org/k-bucket/-/k-bucket-5.0.0.tgz", 692 | "integrity": "sha512-r/q+wV/Kde62/tk+rqyttEJn6h0jR7x+incdMVSYTqK73zVxVrzJa70kJL49cIKen8XjIgUZKSvk8ktnrQbK4w==", 693 | "requires": { 694 | "randombytes": "^2.0.3" 695 | } 696 | }, 697 | "k-rpc": { 698 | "version": "4.3.1", 699 | "resolved": "https://registry.npmjs.org/k-rpc/-/k-rpc-4.3.1.tgz", 700 | "integrity": "sha512-mgAJZeFYbpP0xzJzmS0TQTYoFI0sjy3GnKFhg8wyboL+KvWg2WLaA2Oy9PthLPx2Rxz4WeBMk4y3MSOrDJ95FA==", 701 | "requires": { 702 | "buffer-equals": "^1.0.3", 703 | "k-bucket": "^4.0.0", 704 | "k-rpc-socket": "^1.7.2", 705 | "randombytes": "^2.0.5", 706 | "safe-buffer": "^5.1.1" 707 | }, 708 | "dependencies": { 709 | "k-bucket": { 710 | "version": "4.0.1", 711 | "resolved": "https://registry.npmjs.org/k-bucket/-/k-bucket-4.0.1.tgz", 712 | "integrity": "sha512-YvDpmY3waI999h1zZoW1rJ04fZrgZ+5PAlVmvwDHT6YO/Q1AOhdel07xsKy9eAvJjQ9xZV1wz3rXKqEfaWvlcQ==", 713 | "requires": { 714 | "inherits": "^2.0.1", 715 | "randombytes": "^2.0.3" 716 | } 717 | } 718 | } 719 | }, 720 | "k-rpc-socket": { 721 | "version": "1.8.0", 722 | "resolved": "https://registry.npmjs.org/k-rpc-socket/-/k-rpc-socket-1.8.0.tgz", 723 | "integrity": "sha512-f/9TynsO8YYjZ6JjNNtSSH7CJcIHcio1buy3zqByGxb/GX8AWLdL6FZEWTrN8V3/J7W4/E0ZTQQ+Jt2rVq7ELg==", 724 | "requires": { 725 | "bencode": "^2.0.0", 726 | "buffer-equals": "^1.0.4", 727 | "safe-buffer": "^5.1.1" 728 | }, 729 | "dependencies": { 730 | "bencode": { 731 | "version": "2.0.0", 732 | "resolved": "https://registry.npmjs.org/bencode/-/bencode-2.0.0.tgz", 733 | "integrity": "sha512-wr2HwwrUpfB5c68zmAudOltC7rZ1G0+lQOcnuEcfIM3AWAVnB3rHI3nlgd/2CWTfQ3w3zagKt89zni/M+VLZ8g==", 734 | "requires": { 735 | "safe-buffer": "^5.1.1" 736 | } 737 | } 738 | } 739 | }, 740 | "last-one-wins": { 741 | "version": "1.0.4", 742 | "resolved": "https://registry.npmjs.org/last-one-wins/-/last-one-wins-1.0.4.tgz", 743 | "integrity": "sha1-wb/Qy8tGeQ7JFWuNGu6Py4bNoio=", 744 | "dev": true 745 | }, 746 | "lru": { 747 | "version": "3.1.0", 748 | "resolved": "https://registry.npmjs.org/lru/-/lru-3.1.0.tgz", 749 | "integrity": "sha1-6n+4VG2DczOWoTCR12z+tMBoN9U=", 750 | "requires": { 751 | "inherits": "^2.0.1" 752 | } 753 | }, 754 | "memory-pager": { 755 | "version": "1.1.0", 756 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.1.0.tgz", 757 | "integrity": "sha512-Mf9OHV/Y7h6YWDxTzX/b4ZZ4oh9NSXblQL8dtPCOomOtZciEHxePR78+uHFLLlsk01A6jVHhHsQZZ/WcIPpnzg==", 758 | "dev": true 759 | }, 760 | "merkle-tree-stream": { 761 | "version": "3.0.3", 762 | "resolved": "https://registry.npmjs.org/merkle-tree-stream/-/merkle-tree-stream-3.0.3.tgz", 763 | "integrity": "sha1-+KBkdg0355eK1fn208EZpJT1cIE=", 764 | "dev": true, 765 | "requires": { 766 | "flat-tree": "^1.3.0", 767 | "readable-stream": "^2.0.5" 768 | }, 769 | "dependencies": { 770 | "process-nextick-args": { 771 | "version": "2.0.0", 772 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 773 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 774 | "dev": true 775 | }, 776 | "readable-stream": { 777 | "version": "2.3.6", 778 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 779 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 780 | "dev": true, 781 | "requires": { 782 | "core-util-is": "~1.0.0", 783 | "inherits": "~2.0.3", 784 | "isarray": "~1.0.0", 785 | "process-nextick-args": "~2.0.0", 786 | "safe-buffer": "~5.1.1", 787 | "string_decoder": "~1.1.1", 788 | "util-deprecate": "~1.0.1" 789 | } 790 | } 791 | } 792 | }, 793 | "minimatch": { 794 | "version": "3.0.4", 795 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 796 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 797 | "dev": true, 798 | "requires": { 799 | "brace-expansion": "^1.1.7" 800 | } 801 | }, 802 | "minimist": { 803 | "version": "0.0.8", 804 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 805 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 806 | "dev": true 807 | }, 808 | "mkdirp": { 809 | "version": "0.5.1", 810 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 811 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 812 | "dev": true, 813 | "requires": { 814 | "minimist": "0.0.8" 815 | } 816 | }, 817 | "mocha": { 818 | "version": "5.2.0", 819 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", 820 | "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", 821 | "dev": true, 822 | "requires": { 823 | "browser-stdout": "1.3.1", 824 | "commander": "2.15.1", 825 | "debug": "3.1.0", 826 | "diff": "3.5.0", 827 | "escape-string-regexp": "1.0.5", 828 | "glob": "7.1.2", 829 | "growl": "1.10.5", 830 | "he": "1.1.1", 831 | "minimatch": "3.0.4", 832 | "mkdirp": "0.5.1", 833 | "supports-color": "5.4.0" 834 | } 835 | }, 836 | "ms": { 837 | "version": "2.0.0", 838 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 839 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 840 | }, 841 | "multicast-dns": { 842 | "version": "7.2.0", 843 | "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.0.tgz", 844 | "integrity": "sha512-Tu2QORGOFANB124NWQ/JTRhMf/ODouVLEuvu5Dz8YWEU55zQgRgFGnBHfIh5PbfNDAuaRl7yLB+pgWhSqVxi2Q==", 845 | "requires": { 846 | "dns-packet": "^4.0.0", 847 | "thunky": "^1.0.2" 848 | } 849 | }, 850 | "multistream": { 851 | "version": "2.1.1", 852 | "resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.1.tgz", 853 | "integrity": "sha512-xasv76hl6nr1dEy3lPvy7Ej7K/Lx3O/FCvwge8PeVJpciPPoNCbaANcNiBug3IpdvTveZUcAV0DJzdnUDMesNQ==", 854 | "requires": { 855 | "inherits": "^2.0.1", 856 | "readable-stream": "^2.0.5" 857 | }, 858 | "dependencies": { 859 | "process-nextick-args": { 860 | "version": "2.0.0", 861 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 862 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 863 | }, 864 | "readable-stream": { 865 | "version": "2.3.6", 866 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 867 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 868 | "requires": { 869 | "core-util-is": "~1.0.0", 870 | "inherits": "~2.0.3", 871 | "isarray": "~1.0.0", 872 | "process-nextick-args": "~2.0.0", 873 | "safe-buffer": "~5.1.1", 874 | "string_decoder": "~1.1.1", 875 | "util-deprecate": "~1.0.1" 876 | } 877 | } 878 | } 879 | }, 880 | "mutexify": { 881 | "version": "1.2.0", 882 | "resolved": "https://registry.npmjs.org/mutexify/-/mutexify-1.2.0.tgz", 883 | "integrity": "sha512-oprzxd2zhfrJqEuB98qc1dRMMonClBQ57UPDjnbcrah4orEMTq1jq3+AcdFe5ePzdbJXI7zmdhfftIdMnhYFoQ==", 884 | "dev": true 885 | }, 886 | "nan": { 887 | "version": "2.11.1", 888 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", 889 | "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", 890 | "optional": true 891 | }, 892 | "nanoassert": { 893 | "version": "1.1.0", 894 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-1.1.0.tgz", 895 | "integrity": "sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40=" 896 | }, 897 | "napi-macros": { 898 | "version": "1.8.1", 899 | "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-1.8.1.tgz", 900 | "integrity": "sha512-lhRfh61ei9CTpDEoaH3+KPS/lrpoKltCKMeqcA1rt/tjUhMICCbnAkcdkZmYs7jpraJ5hizngPIASwjjRsbvUA==" 901 | }, 902 | "network-address": { 903 | "version": "1.1.2", 904 | "resolved": "https://registry.npmjs.org/network-address/-/network-address-1.1.2.tgz", 905 | "integrity": "sha1-Sqe/1D8D8LgclwKxPWqFjdsybz4=" 906 | }, 907 | "node-gyp-build": { 908 | "version": "3.4.0", 909 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.4.0.tgz", 910 | "integrity": "sha512-YoviGBJYGrPdLOKDIQB0sKxuKy/EEsxzooNkOZak4vSTKT/qH0Pa6dj3t1MJjEQGsefih61IyHDmO1WW7xOFfw==" 911 | }, 912 | "normalize-path": { 913 | "version": "2.1.1", 914 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 915 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 916 | "dev": true, 917 | "requires": { 918 | "remove-trailing-separator": "^1.0.1" 919 | } 920 | }, 921 | "once": { 922 | "version": "1.4.0", 923 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 924 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 925 | "requires": { 926 | "wrappy": "1" 927 | } 928 | }, 929 | "path-is-absolute": { 930 | "version": "1.0.1", 931 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 932 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 933 | "dev": true 934 | }, 935 | "pretty-hash": { 936 | "version": "1.0.1", 937 | "resolved": "https://registry.npmjs.org/pretty-hash/-/pretty-hash-1.0.1.tgz", 938 | "integrity": "sha1-FuBXkYje9WvbVliSvNBaXWUySAc=" 939 | }, 940 | "process-nextick-args": { 941 | "version": "1.0.7", 942 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 943 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 944 | "dev": true 945 | }, 946 | "protocol-buffers-encodings": { 947 | "version": "1.1.0", 948 | "resolved": "https://registry.npmjs.org/protocol-buffers-encodings/-/protocol-buffers-encodings-1.1.0.tgz", 949 | "integrity": "sha512-SmjEuAf3hc3h3rWZ6V1YaaQw2MNJWK848gLJgzx/sefOJdNLujKinJVXIS0q2cBQpQn2Q32TinawZyDZPzm4kQ==", 950 | "requires": { 951 | "signed-varint": "^2.0.1", 952 | "varint": "^5.0.0" 953 | } 954 | }, 955 | "pump": { 956 | "version": "3.0.0", 957 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 958 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 959 | "requires": { 960 | "end-of-stream": "^1.1.0", 961 | "once": "^1.3.1" 962 | } 963 | }, 964 | "random-access-file": { 965 | "version": "2.0.1", 966 | "resolved": "https://registry.npmjs.org/random-access-file/-/random-access-file-2.0.1.tgz", 967 | "integrity": "sha512-nb4fClpzoUY+v1SHrro+9yykN90eMA1rc+xM39tnZ5R3BgFY+J/NxPZ0KuUpishEsvnwou9Fvm2wa3cjeuG7vg==", 968 | "dev": true, 969 | "requires": { 970 | "mkdirp": "^0.5.1", 971 | "random-access-storage": "^1.1.1" 972 | } 973 | }, 974 | "random-access-memory": { 975 | "version": "3.0.0", 976 | "resolved": "https://registry.npmjs.org/random-access-memory/-/random-access-memory-3.0.0.tgz", 977 | "integrity": "sha512-O/d5C/kTOs/aDix1CD+N7z4SgNVGPx+xpFKXGfrC0TFpqYVrsJEUmQCl3ITTg7FVMoCmLBo5rdkA5FcFg00NTA==", 978 | "dev": true, 979 | "requires": { 980 | "inherits": "^2.0.3", 981 | "is-options": "^1.0.1", 982 | "random-access-storage": "^1.1.1" 983 | } 984 | }, 985 | "random-access-storage": { 986 | "version": "1.3.0", 987 | "resolved": "https://registry.npmjs.org/random-access-storage/-/random-access-storage-1.3.0.tgz", 988 | "integrity": "sha512-pdS9Mcb9TB7oICypPRALlheaSuszuAKmLVEPKJMuYor7R/zDuHh5ALuQoS+ox31XRwQUL+tDwWH2GPdyspwelA==", 989 | "dev": true, 990 | "requires": { 991 | "inherits": "^2.0.3" 992 | } 993 | }, 994 | "randombytes": { 995 | "version": "2.0.6", 996 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", 997 | "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", 998 | "requires": { 999 | "safe-buffer": "^5.1.0" 1000 | } 1001 | }, 1002 | "readable-stream": { 1003 | "version": "3.0.6", 1004 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.0.6.tgz", 1005 | "integrity": "sha512-9E1oLoOWfhSXHGv6QlwXJim7uNzd9EVlWK+21tCU9Ju/kR0/p2AZYPz4qSchgO8PlLIH4FpZYfzwS+rEksZjIg==", 1006 | "requires": { 1007 | "inherits": "^2.0.3", 1008 | "string_decoder": "^1.1.1", 1009 | "util-deprecate": "^1.0.1" 1010 | } 1011 | }, 1012 | "record-cache": { 1013 | "version": "1.1.0", 1014 | "resolved": "https://registry.npmjs.org/record-cache/-/record-cache-1.1.0.tgz", 1015 | "integrity": "sha512-u8rbtLEJV7HRacl/ZYwSBFD8NFyB3PfTTfGLP37IW3hftQCwu6z4Q2RLyxo1YJUNRTEzJfpLpGwVuEYdaIkG9Q==" 1016 | }, 1017 | "remove-trailing-separator": { 1018 | "version": "1.1.0", 1019 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 1020 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", 1021 | "dev": true 1022 | }, 1023 | "rusha": { 1024 | "version": "0.8.13", 1025 | "resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.13.tgz", 1026 | "integrity": "sha1-mghOe4YLF7/zAVuSxnpqM2GRUTo=" 1027 | }, 1028 | "safe-buffer": { 1029 | "version": "5.1.2", 1030 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1031 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1032 | }, 1033 | "signed-varint": { 1034 | "version": "2.0.1", 1035 | "resolved": "https://registry.npmjs.org/signed-varint/-/signed-varint-2.0.1.tgz", 1036 | "integrity": "sha1-UKmYnafJjCxh2tEZvJdHDvhSgSk=", 1037 | "requires": { 1038 | "varint": "~5.0.0" 1039 | } 1040 | }, 1041 | "simple-sha1": { 1042 | "version": "2.1.1", 1043 | "resolved": "https://registry.npmjs.org/simple-sha1/-/simple-sha1-2.1.1.tgz", 1044 | "integrity": "sha512-pFMPd+I/lQkpf4wFUeS/sED5IqdIG1lUlrQviBMV4u4mz8BRAcB5fvUx5Ckfg3kBigEglAjHg7E9k/yy2KlCqA==", 1045 | "requires": { 1046 | "rusha": "^0.8.1" 1047 | } 1048 | }, 1049 | "siphash24": { 1050 | "version": "1.1.1", 1051 | "resolved": "https://registry.npmjs.org/siphash24/-/siphash24-1.1.1.tgz", 1052 | "integrity": "sha512-dKKwjIoTOa587TARYLlBRXq2lkbu5Iz35XrEVWpelhBP1m8r2BGOy1QlaZe84GTFHG/BTucEUd2btnNc8QzIVA==", 1053 | "requires": { 1054 | "nanoassert": "^1.0.0" 1055 | } 1056 | }, 1057 | "sodium-javascript": { 1058 | "version": "0.5.5", 1059 | "resolved": "https://registry.npmjs.org/sodium-javascript/-/sodium-javascript-0.5.5.tgz", 1060 | "integrity": "sha512-UMmCHovws/sxIBZsIRhIl8uRPou/RFDD0vVop81T1hG106NLLgqajKKuHAOtAP6hflnZ0UrVA2VFwddTd/NQyA==", 1061 | "requires": { 1062 | "blake2b": "^2.1.1", 1063 | "nanoassert": "^1.0.0", 1064 | "siphash24": "^1.0.1", 1065 | "xsalsa20": "^1.0.0" 1066 | } 1067 | }, 1068 | "sodium-native": { 1069 | "version": "2.2.2", 1070 | "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-2.2.2.tgz", 1071 | "integrity": "sha512-TdAa+PlmWki2Spx3TJyGFVkj6gLsxs5HV/i/j2COZ5INEaCmLz15NIHgUAT/GQ0KrG8Ddy6tkvuP7B5YJpmW6g==", 1072 | "optional": true, 1073 | "requires": { 1074 | "ini": "^1.3.5", 1075 | "nan": "^2.4.0", 1076 | "node-gyp-build": "^3.0.0" 1077 | } 1078 | }, 1079 | "sodium-universal": { 1080 | "version": "2.0.0", 1081 | "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-2.0.0.tgz", 1082 | "integrity": "sha512-csdVyakzHJRyCevY4aZC2Eacda8paf+4nmRGF2N7KxCLKY2Ajn72JsExaQlJQ2BiXJncp44p3T+b80cU+2TTsg==", 1083 | "requires": { 1084 | "sodium-javascript": "~0.5.0", 1085 | "sodium-native": "^2.0.0" 1086 | } 1087 | }, 1088 | "sorted-indexof": { 1089 | "version": "1.0.0", 1090 | "resolved": "https://registry.npmjs.org/sorted-indexof/-/sorted-indexof-1.0.0.tgz", 1091 | "integrity": "sha1-F8dC/3zxh+L1mhXfm4HxemLOCJk=" 1092 | }, 1093 | "sparse-bitfield": { 1094 | "version": "3.0.3", 1095 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 1096 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 1097 | "dev": true, 1098 | "requires": { 1099 | "memory-pager": "^1.0.2" 1100 | } 1101 | }, 1102 | "speedometer": { 1103 | "version": "1.1.0", 1104 | "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.1.0.tgz", 1105 | "integrity": "sha512-z/wAiTESw2XVPssY2XRcme4niTc4S5FkkJ4gknudtVoc33Zil8TdTxHy5torRcgqMqksJV2Yz8HQcvtbsnw0mQ==" 1106 | }, 1107 | "stream-collector": { 1108 | "version": "1.0.1", 1109 | "resolved": "https://registry.npmjs.org/stream-collector/-/stream-collector-1.0.1.tgz", 1110 | "integrity": "sha1-TU5V8XE1YSGyxfZVn5RHBaso2xU=", 1111 | "requires": { 1112 | "once": "^1.3.1" 1113 | } 1114 | }, 1115 | "stream-each": { 1116 | "version": "1.2.3", 1117 | "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", 1118 | "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", 1119 | "dev": true, 1120 | "requires": { 1121 | "end-of-stream": "^1.1.0", 1122 | "stream-shift": "^1.0.0" 1123 | } 1124 | }, 1125 | "stream-shift": { 1126 | "version": "1.0.0", 1127 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", 1128 | "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", 1129 | "dev": true 1130 | }, 1131 | "string_decoder": { 1132 | "version": "1.1.1", 1133 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1134 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1135 | "requires": { 1136 | "safe-buffer": "~5.1.0" 1137 | } 1138 | }, 1139 | "supports-color": { 1140 | "version": "5.4.0", 1141 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 1142 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 1143 | "dev": true, 1144 | "requires": { 1145 | "has-flag": "^3.0.0" 1146 | } 1147 | }, 1148 | "thunky": { 1149 | "version": "1.0.2", 1150 | "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", 1151 | "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=" 1152 | }, 1153 | "time-ordered-set": { 1154 | "version": "1.0.2", 1155 | "resolved": "https://registry.npmjs.org/time-ordered-set/-/time-ordered-set-1.0.2.tgz", 1156 | "integrity": "sha512-vGO99JkxvgX+u+LtOKQEpYf31Kj3i/GNwVstfnh4dyINakMgeZCpew1e3Aj+06hEslhtHEd52g7m5IV+o1K8Mw==" 1157 | }, 1158 | "timeout-refresh": { 1159 | "version": "1.0.0", 1160 | "resolved": "https://registry.npmjs.org/timeout-refresh/-/timeout-refresh-1.0.0.tgz", 1161 | "integrity": "sha512-y5ajDPPtyhumr7xRnQgOMMVR5/EXMCVHPwM7RWnMUZx9UzT8FGRBtwG4/rh2AWHkDr7JR8dBHU6NDGx7tEiEAg==" 1162 | }, 1163 | "typescript": { 1164 | "version": "3.1.2", 1165 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.2.tgz", 1166 | "integrity": "sha512-gOoGJWbNnFAfP9FlrSV63LYD5DJqYJHG5ky1kOXSl3pCImn4rqWy/flyq1BRd4iChQsoCqjbQaqtmXO4yCVPCA==", 1167 | "dev": true 1168 | }, 1169 | "uint64be": { 1170 | "version": "2.0.2", 1171 | "resolved": "https://registry.npmjs.org/uint64be/-/uint64be-2.0.2.tgz", 1172 | "integrity": "sha512-9QqdvpGQTXgxthP+lY4e/gIBy+RuqcBaC6JVwT5I3bDLgT/btL6twZMR0pI3/Fgah9G/pdwzIprE5gL6v9UvyQ==", 1173 | "dev": true, 1174 | "requires": { 1175 | "buffer-alloc": "^1.1.0" 1176 | } 1177 | }, 1178 | "unixify": { 1179 | "version": "1.0.0", 1180 | "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", 1181 | "integrity": "sha1-OmQcjC/7zk2mg6XHDwOkYpQMIJA=", 1182 | "dev": true, 1183 | "requires": { 1184 | "normalize-path": "^2.1.1" 1185 | } 1186 | }, 1187 | "unordered-array-remove": { 1188 | "version": "1.0.2", 1189 | "resolved": "https://registry.npmjs.org/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz", 1190 | "integrity": "sha1-xUbo+I4xegzyZEyX7LV9umbSUO8=", 1191 | "dev": true 1192 | }, 1193 | "unordered-set": { 1194 | "version": "2.0.1", 1195 | "resolved": "https://registry.npmjs.org/unordered-set/-/unordered-set-2.0.1.tgz", 1196 | "integrity": "sha512-eUmNTPzdx+q/WvOHW0bgGYLWvWHNT3PTKEQLg0MAQhc0AHASHVHoP/9YytYd4RBVariqno/mEUhVZN98CmD7bg==" 1197 | }, 1198 | "util-deprecate": { 1199 | "version": "1.0.2", 1200 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1201 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1202 | }, 1203 | "utp-native": { 1204 | "version": "2.0.1", 1205 | "resolved": "https://registry.npmjs.org/utp-native/-/utp-native-2.0.1.tgz", 1206 | "integrity": "sha512-2tHf9YTUaV/yvP6ZHZU9ZngA+3TtTpRiBkNZqCEksk5bSNwnOsUNl3K3cdQqoGg0XnOl2pYqIy1I5o2nhZc/Gw==", 1207 | "requires": { 1208 | "napi-macros": "^1.8.1", 1209 | "node-gyp-build": "^3.4.0", 1210 | "readable-stream": "^3.0.2", 1211 | "timeout-refresh": "^1.0.0", 1212 | "unordered-set": "^2.0.1" 1213 | } 1214 | }, 1215 | "varint": { 1216 | "version": "5.0.0", 1217 | "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", 1218 | "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=" 1219 | }, 1220 | "wrappy": { 1221 | "version": "1.0.2", 1222 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1223 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1224 | }, 1225 | "xor-distance": { 1226 | "version": "1.0.0", 1227 | "resolved": "https://registry.npmjs.org/xor-distance/-/xor-distance-1.0.0.tgz", 1228 | "integrity": "sha1-2nNdmyT8yo282bN00W0qAe6VQcY=" 1229 | }, 1230 | "xsalsa20": { 1231 | "version": "1.0.2", 1232 | "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.0.2.tgz", 1233 | "integrity": "sha512-g1DFmZ5JJ9Qzvt4dMw6m9IydqoCSP381ucU5zm46Owbk3bwmqAr8eEJirOPc7PrXRn45drzOpAyDp8jsnoyXyw==" 1234 | }, 1235 | "xtend": { 1236 | "version": "4.0.1", 1237 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 1238 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 1239 | } 1240 | } 1241 | } 1242 | --------------------------------------------------------------------------------