├── 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 |
--------------------------------------------------------------------------------