├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── UPGRADE.md ├── index.js ├── package-lock.json ├── package.json └── test └── all.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "lts/*" 4 | - "10" 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Andrew Osheroff 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `@corestore/networker` 2 | [![Build Status](https://travis-ci.com/andrewosh/corestore-networker.svg?branch=master)](https://travis-ci.com/andrewosh/corestore-networker) 3 | 4 | A corestore networking module that uses [hyperswarm](https://github.com/hyperswarm/network) to discovery peers. This module powers the networking portion of the [Hyperspace](https://github.com/hyperspace-org/hyperspace). 5 | 6 | Calls to `configure` will not be persisted across restarts, so you'll need to use a separate database that maps discovery keys to network configurations. The Hyperdrive daemon uses [Level](https://github.com/level/level) for this. 7 | 8 | Since corestore has an all-to-all replication model (any shared cores between two peers will be automatically replicated), only one connection needs to be maintained per peer. If multiple connections are opened to a single peer as a result of that peer announcing many keys, then these connections will be automatically deduplicated by comparing NOISE keypairs. 9 | 10 | ### Upgrading from corestore-swarm-networking 11 | This module's going through a major change + a rename as part of our push to develop [Hyperspace](https://github.com/hyperspace-org/hyperspace). With these updates, `@corestore/networker` and Hyperspace's `network` APIs are now interchangeable! 12 | 13 | If you've previously been using `corestore-swarm-networking` and you'd like to upgrade, [`UPGRADE.md`](https://github.com/andrewosh/corestore-swarm-networking/blob/master/UPGRADE.md) explains the changes. 14 | 15 | ### Installation 16 | ``` 17 | npm i @corestore/networker 18 | ``` 19 | 20 | ### Usage 21 | ```js 22 | const Networker = require('@corestore/networker') 23 | const Corestore = require('corestore') 24 | const ram = require('random-access-memory') 25 | 26 | const store = new Corestore(ram) 27 | await store.ready() 28 | 29 | const networker = new Networker(store) 30 | 31 | // Start announcing or lookup up a discovery key on the DHT. 32 | await networker.configure(discoveryKey, { announce: true, lookup: true }) 33 | 34 | // Stop announcing or looking up a discovery key. 35 | networker.configure(discoveryKey, { announce: false, lookup: false }) 36 | 37 | // Shut down the swarm (and unnanounce all keys) 38 | await networker.close() 39 | ``` 40 | 41 | ### API 42 | 43 | #### `const networker = new Networker(corestore, networkingOptions = {})` 44 | Creates a new SwarmNetworker that will open replication streams on the `corestore` instance argument. 45 | 46 | `networkOpts` is an options map that can include all [hyperswarm](https://github.com/hyperswarm/hyperswarm) options (which will be passed to the internal swarm instance) as well as: 47 | ```js 48 | { 49 | id: crypto.randomBytes(32), // A randomly-generated peer ID, 50 | keyPair: HypercoreProtocol.keyPair(), // A NOISE keypair that's used across all connections. 51 | onauthenticate: (remotePublicKey, cb) => { cb() }, // A NOISE keypair authentication hook 52 | swarm: hyperswarm(), // A hyperswarm instance to use (e.g., hyperswarm-web in the browser) 53 | } 54 | ``` 55 | 56 | #### `networker.peers` 57 | The list of currently-connected peers. Each Peer object has the form: 58 | ``` 59 | { 60 | remotePublicKey: 0xabc..., // The remote peer's NOISE key. 61 | remoteAddress: '10.23.4...:8080', // The remote peer's host/port. 62 | type: 'tcp' | 'utp', // The connection type 63 | stream // The connection's HypercoreProtocol stream 64 | } 65 | ``` 66 | 67 | #### `networker.on('peer-add', peer)` 68 | Emitted when a new connection has been established with `peer`. 69 | 70 | #### `networker.on('peer-remove', peer)` 71 | Emitted when `peer`'s connection has been closed. 72 | 73 | #### `await networker.configure(discoveryKey, opts = {})` 74 | Join or leave the swarm with the `discoveryKey` argument as the topic. 75 | 76 | If this is the first time `configure` has been called, the swarm instance will be created automatically. 77 | 78 | Waits for the topic to be fully joined/left before resolving. 79 | 80 | `opts` is an options map of network configuration options that can include: 81 | ```js 82 | announce: true, // Announce the discovery key on the swarm 83 | lookup: true // Look up the discovery key on the swarm, 84 | flush: true // Wait for a complete swarm flush before resolving. 85 | ``` 86 | 87 | #### `networker.joined(discoveryKey)` 88 | Returns `true` if that discovery key is being swarmed. 89 | 90 | #### `networker.flushed(discoveryKey)` 91 | Returns true if the swarm has discovered and attempted to connect to all peers announcing `discoveryKey`. 92 | 93 | #### `networker.listen()` 94 | Starts listening for connections on Hyperswarm's default port. 95 | 96 | This is called automatically before the first call to `configure`. 97 | 98 | #### `await networker.close()` 99 | Shut down the swarm networker. 100 | 101 | This will close all replication streams and then destroy the swarm instance. It will wait for all topics to be unannounced, so it might take some time. 102 | 103 | ### Swarm Extensions 104 | `@corestore/networker` introduces stream-level extensions that operate on each connection. They adhere to Hypercore's [extension API](https://github.com/hypercore-protocol/hypercore#ext--feedregisterextensionname-handlers). 105 | 106 | #### `const ext = await networker.registerExtension(name, { encoding, onmessage, onerror })` 107 | Registers an extension with name `name`. 108 | 109 | The `onmessage` and `onerror` handlers are both optional methods. `onerror` is an errback, and `onmessage` must have the signature: 110 | 111 | ```js 112 | function onmessage (msg, peer) { 113 | // `msg` is the (optionally-decoded) message that was received from `peer`. 114 | // `peer` is a `Peer` object (described above in `networker.peers`) 115 | } 116 | ``` 117 | 118 | #### `ext.send(msg, peer)` 119 | Send `msg` (which will optionally be encoded by the extension's encoding opt) to `peer`. `peer` must be a Peer object taken from `networker.peers` or emitted by the networker's `peer-add` event. 120 | 121 | #### `ext.broadcast(msg)` 122 | Broadcast `msg` to all currently-connected peers. 123 | 124 | #### `ext.destroy()` 125 | Destroy the extension and unregister it from all connections. 126 | 127 | ### License 128 | MIT 129 | -------------------------------------------------------------------------------- /UPGRADE.md: -------------------------------------------------------------------------------- 1 | ## `@corestore/networker` v1.0.0 2 | 3 | If you're migrating from `corestore-swarm-networking` v5 to `@corestore/networker` v1, there have been a few breaking changes to be aware of: 4 | 5 | #### `join`/`leave` -> `configure` 6 | `join` and `leave` have been replaced by a single method, `configure`, which takes the options `announce`, `lookup`, and `flushed`. 7 | 8 | Using `configure`, a `join` is `configure(discoveryKey, { announce: true, lookup: true }` and a `leave` is `configure(discoveryKey, { announce: false, lookup: false })` 9 | 10 | #### The `status` method 11 | The `status` method previously just fowarded Hyperswarm's `status`. It now returns the current network configuration for a given discovery key. To get the Hyperswarm status directly, you can do `networker.swarm.status`. 12 | 13 | #### Other Assorted Changes 14 | * The public `streams` and `peers` properties are now `Set`s instead of Arrays. 15 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const { NanoresourcePromise: Nanoresource } = require('nanoresource-promise/emitter') 2 | const HypercoreProtocol = require('hypercore-protocol') 3 | const hyperswarm = require('hyperswarm') 4 | const codecs = require('codecs') 5 | const pump = require('pump') 6 | const maybe = require('call-me-maybe') 7 | 8 | const STREAM_PEER = Symbol('networker-stream-peer') 9 | 10 | class CorestoreNetworker extends Nanoresource { 11 | constructor (corestore, opts = {}) { 12 | super() 13 | this.corestore = corestore 14 | this.opts = opts 15 | this.keyPair = opts.keyPair || HypercoreProtocol.keyPair() 16 | 17 | this._replicationOpts = { 18 | encrypt: true, 19 | live: true, 20 | keyPair: this.keyPair, 21 | onauthenticate: opts.onauthenticate 22 | } 23 | 24 | this.streams = new Set() 25 | this.peers = new Set() 26 | 27 | this._joined = new Set() 28 | this._flushed = new Set() 29 | this._configurations = new Map() 30 | 31 | this._extensions = new Set() 32 | 33 | this._streamsProcessing = 0 34 | this._streamsProcessed = 0 35 | 36 | this.setMaxListeners(0) 37 | } 38 | 39 | _replicate (protocolStream) { 40 | // The initiator parameter here is ignored, since we're passing in a stream. 41 | this.corestore.replicate(false, { 42 | ...this._replicationOpts, 43 | stream: protocolStream 44 | }) 45 | } 46 | 47 | async _flush (keyString, keyBuf) { 48 | await new Promise((resolve, reject) => { 49 | this.swarm.flush(err => { 50 | if (err) reject(err) 51 | else resolve() 52 | }) 53 | }) 54 | if (!this._joined.has(keyString)) { 55 | return 56 | } 57 | const processingAfterFlush = this._streamsProcessing 58 | if (this._streamsProcessed >= processingAfterFlush) { 59 | this._flushed.add(keyString) 60 | this.emit('flushed', keyBuf) 61 | } else { 62 | // Wait until the stream processing has caught up. 63 | const processedListener = () => { 64 | if (!this._joined.has(keyString)) { 65 | this.removeListener('stream-processed', processedListener) 66 | return 67 | } 68 | if (this._streamsProcessed >= processingAfterFlush) { 69 | this._flushed.add(keyString) 70 | this.emit('flushed', keyBuf) 71 | this.removeListener('stream-processed', processedListener) 72 | } 73 | } 74 | this.on('stream-processed', processedListener) 75 | } 76 | } 77 | 78 | async _join (discoveryKey, opts = {}) { 79 | const keyString = toString(discoveryKey) 80 | const keyBuf = (discoveryKey instanceof Buffer) ? discoveryKey : Buffer.from(discoveryKey, 'hex') 81 | 82 | this._joined.add(keyString) 83 | this.emit('joined', keyBuf) 84 | this.swarm.join(keyBuf, { 85 | announce: opts.announce, 86 | lookup: opts.lookup 87 | }) 88 | 89 | const flushedProm = this._flush(keyString, keyBuf) 90 | if (opts.flush !== false) await flushedProm 91 | else flushedProm.catch(() => {}) 92 | } 93 | 94 | _leave (discoveryKey) { 95 | const keyString = toString(discoveryKey) 96 | const keyBuf = (discoveryKey instanceof Buffer) ? discoveryKey : Buffer.from(discoveryKey, 'hex') 97 | 98 | this._joined.delete(keyString) 99 | 100 | return new Promise((resolve, reject) => { 101 | this.swarm.leave(keyBuf, err => { 102 | if (err) return reject(err) 103 | return resolve() 104 | }) 105 | }) 106 | } 107 | 108 | _registerAllExtensions (peer) { 109 | for (const ext of this._extensions) { 110 | ext._registerExtension(peer) 111 | } 112 | } 113 | 114 | _unregisterAllExtensions (peer) { 115 | for (const ext of this._extensions) { 116 | ext._unregisterExtension(peer) 117 | } 118 | } 119 | 120 | _addStream (stream) { 121 | this._replicate(stream) 122 | this.streams.add(stream) 123 | 124 | const peer = intoPeer(stream) 125 | this.peers.add(peer) 126 | stream[STREAM_PEER] = peer 127 | 128 | this._registerAllExtensions(peer) 129 | 130 | this.emit('peer-add', peer) 131 | this.emit('handshake', stream) 132 | } 133 | 134 | _removeStream (stream) { 135 | this.streams.delete(stream) 136 | if (stream[STREAM_PEER]) { 137 | const peer = stream[STREAM_PEER] 138 | this._unregisterAllExtensions(peer) 139 | this.peers.delete(peer) 140 | this.emit('peer-remove', peer) 141 | } 142 | } 143 | 144 | _open () { 145 | const self = this 146 | if (this.swarm) return 147 | 148 | this.swarm = this.opts.swarm || hyperswarm({ 149 | ...this.opts, 150 | announceLocalNetwork: true, 151 | queue: { multiplex: true } 152 | }) 153 | this.swarm.on('error', err => this.emit('error', err)) 154 | this.swarm.on('connection', (socket, info) => { 155 | const isInitiator = !!info.client 156 | if (socket.remoteAddress === '::ffff:127.0.0.1' || socket.remoteAddress === '127.0.0.1') return null 157 | 158 | var finishedHandshake = false 159 | var processed = false 160 | 161 | const protocolStream = new HypercoreProtocol(isInitiator, { ...this._replicationOpts }) 162 | protocolStream.on('handshake', () => { 163 | const deduped = info.deduplicate(protocolStream.publicKey, protocolStream.remotePublicKey) 164 | if (!deduped) { 165 | finishedHandshake = true 166 | self._addStream(protocolStream) 167 | } 168 | if (!processed) { 169 | processed = true 170 | this._streamsProcessed++ 171 | this.emit('stream-processed') 172 | } 173 | }) 174 | protocolStream.on('close', () => { 175 | this.emit('stream-closed', protocolStream, info, finishedHandshake) 176 | if (!processed) { 177 | processed = true 178 | this._streamsProcessed++ 179 | this.emit('stream-processed') 180 | } 181 | }) 182 | 183 | pump(socket, protocolStream, socket, err => { 184 | if (err) this.emit('replication-error', err) 185 | this._removeStream(protocolStream) 186 | }) 187 | 188 | this.emit('stream-opened', protocolStream, info) 189 | this._streamsProcessing++ 190 | }) 191 | } 192 | 193 | async _close () { 194 | if (!this.swarm) return null 195 | 196 | for (const ext of this._extensions) { 197 | ext.destroy() 198 | } 199 | this._extensions.clear() 200 | 201 | for (const stream of this.streams) { 202 | stream.destroy() 203 | } 204 | 205 | return new Promise((resolve, reject) => { 206 | this.swarm.destroy(err => { 207 | if (err) return reject(err) 208 | this.swarm = null 209 | return resolve() 210 | }) 211 | }) 212 | } 213 | 214 | listen () { 215 | return this.open() 216 | } 217 | 218 | status (discoveryKey) { 219 | if (Buffer.isBuffer(discoveryKey)) discoveryKey = discoveryKey.toString('hex') 220 | return this._configurations.get(discoveryKey) 221 | } 222 | 223 | allStatuses () { 224 | return [...this._configurations].map(([k, v]) => { 225 | return { 226 | discoveryKey: Buffer.from(k, 'hex'), 227 | ...v 228 | } 229 | }) 230 | } 231 | 232 | configure (discoveryKey, opts = {}, cb) { 233 | return maybeOptional(cb, this._configure(discoveryKey, opts)) 234 | } 235 | 236 | async _configure (discoveryKey, opts) { 237 | if (!this.swarm) this.open() 238 | if (this.swarm && this.swarm.destroyed) return 239 | 240 | const config = { 241 | announce: opts.announce !== false, 242 | lookup: opts.lookup !== false 243 | } 244 | opts = { ...opts, ...config } 245 | 246 | const keyString = toString(discoveryKey) 247 | const prev = this._configurations.get(keyString) 248 | const joining = config.announce || config.lookup 249 | 250 | if (joining) this._configurations.set(keyString, opts) 251 | else this._configurations.delete(keyString) 252 | 253 | if (joining) { 254 | if (opts.rejoin === false && prev && prev.lookup === config.lookup && prev.announce === config.announce) return 255 | return this._join(discoveryKey, opts) 256 | } else { 257 | return this._leave(discoveryKey) 258 | } 259 | } 260 | 261 | joined (discoveryKey) { 262 | if (typeof discoveryKey !== 'string') discoveryKey = discoveryKey.toString('hex') 263 | return this._joined.has(discoveryKey) 264 | } 265 | 266 | flushed (discoveryKey) { 267 | if (typeof discoveryKey !== 'string') discoveryKey = discoveryKey.toString('hex') 268 | return this._flushed.has(discoveryKey) 269 | } 270 | 271 | registerExtension (name, handlers) { 272 | if (name && typeof name === 'object') return this.registerExtension(null, name) 273 | const ext = new SwarmExtension(this, name || handlers.name, handlers) 274 | this._extensions.add(ext) 275 | for (const peer of this.peers) { 276 | ext._registerExtension(peer) 277 | } 278 | return ext 279 | } 280 | } 281 | 282 | module.exports = CorestoreNetworker 283 | 284 | class SwarmExtension { 285 | constructor (networker, name, opts) { 286 | if (typeof opts === 'function') opts = opts(this) 287 | this.networker = networker 288 | this.name = name 289 | this.encoding = codecs((opts && opts.encoding) || 'binary') 290 | this._peerExtensions = new Map() 291 | 292 | this.onmessage = opts.onmessage 293 | this.onerror = opts.onerror 294 | } 295 | 296 | _registerExtension (peer) { 297 | peer.stream.extensions.exclusive = false 298 | const peerExt = peer.stream.registerExtension(this.name, { 299 | encoding: this.encoding, 300 | onmessage: this.onmessage && (message => this.onmessage(message, peer)), 301 | onerror: this.onerror && (err => this.onerror(err)) 302 | }) 303 | this._peerExtensions.set(peer, peerExt) 304 | } 305 | 306 | _unregisterExtension (peer) { 307 | if (!this._peerExtensions.has(peer)) return 308 | const peerExt = this._peerExtensions.get(peer) 309 | peerExt.destroy() 310 | this._peerExtensions.delete(peer) 311 | } 312 | 313 | broadcast (message) { 314 | for (const peerExt of this._peerExtensions.values()) { 315 | peerExt.send(message) 316 | } 317 | } 318 | 319 | send (message, peer) { 320 | const peerExt = this._peerExtensions.get(peer) 321 | if (!peer) throw new Error('Peer must be specified.') 322 | if (!peerExt) throw new Error('Extension not registered for peer ' + peer.remotePublicKey.toString('hex')) 323 | peerExt.send(message) 324 | } 325 | 326 | destroy () { 327 | for (const peerExt of this._peerExtensions.values()) { 328 | peerExt.destroy() 329 | } 330 | this._peerExtensions.clear() 331 | this.onmessage = null 332 | this.onerror = null 333 | } 334 | } 335 | 336 | function intoPeer (stream) { 337 | return { 338 | remotePublicKey: stream.remotePublicKey, 339 | remoteAddress: stream.remoteAddress, 340 | type: stream.remoteType, 341 | stream 342 | } 343 | } 344 | 345 | function toString (dk) { 346 | return typeof dk === 'string' ? dk : dk.toString('hex') 347 | } 348 | 349 | function noop () {} 350 | 351 | function maybeOptional (cb, prom) { 352 | if (cb) maybe(cb, prom) 353 | else prom.catch(noop) 354 | return prom 355 | } 356 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@corestore/networker", 3 | "version": "1.2.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@hyperswarm/dht": { 8 | "version": "4.0.1", 9 | "resolved": "https://registry.npmjs.org/@hyperswarm/dht/-/dht-4.0.1.tgz", 10 | "integrity": "sha512-wMBbz0m8rgQMERt/Ot6BGo5Y8+ovJSZmqxF0oA2xYPT8vCVBIr8g2F1BkQcLbX2iKRLXRnhic02OEq8b41M0sw==", 11 | "requires": { 12 | "@hyperswarm/hypersign": "^2.0.0", 13 | "dht-rpc": "^4.8.0", 14 | "end-of-stream": "^1.4.1", 15 | "guard-timeout": "^2.0.0", 16 | "hashlru": "^2.3.0", 17 | "protocol-buffers-encodings": "^1.1.0", 18 | "record-cache": "^1.1.0", 19 | "sodium-native": "^3.1.1" 20 | } 21 | }, 22 | "@hyperswarm/discovery": { 23 | "version": "2.0.0", 24 | "resolved": "https://registry.npmjs.org/@hyperswarm/discovery/-/discovery-2.0.0.tgz", 25 | "integrity": "sha512-HfEyukBI7hqcccXcFvGIjzcO8bJivdgDdC4LMWjQDWbH8NLZVQU7tKrcazXgqdDtOTb1KFN8ZKxJswz9ThmvgQ==", 26 | "requires": { 27 | "@hyperswarm/dht": "^4.0.0", 28 | "multicast-dns": "^7.2.2", 29 | "timeout-refresh": "^1.0.2" 30 | } 31 | }, 32 | "@hyperswarm/hypersign": { 33 | "version": "2.1.1", 34 | "resolved": "https://registry.npmjs.org/@hyperswarm/hypersign/-/hypersign-2.1.1.tgz", 35 | "integrity": "sha512-RcczqJsu2VScRoyJdLbxpYMBNq+73HJT3FVzDZXSOob/WqEeiN2WIvuDtvmFoufAuO/3YVfde/NpZFc/OPjmjw==", 36 | "requires": { 37 | "sodium-native": "^3.1.1" 38 | } 39 | }, 40 | "@hyperswarm/network": { 41 | "version": "2.0.0", 42 | "resolved": "https://registry.npmjs.org/@hyperswarm/network/-/network-2.0.0.tgz", 43 | "integrity": "sha512-a1AbuGbpe89yOk8qDQ4I2Yi+zl5kRCRcGSetcZKKrSCYqjTgOSRRCXCqhPc2l6l9oB/ecUA0Da8f5Ti6OuFNnQ==", 44 | "requires": { 45 | "@hyperswarm/discovery": "^2.0.0", 46 | "nanoresource": "^1.3.0", 47 | "utp-native": "^2.2.1" 48 | } 49 | }, 50 | "abstract-extension": { 51 | "version": "3.1.1", 52 | "resolved": "https://registry.npmjs.org/abstract-extension/-/abstract-extension-3.1.1.tgz", 53 | "integrity": "sha512-qmUIqQEh6ZZBKN6JfysKgCEBqI4qVexE6/N/MUJjqtQhhuGR8a16GKnK6SGFKv/n1cAlbYxLDXbtyhkxSnVYRQ==", 54 | "requires": { 55 | "codecs": "^2.0.0" 56 | } 57 | }, 58 | "acorn": { 59 | "version": "6.4.1", 60 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", 61 | "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", 62 | "dev": true 63 | }, 64 | "acorn-jsx": { 65 | "version": "5.2.0", 66 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", 67 | "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", 68 | "dev": true 69 | }, 70 | "ajv": { 71 | "version": "6.12.3", 72 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", 73 | "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", 74 | "dev": true, 75 | "requires": { 76 | "fast-deep-equal": "^3.1.1", 77 | "fast-json-stable-stringify": "^2.0.0", 78 | "json-schema-traverse": "^0.4.1", 79 | "uri-js": "^4.2.2" 80 | } 81 | }, 82 | "ajv-keywords": { 83 | "version": "3.5.2", 84 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", 85 | "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", 86 | "dev": true 87 | }, 88 | "ansi-escapes": { 89 | "version": "3.2.0", 90 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 91 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", 92 | "dev": true 93 | }, 94 | "ansi-regex": { 95 | "version": "2.1.1", 96 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 97 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 98 | "dev": true 99 | }, 100 | "ansi-styles": { 101 | "version": "2.2.1", 102 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 103 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 104 | "dev": true 105 | }, 106 | "argparse": { 107 | "version": "1.0.10", 108 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 109 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 110 | "dev": true, 111 | "requires": { 112 | "sprintf-js": "~1.0.2" 113 | } 114 | }, 115 | "array-includes": { 116 | "version": "3.1.1", 117 | "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", 118 | "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", 119 | "dev": true, 120 | "requires": { 121 | "define-properties": "^1.1.3", 122 | "es-abstract": "^1.17.0", 123 | "is-string": "^1.0.5" 124 | } 125 | }, 126 | "atomic-batcher": { 127 | "version": "1.0.2", 128 | "resolved": "https://registry.npmjs.org/atomic-batcher/-/atomic-batcher-1.0.2.tgz", 129 | "integrity": "sha1-0WkB0QzOxZUWwZe5zNiTBom4E7Q=", 130 | "dev": true 131 | }, 132 | "babel-code-frame": { 133 | "version": "6.26.0", 134 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 135 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 136 | "dev": true, 137 | "requires": { 138 | "chalk": "^1.1.3", 139 | "esutils": "^2.0.2", 140 | "js-tokens": "^3.0.2" 141 | }, 142 | "dependencies": { 143 | "chalk": { 144 | "version": "1.1.3", 145 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 146 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 147 | "dev": true, 148 | "requires": { 149 | "ansi-styles": "^2.2.1", 150 | "escape-string-regexp": "^1.0.2", 151 | "has-ansi": "^2.0.0", 152 | "strip-ansi": "^3.0.0", 153 | "supports-color": "^2.0.0" 154 | } 155 | }, 156 | "strip-ansi": { 157 | "version": "3.0.1", 158 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 159 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 160 | "dev": true, 161 | "requires": { 162 | "ansi-regex": "^2.0.0" 163 | } 164 | } 165 | } 166 | }, 167 | "balanced-match": { 168 | "version": "1.0.0", 169 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 170 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 171 | "dev": true 172 | }, 173 | "bitfield-rle": { 174 | "version": "2.2.1", 175 | "resolved": "https://registry.npmjs.org/bitfield-rle/-/bitfield-rle-2.2.1.tgz", 176 | "integrity": "sha512-wrDhHe7LUkqaytxgbsFXoemzHRv6e8FrVNWWsQCgUfmuVYW6ke44hoGc9VdpjgfIsJ/ejmCFA8wDtDqACNAvyw==", 177 | "dev": true, 178 | "requires": { 179 | "buffer-alloc-unsafe": "^1.1.0", 180 | "varint": "^4.0.0" 181 | }, 182 | "dependencies": { 183 | "varint": { 184 | "version": "4.0.1", 185 | "resolved": "https://registry.npmjs.org/varint/-/varint-4.0.1.tgz", 186 | "integrity": "sha1-SQgpuULSSEY7KzUJeZXDv3NxmOk=", 187 | "dev": true 188 | } 189 | } 190 | }, 191 | "blake2b": { 192 | "version": "2.1.3", 193 | "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.3.tgz", 194 | "integrity": "sha512-pkDss4xFVbMb4270aCyGD3qLv92314Et+FsKzilCLxDz5DuZ2/1g3w4nmBbu6nKApPspnjG7JcwTjGZnduB1yg==", 195 | "requires": { 196 | "blake2b-wasm": "^1.1.0", 197 | "nanoassert": "^1.0.0" 198 | }, 199 | "dependencies": { 200 | "nanoassert": { 201 | "version": "1.1.0", 202 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-1.1.0.tgz", 203 | "integrity": "sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40=" 204 | } 205 | } 206 | }, 207 | "blake2b-universal": { 208 | "version": "1.0.1", 209 | "resolved": "https://registry.npmjs.org/blake2b-universal/-/blake2b-universal-1.0.1.tgz", 210 | "integrity": "sha512-vmMqpF8E9RCde8/+Su/s2rZRxOBwAYQsTyCgok4kLWhWrzMrX0CzID6pVheNJSESY0S0FNTOG4QfRJqnSLOjFA==", 211 | "requires": { 212 | "blake2b": "^2.1.3", 213 | "sodium-native": "^3.0.1" 214 | } 215 | }, 216 | "blake2b-wasm": { 217 | "version": "1.1.7", 218 | "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-1.1.7.tgz", 219 | "integrity": "sha512-oFIHvXhlz/DUgF0kq5B1CqxIDjIJwh9iDeUUGQUcvgiGz7Wdw03McEO7CfLBy7QKGdsydcMCgO9jFNBAFCtFcA==", 220 | "requires": { 221 | "nanoassert": "^1.0.0" 222 | }, 223 | "dependencies": { 224 | "nanoassert": { 225 | "version": "1.1.0", 226 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-1.1.0.tgz", 227 | "integrity": "sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40=" 228 | } 229 | } 230 | }, 231 | "brace-expansion": { 232 | "version": "1.1.11", 233 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 234 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 235 | "dev": true, 236 | "requires": { 237 | "balanced-match": "^1.0.0", 238 | "concat-map": "0.0.1" 239 | } 240 | }, 241 | "buffer-alloc": { 242 | "version": "1.2.0", 243 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 244 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 245 | "dev": true, 246 | "requires": { 247 | "buffer-alloc-unsafe": "^1.1.0", 248 | "buffer-fill": "^1.0.0" 249 | } 250 | }, 251 | "buffer-alloc-unsafe": { 252 | "version": "1.1.0", 253 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 254 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", 255 | "dev": true 256 | }, 257 | "buffer-fill": { 258 | "version": "1.0.0", 259 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 260 | "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", 261 | "dev": true 262 | }, 263 | "buffer-from": { 264 | "version": "1.1.1", 265 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 266 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 267 | "dev": true 268 | }, 269 | "bulk-write-stream": { 270 | "version": "1.1.4", 271 | "resolved": "https://registry.npmjs.org/bulk-write-stream/-/bulk-write-stream-1.1.4.tgz", 272 | "integrity": "sha512-GtKwd/4etuk1hNeprXoESBO1RSeRYJMXKf+O0qHmWdUomLT8ysNEfX/4bZFXr3BK6eukpHiEnhY2uMtEHDM2ng==", 273 | "dev": true, 274 | "requires": { 275 | "buffer-from": "^1.0.0", 276 | "inherits": "^2.0.1", 277 | "readable-stream": "^2.1.4" 278 | }, 279 | "dependencies": { 280 | "readable-stream": { 281 | "version": "2.3.7", 282 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 283 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 284 | "dev": true, 285 | "requires": { 286 | "core-util-is": "~1.0.0", 287 | "inherits": "~2.0.3", 288 | "isarray": "~1.0.0", 289 | "process-nextick-args": "~2.0.0", 290 | "safe-buffer": "~5.1.1", 291 | "string_decoder": "~1.1.1", 292 | "util-deprecate": "~1.0.1" 293 | } 294 | }, 295 | "safe-buffer": { 296 | "version": "5.1.2", 297 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 298 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 299 | "dev": true 300 | }, 301 | "string_decoder": { 302 | "version": "1.1.1", 303 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 304 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 305 | "dev": true, 306 | "requires": { 307 | "safe-buffer": "~5.1.0" 308 | } 309 | } 310 | } 311 | }, 312 | "call-me-maybe": { 313 | "version": "1.0.1", 314 | "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", 315 | "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" 316 | }, 317 | "caller-path": { 318 | "version": "0.1.0", 319 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 320 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 321 | "dev": true, 322 | "requires": { 323 | "callsites": "^0.2.0" 324 | } 325 | }, 326 | "callsites": { 327 | "version": "0.2.0", 328 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 329 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 330 | "dev": true 331 | }, 332 | "chacha20-universal": { 333 | "version": "1.0.4", 334 | "resolved": "https://registry.npmjs.org/chacha20-universal/-/chacha20-universal-1.0.4.tgz", 335 | "integrity": "sha512-/IOxdWWNa7nRabfe7+oF+jVkGjlr2xUL4J8l/OvzZhj+c9RpMqoo3Dq+5nU1j/BflRV4BKnaQ4+4oH1yBpQG1Q==", 336 | "requires": { 337 | "nanoassert": "^2.0.0" 338 | } 339 | }, 340 | "chalk": { 341 | "version": "2.4.2", 342 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 343 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 344 | "dev": true, 345 | "requires": { 346 | "ansi-styles": "^3.2.1", 347 | "escape-string-regexp": "^1.0.5", 348 | "supports-color": "^5.3.0" 349 | }, 350 | "dependencies": { 351 | "ansi-styles": { 352 | "version": "3.2.1", 353 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 354 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 355 | "dev": true, 356 | "requires": { 357 | "color-convert": "^1.9.0" 358 | } 359 | }, 360 | "supports-color": { 361 | "version": "5.5.0", 362 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 363 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 364 | "dev": true, 365 | "requires": { 366 | "has-flag": "^3.0.0" 367 | } 368 | } 369 | } 370 | }, 371 | "chardet": { 372 | "version": "0.4.2", 373 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", 374 | "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", 375 | "dev": true 376 | }, 377 | "circular-json": { 378 | "version": "0.3.3", 379 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 380 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 381 | "dev": true 382 | }, 383 | "cli-cursor": { 384 | "version": "2.1.0", 385 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 386 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 387 | "dev": true, 388 | "requires": { 389 | "restore-cursor": "^2.0.0" 390 | } 391 | }, 392 | "cli-width": { 393 | "version": "2.2.1", 394 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", 395 | "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", 396 | "dev": true 397 | }, 398 | "clone": { 399 | "version": "2.1.2", 400 | "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", 401 | "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" 402 | }, 403 | "codecs": { 404 | "version": "2.1.0", 405 | "resolved": "https://registry.npmjs.org/codecs/-/codecs-2.1.0.tgz", 406 | "integrity": "sha512-nSWYToViFEpZXOxhtMQ6IDs76TN9xKIkHOu1KCr/iFiBcgzKuY1AFPZktuXN8r82FbZ/TXP9fwITszLgcp3eQg==" 407 | }, 408 | "color-convert": { 409 | "version": "1.9.3", 410 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 411 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 412 | "dev": true, 413 | "requires": { 414 | "color-name": "1.1.3" 415 | } 416 | }, 417 | "color-name": { 418 | "version": "1.1.3", 419 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 420 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 421 | "dev": true 422 | }, 423 | "concat-map": { 424 | "version": "0.0.1", 425 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 426 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 427 | "dev": true 428 | }, 429 | "contains-path": { 430 | "version": "0.1.0", 431 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", 432 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", 433 | "dev": true 434 | }, 435 | "core-util-is": { 436 | "version": "1.0.2", 437 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 438 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 439 | "dev": true 440 | }, 441 | "corestore": { 442 | "version": "5.7.3", 443 | "resolved": "https://registry.npmjs.org/corestore/-/corestore-5.7.3.tgz", 444 | "integrity": "sha512-H9JKy7cS0OMtaGX6uZRt+4GFqWlJNtzfQXk04xPGJSiNT96ecwY5tNwR5K72+zOX0sZuNainhvyGZkD9rVZhuA==", 445 | "dev": true, 446 | "requires": { 447 | "call-me-maybe": "^1.0.1", 448 | "dat-encoding": "^5.0.1", 449 | "derive-key": "^1.0.0", 450 | "derived-key-storage": "^2.1.0", 451 | "fd-lock": "^1.0.2", 452 | "hypercore": "^9.0.0", 453 | "hypercore-crypto": "^2.0.0", 454 | "hypercore-protocol": "^8.0.0", 455 | "nanoresource": "^1.3.0", 456 | "refpool": "^1.2.0" 457 | } 458 | }, 459 | "count-trailing-zeros": { 460 | "version": "1.0.1", 461 | "resolved": "https://registry.npmjs.org/count-trailing-zeros/-/count-trailing-zeros-1.0.1.tgz", 462 | "integrity": "sha1-q6bFgzvkENRbHso+bVg4RM5oLHc=", 463 | "dev": true 464 | }, 465 | "cross-spawn": { 466 | "version": "6.0.5", 467 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 468 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 469 | "dev": true, 470 | "requires": { 471 | "nice-try": "^1.0.4", 472 | "path-key": "^2.0.1", 473 | "semver": "^5.5.0", 474 | "shebang-command": "^1.2.0", 475 | "which": "^1.2.9" 476 | } 477 | }, 478 | "dat-encoding": { 479 | "version": "5.0.1", 480 | "resolved": "https://registry.npmjs.org/dat-encoding/-/dat-encoding-5.0.1.tgz", 481 | "integrity": "sha512-PET9PlGt6ejgqU07hbPLx3tP2siDMMFumUe+xwmm4+5W+0cOlpzreCPoMVUBzxWeR4sPdxL+AS53odQTBtzEqA==", 482 | "dev": true, 483 | "requires": { 484 | "safe-buffer": "^5.0.1" 485 | } 486 | }, 487 | "debug": { 488 | "version": "4.1.1", 489 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 490 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 491 | "requires": { 492 | "ms": "^2.1.1" 493 | } 494 | }, 495 | "debug-log": { 496 | "version": "1.0.1", 497 | "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", 498 | "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", 499 | "dev": true 500 | }, 501 | "deep-equal": { 502 | "version": "1.1.1", 503 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", 504 | "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", 505 | "dev": true, 506 | "requires": { 507 | "is-arguments": "^1.0.4", 508 | "is-date-object": "^1.0.1", 509 | "is-regex": "^1.0.4", 510 | "object-is": "^1.0.1", 511 | "object-keys": "^1.1.1", 512 | "regexp.prototype.flags": "^1.2.0" 513 | } 514 | }, 515 | "deep-is": { 516 | "version": "0.1.3", 517 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 518 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 519 | "dev": true 520 | }, 521 | "define-properties": { 522 | "version": "1.1.3", 523 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 524 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 525 | "dev": true, 526 | "requires": { 527 | "object-keys": "^1.0.12" 528 | } 529 | }, 530 | "defined": { 531 | "version": "1.0.0", 532 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 533 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 534 | "dev": true 535 | }, 536 | "deglob": { 537 | "version": "2.1.1", 538 | "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", 539 | "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", 540 | "dev": true, 541 | "requires": { 542 | "find-root": "^1.0.0", 543 | "glob": "^7.0.5", 544 | "ignore": "^3.0.9", 545 | "pkg-config": "^1.1.0", 546 | "run-parallel": "^1.1.2", 547 | "uniq": "^1.0.1" 548 | }, 549 | "dependencies": { 550 | "ignore": { 551 | "version": "3.3.10", 552 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", 553 | "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", 554 | "dev": true 555 | } 556 | } 557 | }, 558 | "derive-key": { 559 | "version": "1.0.1", 560 | "resolved": "https://registry.npmjs.org/derive-key/-/derive-key-1.0.1.tgz", 561 | "integrity": "sha512-7DHGLGvxFF8umw8NEGH3n9KKgEN8duk4Fiy4WmN3QgNKEogDhaNIsTDd5JVN7ilB8xw4ike1Q08z8UJSJ7hebA==", 562 | "dev": true, 563 | "requires": { 564 | "blake2b-universal": "^1.0.0" 565 | } 566 | }, 567 | "derived-key-storage": { 568 | "version": "2.1.0", 569 | "resolved": "https://registry.npmjs.org/derived-key-storage/-/derived-key-storage-2.1.0.tgz", 570 | "integrity": "sha512-4RKKrpf2YouCASaRHqUvyxtHABGLH7UJWNXPjsJxMvzCj4tettUvuyGsmP2/mpGYhSda7caZkS2oP4rqWjgkZg==", 571 | "dev": true, 572 | "requires": { 573 | "random-access-storage": "^1.4.0", 574 | "thunky": "^1.0.3", 575 | "varint": "^5.0.0" 576 | } 577 | }, 578 | "dht-rpc": { 579 | "version": "4.9.3", 580 | "resolved": "https://registry.npmjs.org/dht-rpc/-/dht-rpc-4.9.3.tgz", 581 | "integrity": "sha512-zViTBueUNjtBecH9mo6whmCyTZUz6+xqI+FapEY8UK/KacCOsIZPxOYXHu/4da0rfgJ00GfWsvZt17GfF2g27Q==", 582 | "requires": { 583 | "blake2b-universal": "^1.0.0", 584 | "codecs": "^2.0.0", 585 | "ipv4-peers": "^2.0.0", 586 | "k-bucket": "^5.0.0", 587 | "protocol-buffers-encodings": "^1.1.0", 588 | "sodium-native": "^3.1.1", 589 | "speedometer": "^1.1.0", 590 | "stream-collector": "^1.0.1", 591 | "time-ordered-set": "^1.0.1", 592 | "xor-distance": "^2.0.0" 593 | } 594 | }, 595 | "dns-packet": { 596 | "version": "4.2.0", 597 | "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-4.2.0.tgz", 598 | "integrity": "sha512-bn1AKpfkFbm0MIioOMHZ5qJzl2uypdBwI4nYNsqvhjsegBhcKJUlCrMPWLx6JEezRjxZmxhtIz/FkBEur2l8Cw==", 599 | "requires": { 600 | "ip": "^1.1.5", 601 | "safe-buffer": "^5.1.1" 602 | } 603 | }, 604 | "doctrine": { 605 | "version": "2.1.0", 606 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 607 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 608 | "dev": true, 609 | "requires": { 610 | "esutils": "^2.0.2" 611 | } 612 | }, 613 | "dotignore": { 614 | "version": "0.1.2", 615 | "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", 616 | "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", 617 | "dev": true, 618 | "requires": { 619 | "minimatch": "^3.0.4" 620 | } 621 | }, 622 | "end-of-stream": { 623 | "version": "1.4.4", 624 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 625 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 626 | "requires": { 627 | "once": "^1.4.0" 628 | } 629 | }, 630 | "error-ex": { 631 | "version": "1.3.2", 632 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 633 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 634 | "dev": true, 635 | "requires": { 636 | "is-arrayish": "^0.2.1" 637 | } 638 | }, 639 | "es-abstract": { 640 | "version": "1.17.6", 641 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", 642 | "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", 643 | "dev": true, 644 | "requires": { 645 | "es-to-primitive": "^1.2.1", 646 | "function-bind": "^1.1.1", 647 | "has": "^1.0.3", 648 | "has-symbols": "^1.0.1", 649 | "is-callable": "^1.2.0", 650 | "is-regex": "^1.1.0", 651 | "object-inspect": "^1.7.0", 652 | "object-keys": "^1.1.1", 653 | "object.assign": "^4.1.0", 654 | "string.prototype.trimend": "^1.0.1", 655 | "string.prototype.trimstart": "^1.0.1" 656 | } 657 | }, 658 | "es-to-primitive": { 659 | "version": "1.2.1", 660 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 661 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 662 | "dev": true, 663 | "requires": { 664 | "is-callable": "^1.1.4", 665 | "is-date-object": "^1.0.1", 666 | "is-symbol": "^1.0.2" 667 | } 668 | }, 669 | "escape-string-regexp": { 670 | "version": "1.0.5", 671 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 672 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 673 | "dev": true 674 | }, 675 | "eslint": { 676 | "version": "5.4.0", 677 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz", 678 | "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", 679 | "dev": true, 680 | "requires": { 681 | "ajv": "^6.5.0", 682 | "babel-code-frame": "^6.26.0", 683 | "chalk": "^2.1.0", 684 | "cross-spawn": "^6.0.5", 685 | "debug": "^3.1.0", 686 | "doctrine": "^2.1.0", 687 | "eslint-scope": "^4.0.0", 688 | "eslint-utils": "^1.3.1", 689 | "eslint-visitor-keys": "^1.0.0", 690 | "espree": "^4.0.0", 691 | "esquery": "^1.0.1", 692 | "esutils": "^2.0.2", 693 | "file-entry-cache": "^2.0.0", 694 | "functional-red-black-tree": "^1.0.1", 695 | "glob": "^7.1.2", 696 | "globals": "^11.7.0", 697 | "ignore": "^4.0.2", 698 | "imurmurhash": "^0.1.4", 699 | "inquirer": "^5.2.0", 700 | "is-resolvable": "^1.1.0", 701 | "js-yaml": "^3.11.0", 702 | "json-stable-stringify-without-jsonify": "^1.0.1", 703 | "levn": "^0.3.0", 704 | "lodash": "^4.17.5", 705 | "minimatch": "^3.0.4", 706 | "mkdirp": "^0.5.1", 707 | "natural-compare": "^1.4.0", 708 | "optionator": "^0.8.2", 709 | "path-is-inside": "^1.0.2", 710 | "pluralize": "^7.0.0", 711 | "progress": "^2.0.0", 712 | "regexpp": "^2.0.0", 713 | "require-uncached": "^1.0.3", 714 | "semver": "^5.5.0", 715 | "strip-ansi": "^4.0.0", 716 | "strip-json-comments": "^2.0.1", 717 | "table": "^4.0.3", 718 | "text-table": "^0.2.0" 719 | }, 720 | "dependencies": { 721 | "debug": { 722 | "version": "3.2.6", 723 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 724 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 725 | "dev": true, 726 | "requires": { 727 | "ms": "^2.1.1" 728 | } 729 | } 730 | } 731 | }, 732 | "eslint-config-standard": { 733 | "version": "12.0.0", 734 | "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", 735 | "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", 736 | "dev": true 737 | }, 738 | "eslint-config-standard-jsx": { 739 | "version": "6.0.2", 740 | "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz", 741 | "integrity": "sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg==", 742 | "dev": true 743 | }, 744 | "eslint-import-resolver-node": { 745 | "version": "0.3.4", 746 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", 747 | "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", 748 | "dev": true, 749 | "requires": { 750 | "debug": "^2.6.9", 751 | "resolve": "^1.13.1" 752 | }, 753 | "dependencies": { 754 | "debug": { 755 | "version": "2.6.9", 756 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 757 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 758 | "dev": true, 759 | "requires": { 760 | "ms": "2.0.0" 761 | } 762 | }, 763 | "ms": { 764 | "version": "2.0.0", 765 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 766 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 767 | "dev": true 768 | } 769 | } 770 | }, 771 | "eslint-module-utils": { 772 | "version": "2.6.0", 773 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", 774 | "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", 775 | "dev": true, 776 | "requires": { 777 | "debug": "^2.6.9", 778 | "pkg-dir": "^2.0.0" 779 | }, 780 | "dependencies": { 781 | "debug": { 782 | "version": "2.6.9", 783 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 784 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 785 | "dev": true, 786 | "requires": { 787 | "ms": "2.0.0" 788 | } 789 | }, 790 | "ms": { 791 | "version": "2.0.0", 792 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 793 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 794 | "dev": true 795 | } 796 | } 797 | }, 798 | "eslint-plugin-es": { 799 | "version": "1.4.1", 800 | "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz", 801 | "integrity": "sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==", 802 | "dev": true, 803 | "requires": { 804 | "eslint-utils": "^1.4.2", 805 | "regexpp": "^2.0.1" 806 | } 807 | }, 808 | "eslint-plugin-import": { 809 | "version": "2.14.0", 810 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", 811 | "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", 812 | "dev": true, 813 | "requires": { 814 | "contains-path": "^0.1.0", 815 | "debug": "^2.6.8", 816 | "doctrine": "1.5.0", 817 | "eslint-import-resolver-node": "^0.3.1", 818 | "eslint-module-utils": "^2.2.0", 819 | "has": "^1.0.1", 820 | "lodash": "^4.17.4", 821 | "minimatch": "^3.0.3", 822 | "read-pkg-up": "^2.0.0", 823 | "resolve": "^1.6.0" 824 | }, 825 | "dependencies": { 826 | "debug": { 827 | "version": "2.6.9", 828 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 829 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 830 | "dev": true, 831 | "requires": { 832 | "ms": "2.0.0" 833 | } 834 | }, 835 | "doctrine": { 836 | "version": "1.5.0", 837 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 838 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 839 | "dev": true, 840 | "requires": { 841 | "esutils": "^2.0.2", 842 | "isarray": "^1.0.0" 843 | } 844 | }, 845 | "ms": { 846 | "version": "2.0.0", 847 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 848 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 849 | "dev": true 850 | } 851 | } 852 | }, 853 | "eslint-plugin-node": { 854 | "version": "7.0.1", 855 | "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", 856 | "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", 857 | "dev": true, 858 | "requires": { 859 | "eslint-plugin-es": "^1.3.1", 860 | "eslint-utils": "^1.3.1", 861 | "ignore": "^4.0.2", 862 | "minimatch": "^3.0.4", 863 | "resolve": "^1.8.1", 864 | "semver": "^5.5.0" 865 | } 866 | }, 867 | "eslint-plugin-promise": { 868 | "version": "4.0.1", 869 | "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", 870 | "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", 871 | "dev": true 872 | }, 873 | "eslint-plugin-react": { 874 | "version": "7.11.1", 875 | "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", 876 | "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", 877 | "dev": true, 878 | "requires": { 879 | "array-includes": "^3.0.3", 880 | "doctrine": "^2.1.0", 881 | "has": "^1.0.3", 882 | "jsx-ast-utils": "^2.0.1", 883 | "prop-types": "^15.6.2" 884 | } 885 | }, 886 | "eslint-plugin-standard": { 887 | "version": "4.0.1", 888 | "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz", 889 | "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==", 890 | "dev": true 891 | }, 892 | "eslint-scope": { 893 | "version": "4.0.3", 894 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", 895 | "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", 896 | "dev": true, 897 | "requires": { 898 | "esrecurse": "^4.1.0", 899 | "estraverse": "^4.1.1" 900 | } 901 | }, 902 | "eslint-utils": { 903 | "version": "1.4.3", 904 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 905 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 906 | "dev": true, 907 | "requires": { 908 | "eslint-visitor-keys": "^1.1.0" 909 | } 910 | }, 911 | "eslint-visitor-keys": { 912 | "version": "1.3.0", 913 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 914 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 915 | "dev": true 916 | }, 917 | "espree": { 918 | "version": "4.1.0", 919 | "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", 920 | "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", 921 | "dev": true, 922 | "requires": { 923 | "acorn": "^6.0.2", 924 | "acorn-jsx": "^5.0.0", 925 | "eslint-visitor-keys": "^1.0.0" 926 | } 927 | }, 928 | "esprima": { 929 | "version": "4.0.1", 930 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 931 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 932 | "dev": true 933 | }, 934 | "esquery": { 935 | "version": "1.3.1", 936 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", 937 | "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", 938 | "dev": true, 939 | "requires": { 940 | "estraverse": "^5.1.0" 941 | }, 942 | "dependencies": { 943 | "estraverse": { 944 | "version": "5.1.0", 945 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", 946 | "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", 947 | "dev": true 948 | } 949 | } 950 | }, 951 | "esrecurse": { 952 | "version": "4.2.1", 953 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 954 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 955 | "dev": true, 956 | "requires": { 957 | "estraverse": "^4.1.0" 958 | } 959 | }, 960 | "estraverse": { 961 | "version": "4.3.0", 962 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 963 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 964 | "dev": true 965 | }, 966 | "esutils": { 967 | "version": "2.0.3", 968 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 969 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 970 | "dev": true 971 | }, 972 | "external-editor": { 973 | "version": "2.2.0", 974 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", 975 | "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", 976 | "dev": true, 977 | "requires": { 978 | "chardet": "^0.4.0", 979 | "iconv-lite": "^0.4.17", 980 | "tmp": "^0.0.33" 981 | } 982 | }, 983 | "fast-bitfield": { 984 | "version": "1.2.2", 985 | "resolved": "https://registry.npmjs.org/fast-bitfield/-/fast-bitfield-1.2.2.tgz", 986 | "integrity": "sha512-t8HYqkuE3YEqNcyWlAfh55479aTxO+GpYwvQvJppYqyBfSmRdNIhzY2m09FKN/MENTzq4wH6heHOIvsPyMAwvQ==", 987 | "dev": true, 988 | "requires": { 989 | "count-trailing-zeros": "^1.0.1" 990 | } 991 | }, 992 | "fast-deep-equal": { 993 | "version": "3.1.3", 994 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 995 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 996 | "dev": true 997 | }, 998 | "fast-fifo": { 999 | "version": "1.0.0", 1000 | "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.0.0.tgz", 1001 | "integrity": "sha512-4VEXmjxLj7sbs8J//cn2qhRap50dGzF5n8fjay8mau+Jn4hxSeR3xPFwxMaQq/pDaq7+KQk0PAbC2+nWDkJrmQ==" 1002 | }, 1003 | "fast-json-stable-stringify": { 1004 | "version": "2.1.0", 1005 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1006 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1007 | "dev": true 1008 | }, 1009 | "fast-levenshtein": { 1010 | "version": "2.0.6", 1011 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1012 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 1013 | "dev": true 1014 | }, 1015 | "fd-lock": { 1016 | "version": "1.1.1", 1017 | "resolved": "https://registry.npmjs.org/fd-lock/-/fd-lock-1.1.1.tgz", 1018 | "integrity": "sha512-Ng+IXbq6LPMDvvVb0Vr325NjqhPwqlLIvmf43ii7t3WQvo2sHU6V6jQY1cclflxPaPfvNUAuD5VdPuIO1sp50g==", 1019 | "dev": true, 1020 | "requires": { 1021 | "napi-macros": "^2.0.0", 1022 | "node-gyp-build": "^4.2.2" 1023 | } 1024 | }, 1025 | "figures": { 1026 | "version": "2.0.0", 1027 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 1028 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 1029 | "dev": true, 1030 | "requires": { 1031 | "escape-string-regexp": "^1.0.5" 1032 | } 1033 | }, 1034 | "file-entry-cache": { 1035 | "version": "2.0.0", 1036 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 1037 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 1038 | "dev": true, 1039 | "requires": { 1040 | "flat-cache": "^1.2.1", 1041 | "object-assign": "^4.0.1" 1042 | } 1043 | }, 1044 | "find-root": { 1045 | "version": "1.1.0", 1046 | "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", 1047 | "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", 1048 | "dev": true 1049 | }, 1050 | "find-up": { 1051 | "version": "2.1.0", 1052 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 1053 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 1054 | "dev": true, 1055 | "requires": { 1056 | "locate-path": "^2.0.0" 1057 | } 1058 | }, 1059 | "flat-cache": { 1060 | "version": "1.3.4", 1061 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", 1062 | "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", 1063 | "dev": true, 1064 | "requires": { 1065 | "circular-json": "^0.3.1", 1066 | "graceful-fs": "^4.1.2", 1067 | "rimraf": "~2.6.2", 1068 | "write": "^0.2.1" 1069 | } 1070 | }, 1071 | "flat-tree": { 1072 | "version": "1.6.0", 1073 | "resolved": "https://registry.npmjs.org/flat-tree/-/flat-tree-1.6.0.tgz", 1074 | "integrity": "sha1-/KMM3bkAb7ZW6168ea6ydOf96e0=", 1075 | "dev": true 1076 | }, 1077 | "for-each": { 1078 | "version": "0.3.3", 1079 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 1080 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 1081 | "dev": true, 1082 | "requires": { 1083 | "is-callable": "^1.1.3" 1084 | } 1085 | }, 1086 | "from2": { 1087 | "version": "2.3.0", 1088 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 1089 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", 1090 | "dev": true, 1091 | "requires": { 1092 | "inherits": "^2.0.1", 1093 | "readable-stream": "^2.0.0" 1094 | }, 1095 | "dependencies": { 1096 | "readable-stream": { 1097 | "version": "2.3.7", 1098 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1099 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1100 | "dev": true, 1101 | "requires": { 1102 | "core-util-is": "~1.0.0", 1103 | "inherits": "~2.0.3", 1104 | "isarray": "~1.0.0", 1105 | "process-nextick-args": "~2.0.0", 1106 | "safe-buffer": "~5.1.1", 1107 | "string_decoder": "~1.1.1", 1108 | "util-deprecate": "~1.0.1" 1109 | } 1110 | }, 1111 | "safe-buffer": { 1112 | "version": "5.1.2", 1113 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1114 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1115 | "dev": true 1116 | }, 1117 | "string_decoder": { 1118 | "version": "1.1.1", 1119 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1120 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1121 | "dev": true, 1122 | "requires": { 1123 | "safe-buffer": "~5.1.0" 1124 | } 1125 | } 1126 | } 1127 | }, 1128 | "fs.realpath": { 1129 | "version": "1.0.0", 1130 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1131 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1132 | "dev": true 1133 | }, 1134 | "function-bind": { 1135 | "version": "1.1.1", 1136 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1137 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1138 | "dev": true 1139 | }, 1140 | "functional-red-black-tree": { 1141 | "version": "1.0.1", 1142 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1143 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 1144 | "dev": true 1145 | }, 1146 | "get-stdin": { 1147 | "version": "6.0.0", 1148 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", 1149 | "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", 1150 | "dev": true 1151 | }, 1152 | "glob": { 1153 | "version": "7.1.6", 1154 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 1155 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 1156 | "dev": true, 1157 | "requires": { 1158 | "fs.realpath": "^1.0.0", 1159 | "inflight": "^1.0.4", 1160 | "inherits": "2", 1161 | "minimatch": "^3.0.4", 1162 | "once": "^1.3.0", 1163 | "path-is-absolute": "^1.0.0" 1164 | } 1165 | }, 1166 | "globals": { 1167 | "version": "11.12.0", 1168 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1169 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1170 | "dev": true 1171 | }, 1172 | "graceful-fs": { 1173 | "version": "4.2.4", 1174 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 1175 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", 1176 | "dev": true 1177 | }, 1178 | "guard-timeout": { 1179 | "version": "2.0.0", 1180 | "resolved": "https://registry.npmjs.org/guard-timeout/-/guard-timeout-2.0.0.tgz", 1181 | "integrity": "sha512-35geHv72oal0cRUE5t1tZ5KHm3OVPXzFtiMG8AnRPV5FkkEf84RUpeQ0BCeCZunfSLGATW5ZVyALhJKgM7I/6A==" 1182 | }, 1183 | "has": { 1184 | "version": "1.0.3", 1185 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1186 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1187 | "dev": true, 1188 | "requires": { 1189 | "function-bind": "^1.1.1" 1190 | } 1191 | }, 1192 | "has-ansi": { 1193 | "version": "2.0.0", 1194 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1195 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1196 | "dev": true, 1197 | "requires": { 1198 | "ansi-regex": "^2.0.0" 1199 | } 1200 | }, 1201 | "has-flag": { 1202 | "version": "3.0.0", 1203 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1204 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1205 | "dev": true 1206 | }, 1207 | "has-symbols": { 1208 | "version": "1.0.1", 1209 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 1210 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 1211 | "dev": true 1212 | }, 1213 | "hashlru": { 1214 | "version": "2.3.0", 1215 | "resolved": "https://registry.npmjs.org/hashlru/-/hashlru-2.3.0.tgz", 1216 | "integrity": "sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==" 1217 | }, 1218 | "hmac-blake2b": { 1219 | "version": "1.0.0", 1220 | "resolved": "https://registry.npmjs.org/hmac-blake2b/-/hmac-blake2b-1.0.0.tgz", 1221 | "integrity": "sha512-sOdcBvyOQPHYjTOVmE4y1C8SlZDRJmKkAgWMFjoX6URTk7mbP35+QLzE4ZwfcScnP3r3NB3yV0vqJaofrWCMMQ==", 1222 | "requires": { 1223 | "nanoassert": "^1.1.0", 1224 | "sodium-native": "^3.1.1" 1225 | }, 1226 | "dependencies": { 1227 | "nanoassert": { 1228 | "version": "1.1.0", 1229 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-1.1.0.tgz", 1230 | "integrity": "sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40=" 1231 | } 1232 | } 1233 | }, 1234 | "hosted-git-info": { 1235 | "version": "2.8.8", 1236 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", 1237 | "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", 1238 | "dev": true 1239 | }, 1240 | "hypercore": { 1241 | "version": "9.5.0", 1242 | "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-9.5.0.tgz", 1243 | "integrity": "sha512-0jm/sp7Mk8zPTRAKTzMWBk7MSBcVhykxheN2wTGUQjFx1HFR372RYawMoN+tqEQfqq9rmtA2uNHFzFq6AEWgvA==", 1244 | "dev": true, 1245 | "requires": { 1246 | "abstract-extension": "^3.0.1", 1247 | "atomic-batcher": "^1.0.2", 1248 | "bitfield-rle": "^2.2.1", 1249 | "bulk-write-stream": "^1.1.3", 1250 | "codecs": "^2.0.0", 1251 | "fast-bitfield": "^1.2.2", 1252 | "fd-lock": "^1.0.2", 1253 | "flat-tree": "^1.6.0", 1254 | "from2": "^2.3.0", 1255 | "hypercore-cache": "^1.0.1", 1256 | "hypercore-crypto": "^2.0.0", 1257 | "hypercore-protocol": "^8.0.1", 1258 | "inherits": "^2.0.3", 1259 | "inspect-custom-symbol": "^1.1.0", 1260 | "last-one-wins": "^1.0.4", 1261 | "memory-pager": "^1.0.2", 1262 | "merkle-tree-stream": "^3.0.3", 1263 | "nanoguard": "^1.2.0", 1264 | "nanoresource": "^1.3.0", 1265 | "pretty-hash": "^1.0.1", 1266 | "random-access-file": "^2.1.0", 1267 | "sparse-bitfield": "^3.0.0", 1268 | "timeout-refresh": "^1.0.1", 1269 | "uint64be": "^2.0.1", 1270 | "unordered-array-remove": "^1.0.2", 1271 | "unordered-set": "^2.0.0" 1272 | }, 1273 | "dependencies": { 1274 | "uint64be": { 1275 | "version": "2.0.2", 1276 | "resolved": "https://registry.npmjs.org/uint64be/-/uint64be-2.0.2.tgz", 1277 | "integrity": "sha512-9QqdvpGQTXgxthP+lY4e/gIBy+RuqcBaC6JVwT5I3bDLgT/btL6twZMR0pI3/Fgah9G/pdwzIprE5gL6v9UvyQ==", 1278 | "dev": true, 1279 | "requires": { 1280 | "buffer-alloc": "^1.1.0" 1281 | } 1282 | } 1283 | } 1284 | }, 1285 | "hypercore-cache": { 1286 | "version": "1.0.2", 1287 | "resolved": "https://registry.npmjs.org/hypercore-cache/-/hypercore-cache-1.0.2.tgz", 1288 | "integrity": "sha512-AJ/q7y6EOrXnOH/4+DVcfDygsh1ZXMRGvNc67GBNqwCt22oSCOWhRI6EJ+3HEJciM9M2oSm1WX3qg6kgRhT/Gw==", 1289 | "dev": true 1290 | }, 1291 | "hypercore-crypto": { 1292 | "version": "2.1.1", 1293 | "resolved": "https://registry.npmjs.org/hypercore-crypto/-/hypercore-crypto-2.1.1.tgz", 1294 | "integrity": "sha512-KIA25GiFJXieB7Oa0HSDNtXrPH41VJY5j2xWmIjBqREt3quKOFxL7ceOLz7zBMoWkoYeF2m67RhtDE1C4XfoNA==", 1295 | "requires": { 1296 | "sodium-universal": "^3.0.0", 1297 | "uint64be": "^3.0.0" 1298 | } 1299 | }, 1300 | "hypercore-protocol": { 1301 | "version": "8.0.1", 1302 | "resolved": "https://registry.npmjs.org/hypercore-protocol/-/hypercore-protocol-8.0.1.tgz", 1303 | "integrity": "sha512-/pWKbp09AvQBD5Nj9FUOMql6WNFB7dBhMeKhzYtTfCvEIEGD5SB6B5/qPpCHiFtiMa7cWqKnuTkNk6MSVFqwDg==", 1304 | "requires": { 1305 | "abstract-extension": "^3.0.1", 1306 | "debug": "^4.1.1", 1307 | "hypercore-crypto": "^2.0.0", 1308 | "inspect-custom-symbol": "^1.1.0", 1309 | "nanoguard": "^1.2.1", 1310 | "pretty-hash": "^1.0.1", 1311 | "simple-hypercore-protocol": "^2.0.0", 1312 | "streamx": "^2.1.0", 1313 | "timeout-refresh": "^1.0.0" 1314 | } 1315 | }, 1316 | "hyperswarm": { 1317 | "version": "2.15.0", 1318 | "resolved": "https://registry.npmjs.org/hyperswarm/-/hyperswarm-2.15.0.tgz", 1319 | "integrity": "sha512-Dg2/LMCsV5h6GDEqgZ8Ck2ez8jOpZkCXtphM8ZCBSHznjnFdbGvvwmNeHkKaLqefzEvHealDQRNprqyNtbIgFQ==", 1320 | "requires": { 1321 | "@hyperswarm/network": "^2.0.0", 1322 | "shuffled-priority-queue": "^2.1.0", 1323 | "utp-native": "^2.1.7" 1324 | } 1325 | }, 1326 | "iconv-lite": { 1327 | "version": "0.4.24", 1328 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1329 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1330 | "dev": true, 1331 | "requires": { 1332 | "safer-buffer": ">= 2.1.2 < 3" 1333 | } 1334 | }, 1335 | "ignore": { 1336 | "version": "4.0.6", 1337 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 1338 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 1339 | "dev": true 1340 | }, 1341 | "imurmurhash": { 1342 | "version": "0.1.4", 1343 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1344 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1345 | "dev": true 1346 | }, 1347 | "inflight": { 1348 | "version": "1.0.6", 1349 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1350 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1351 | "dev": true, 1352 | "requires": { 1353 | "once": "^1.3.0", 1354 | "wrappy": "1" 1355 | } 1356 | }, 1357 | "inherits": { 1358 | "version": "2.0.4", 1359 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1360 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1361 | }, 1362 | "ini": { 1363 | "version": "1.3.5", 1364 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 1365 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 1366 | }, 1367 | "inquirer": { 1368 | "version": "5.2.0", 1369 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", 1370 | "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", 1371 | "dev": true, 1372 | "requires": { 1373 | "ansi-escapes": "^3.0.0", 1374 | "chalk": "^2.0.0", 1375 | "cli-cursor": "^2.1.0", 1376 | "cli-width": "^2.0.0", 1377 | "external-editor": "^2.1.0", 1378 | "figures": "^2.0.0", 1379 | "lodash": "^4.3.0", 1380 | "mute-stream": "0.0.7", 1381 | "run-async": "^2.2.0", 1382 | "rxjs": "^5.5.2", 1383 | "string-width": "^2.1.0", 1384 | "strip-ansi": "^4.0.0", 1385 | "through": "^2.3.6" 1386 | } 1387 | }, 1388 | "inspect-custom-symbol": { 1389 | "version": "1.1.1", 1390 | "resolved": "https://registry.npmjs.org/inspect-custom-symbol/-/inspect-custom-symbol-1.1.1.tgz", 1391 | "integrity": "sha512-GOucsp9EcdlLdhPUyOTvQDnbFJtp2WBWZV1Jqe+mVnkJQBL3w96+fB84C+JL+EKXOspMdB0eMDQPDp5w9fkfZA==" 1392 | }, 1393 | "ip": { 1394 | "version": "1.1.5", 1395 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", 1396 | "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" 1397 | }, 1398 | "ipv4-peers": { 1399 | "version": "2.0.0", 1400 | "resolved": "https://registry.npmjs.org/ipv4-peers/-/ipv4-peers-2.0.0.tgz", 1401 | "integrity": "sha512-6ZMWB3JnCWT0gISUkzChcUEkJS6+LpGRU3h10f9Mfc0usVmyIcbcTN9+QPMg29gLOY8WtaKFbM5ME8qNySoh8g==" 1402 | }, 1403 | "is-arguments": { 1404 | "version": "1.0.4", 1405 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", 1406 | "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", 1407 | "dev": true 1408 | }, 1409 | "is-arrayish": { 1410 | "version": "0.2.1", 1411 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1412 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1413 | "dev": true 1414 | }, 1415 | "is-callable": { 1416 | "version": "1.2.0", 1417 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", 1418 | "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", 1419 | "dev": true 1420 | }, 1421 | "is-date-object": { 1422 | "version": "1.0.2", 1423 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 1424 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 1425 | "dev": true 1426 | }, 1427 | "is-fullwidth-code-point": { 1428 | "version": "2.0.0", 1429 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1430 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1431 | "dev": true 1432 | }, 1433 | "is-options": { 1434 | "version": "1.0.1", 1435 | "resolved": "https://registry.npmjs.org/is-options/-/is-options-1.0.1.tgz", 1436 | "integrity": "sha512-2Xj8sA0zDrAcaoWfBiNmc6VPWAgKDpim0T3J9Djq7vbm1UjwbUWzeuLu/FwC46g3cBbAn0E5R0xwVtOobM6Xxg==", 1437 | "dev": true 1438 | }, 1439 | "is-regex": { 1440 | "version": "1.1.0", 1441 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", 1442 | "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", 1443 | "dev": true, 1444 | "requires": { 1445 | "has-symbols": "^1.0.1" 1446 | } 1447 | }, 1448 | "is-resolvable": { 1449 | "version": "1.1.0", 1450 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", 1451 | "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", 1452 | "dev": true 1453 | }, 1454 | "is-string": { 1455 | "version": "1.0.5", 1456 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", 1457 | "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", 1458 | "dev": true 1459 | }, 1460 | "is-symbol": { 1461 | "version": "1.0.3", 1462 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 1463 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 1464 | "dev": true, 1465 | "requires": { 1466 | "has-symbols": "^1.0.1" 1467 | } 1468 | }, 1469 | "isarray": { 1470 | "version": "1.0.0", 1471 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1472 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1473 | "dev": true 1474 | }, 1475 | "isexe": { 1476 | "version": "2.0.0", 1477 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1478 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1479 | "dev": true 1480 | }, 1481 | "js-tokens": { 1482 | "version": "3.0.2", 1483 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1484 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 1485 | "dev": true 1486 | }, 1487 | "js-yaml": { 1488 | "version": "3.14.0", 1489 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", 1490 | "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", 1491 | "dev": true, 1492 | "requires": { 1493 | "argparse": "^1.0.7", 1494 | "esprima": "^4.0.0" 1495 | } 1496 | }, 1497 | "json-parse-better-errors": { 1498 | "version": "1.0.2", 1499 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 1500 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 1501 | "dev": true 1502 | }, 1503 | "json-schema-traverse": { 1504 | "version": "0.4.1", 1505 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1506 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1507 | "dev": true 1508 | }, 1509 | "json-stable-stringify-without-jsonify": { 1510 | "version": "1.0.1", 1511 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1512 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1513 | "dev": true 1514 | }, 1515 | "jsx-ast-utils": { 1516 | "version": "2.4.1", 1517 | "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", 1518 | "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", 1519 | "dev": true, 1520 | "requires": { 1521 | "array-includes": "^3.1.1", 1522 | "object.assign": "^4.1.0" 1523 | } 1524 | }, 1525 | "k-bucket": { 1526 | "version": "5.0.0", 1527 | "resolved": "https://registry.npmjs.org/k-bucket/-/k-bucket-5.0.0.tgz", 1528 | "integrity": "sha512-r/q+wV/Kde62/tk+rqyttEJn6h0jR7x+incdMVSYTqK73zVxVrzJa70kJL49cIKen8XjIgUZKSvk8ktnrQbK4w==", 1529 | "requires": { 1530 | "randombytes": "^2.0.3" 1531 | } 1532 | }, 1533 | "last-one-wins": { 1534 | "version": "1.0.4", 1535 | "resolved": "https://registry.npmjs.org/last-one-wins/-/last-one-wins-1.0.4.tgz", 1536 | "integrity": "sha1-wb/Qy8tGeQ7JFWuNGu6Py4bNoio=", 1537 | "dev": true 1538 | }, 1539 | "levn": { 1540 | "version": "0.3.0", 1541 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1542 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1543 | "dev": true, 1544 | "requires": { 1545 | "prelude-ls": "~1.1.2", 1546 | "type-check": "~0.3.2" 1547 | } 1548 | }, 1549 | "load-json-file": { 1550 | "version": "2.0.0", 1551 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", 1552 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", 1553 | "dev": true, 1554 | "requires": { 1555 | "graceful-fs": "^4.1.2", 1556 | "parse-json": "^2.2.0", 1557 | "pify": "^2.0.0", 1558 | "strip-bom": "^3.0.0" 1559 | } 1560 | }, 1561 | "locate-path": { 1562 | "version": "2.0.0", 1563 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 1564 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 1565 | "dev": true, 1566 | "requires": { 1567 | "p-locate": "^2.0.0", 1568 | "path-exists": "^3.0.0" 1569 | } 1570 | }, 1571 | "lodash": { 1572 | "version": "4.17.19", 1573 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", 1574 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", 1575 | "dev": true 1576 | }, 1577 | "loose-envify": { 1578 | "version": "1.4.0", 1579 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1580 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1581 | "dev": true, 1582 | "requires": { 1583 | "js-tokens": "^3.0.0 || ^4.0.0" 1584 | } 1585 | }, 1586 | "memory-pager": { 1587 | "version": "1.5.0", 1588 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 1589 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", 1590 | "dev": true 1591 | }, 1592 | "merkle-tree-stream": { 1593 | "version": "3.0.3", 1594 | "resolved": "https://registry.npmjs.org/merkle-tree-stream/-/merkle-tree-stream-3.0.3.tgz", 1595 | "integrity": "sha1-+KBkdg0355eK1fn208EZpJT1cIE=", 1596 | "dev": true, 1597 | "requires": { 1598 | "flat-tree": "^1.3.0", 1599 | "readable-stream": "^2.0.5" 1600 | }, 1601 | "dependencies": { 1602 | "readable-stream": { 1603 | "version": "2.3.7", 1604 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1605 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1606 | "dev": true, 1607 | "requires": { 1608 | "core-util-is": "~1.0.0", 1609 | "inherits": "~2.0.3", 1610 | "isarray": "~1.0.0", 1611 | "process-nextick-args": "~2.0.0", 1612 | "safe-buffer": "~5.1.1", 1613 | "string_decoder": "~1.1.1", 1614 | "util-deprecate": "~1.0.1" 1615 | } 1616 | }, 1617 | "safe-buffer": { 1618 | "version": "5.1.2", 1619 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1620 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1621 | "dev": true 1622 | }, 1623 | "string_decoder": { 1624 | "version": "1.1.1", 1625 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1626 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1627 | "dev": true, 1628 | "requires": { 1629 | "safe-buffer": "~5.1.0" 1630 | } 1631 | } 1632 | } 1633 | }, 1634 | "mimic-fn": { 1635 | "version": "1.2.0", 1636 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 1637 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 1638 | "dev": true 1639 | }, 1640 | "minimatch": { 1641 | "version": "3.0.4", 1642 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1643 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1644 | "dev": true, 1645 | "requires": { 1646 | "brace-expansion": "^1.1.7" 1647 | } 1648 | }, 1649 | "minimist": { 1650 | "version": "1.2.5", 1651 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1652 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1653 | "dev": true 1654 | }, 1655 | "mkdirp": { 1656 | "version": "0.5.5", 1657 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 1658 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 1659 | "dev": true, 1660 | "requires": { 1661 | "minimist": "^1.2.5" 1662 | } 1663 | }, 1664 | "mkdirp-classic": { 1665 | "version": "0.5.3", 1666 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 1667 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", 1668 | "dev": true 1669 | }, 1670 | "ms": { 1671 | "version": "2.1.2", 1672 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1673 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1674 | }, 1675 | "multicast-dns": { 1676 | "version": "7.2.2", 1677 | "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.2.tgz", 1678 | "integrity": "sha512-XqSMeO8EWV/nOXOpPV8ztIpNweVfE1dSpz6SQvDPp71HD74lMXjt4m/mWB1YBMG0kHtOodxRWc5WOb/UNN1A5g==", 1679 | "requires": { 1680 | "dns-packet": "^4.0.0", 1681 | "thunky": "^1.0.2" 1682 | } 1683 | }, 1684 | "mute-stream": { 1685 | "version": "0.0.7", 1686 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1687 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 1688 | "dev": true 1689 | }, 1690 | "nanoassert": { 1691 | "version": "2.0.0", 1692 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", 1693 | "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" 1694 | }, 1695 | "nanoguard": { 1696 | "version": "1.3.0", 1697 | "resolved": "https://registry.npmjs.org/nanoguard/-/nanoguard-1.3.0.tgz", 1698 | "integrity": "sha512-K/ON5wyflyPyZskdeT3m7Y2gJVkm3QLdKykMCquAbK8A2erstyMpZUc3NG8Nz5jKdfatiYndONrlmLF8+pGl+A==" 1699 | }, 1700 | "nanoresource": { 1701 | "version": "1.3.0", 1702 | "resolved": "https://registry.npmjs.org/nanoresource/-/nanoresource-1.3.0.tgz", 1703 | "integrity": "sha512-OI5dswqipmlYfyL3k/YMm7mbERlh4Bd1KuKdMHpeoVD1iVxqxaTMKleB4qaA2mbQZ6/zMNSxCXv9M9P/YbqTuQ==", 1704 | "requires": { 1705 | "inherits": "^2.0.4" 1706 | } 1707 | }, 1708 | "nanoresource-promise": { 1709 | "version": "1.2.2", 1710 | "resolved": "https://registry.npmjs.org/nanoresource-promise/-/nanoresource-promise-1.2.2.tgz", 1711 | "integrity": "sha512-XCRcRrCoTifA6XJqYaMqlHgWFrAq6aGNnXboRa/Dxa0TNkm3S13+RWCD7/XaB4ySunAmZzx81++OS4kqkDynuA==", 1712 | "requires": { 1713 | "nanoresource": "^1.3.0" 1714 | } 1715 | }, 1716 | "napi-macros": { 1717 | "version": "2.0.0", 1718 | "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", 1719 | "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==" 1720 | }, 1721 | "natural-compare": { 1722 | "version": "1.4.0", 1723 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1724 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1725 | "dev": true 1726 | }, 1727 | "nice-try": { 1728 | "version": "1.0.5", 1729 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1730 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1731 | "dev": true 1732 | }, 1733 | "node-gyp-build": { 1734 | "version": "4.2.3", 1735 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", 1736 | "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==" 1737 | }, 1738 | "noise-protocol": { 1739 | "version": "2.0.0", 1740 | "resolved": "https://registry.npmjs.org/noise-protocol/-/noise-protocol-2.0.0.tgz", 1741 | "integrity": "sha512-12WcN79T+5At0ja5gJIKHnfJ8wTZj5zY5c5P2pcG0ci34tGqLCCAv31eHcwMS9UfS9Z6MpDCLSBUU4tMdFTudQ==", 1742 | "requires": { 1743 | "clone": "^2.1.2", 1744 | "hmac-blake2b": "^1.0.0", 1745 | "nanoassert": "^2.0.0", 1746 | "sodium-native": "^3.1.1" 1747 | } 1748 | }, 1749 | "normalize-package-data": { 1750 | "version": "2.5.0", 1751 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 1752 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 1753 | "dev": true, 1754 | "requires": { 1755 | "hosted-git-info": "^2.1.4", 1756 | "resolve": "^1.10.0", 1757 | "semver": "2 || 3 || 4 || 5", 1758 | "validate-npm-package-license": "^3.0.1" 1759 | } 1760 | }, 1761 | "object-assign": { 1762 | "version": "4.1.1", 1763 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1764 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1765 | "dev": true 1766 | }, 1767 | "object-inspect": { 1768 | "version": "1.8.0", 1769 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", 1770 | "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", 1771 | "dev": true 1772 | }, 1773 | "object-is": { 1774 | "version": "1.1.2", 1775 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", 1776 | "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", 1777 | "dev": true, 1778 | "requires": { 1779 | "define-properties": "^1.1.3", 1780 | "es-abstract": "^1.17.5" 1781 | } 1782 | }, 1783 | "object-keys": { 1784 | "version": "1.1.1", 1785 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1786 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1787 | "dev": true 1788 | }, 1789 | "object.assign": { 1790 | "version": "4.1.0", 1791 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 1792 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 1793 | "dev": true, 1794 | "requires": { 1795 | "define-properties": "^1.1.2", 1796 | "function-bind": "^1.1.1", 1797 | "has-symbols": "^1.0.0", 1798 | "object-keys": "^1.0.11" 1799 | } 1800 | }, 1801 | "once": { 1802 | "version": "1.4.0", 1803 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1804 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1805 | "requires": { 1806 | "wrappy": "1" 1807 | } 1808 | }, 1809 | "onetime": { 1810 | "version": "2.0.1", 1811 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1812 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1813 | "dev": true, 1814 | "requires": { 1815 | "mimic-fn": "^1.0.0" 1816 | } 1817 | }, 1818 | "optionator": { 1819 | "version": "0.8.3", 1820 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 1821 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 1822 | "dev": true, 1823 | "requires": { 1824 | "deep-is": "~0.1.3", 1825 | "fast-levenshtein": "~2.0.6", 1826 | "levn": "~0.3.0", 1827 | "prelude-ls": "~1.1.2", 1828 | "type-check": "~0.3.2", 1829 | "word-wrap": "~1.2.3" 1830 | } 1831 | }, 1832 | "os-tmpdir": { 1833 | "version": "1.0.2", 1834 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1835 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1836 | "dev": true 1837 | }, 1838 | "p-limit": { 1839 | "version": "1.3.0", 1840 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 1841 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 1842 | "dev": true, 1843 | "requires": { 1844 | "p-try": "^1.0.0" 1845 | } 1846 | }, 1847 | "p-locate": { 1848 | "version": "2.0.0", 1849 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1850 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1851 | "dev": true, 1852 | "requires": { 1853 | "p-limit": "^1.1.0" 1854 | } 1855 | }, 1856 | "p-try": { 1857 | "version": "1.0.0", 1858 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 1859 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", 1860 | "dev": true 1861 | }, 1862 | "parse-json": { 1863 | "version": "2.2.0", 1864 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1865 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1866 | "dev": true, 1867 | "requires": { 1868 | "error-ex": "^1.2.0" 1869 | } 1870 | }, 1871 | "path-exists": { 1872 | "version": "3.0.0", 1873 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1874 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1875 | "dev": true 1876 | }, 1877 | "path-is-absolute": { 1878 | "version": "1.0.1", 1879 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1880 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1881 | "dev": true 1882 | }, 1883 | "path-is-inside": { 1884 | "version": "1.0.2", 1885 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1886 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1887 | "dev": true 1888 | }, 1889 | "path-key": { 1890 | "version": "2.0.1", 1891 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1892 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1893 | "dev": true 1894 | }, 1895 | "path-parse": { 1896 | "version": "1.0.6", 1897 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1898 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 1899 | }, 1900 | "path-type": { 1901 | "version": "2.0.0", 1902 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", 1903 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", 1904 | "dev": true, 1905 | "requires": { 1906 | "pify": "^2.0.0" 1907 | } 1908 | }, 1909 | "pify": { 1910 | "version": "2.3.0", 1911 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1912 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1913 | "dev": true 1914 | }, 1915 | "pkg-conf": { 1916 | "version": "2.1.0", 1917 | "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", 1918 | "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", 1919 | "dev": true, 1920 | "requires": { 1921 | "find-up": "^2.0.0", 1922 | "load-json-file": "^4.0.0" 1923 | }, 1924 | "dependencies": { 1925 | "load-json-file": { 1926 | "version": "4.0.0", 1927 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", 1928 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", 1929 | "dev": true, 1930 | "requires": { 1931 | "graceful-fs": "^4.1.2", 1932 | "parse-json": "^4.0.0", 1933 | "pify": "^3.0.0", 1934 | "strip-bom": "^3.0.0" 1935 | } 1936 | }, 1937 | "parse-json": { 1938 | "version": "4.0.0", 1939 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 1940 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 1941 | "dev": true, 1942 | "requires": { 1943 | "error-ex": "^1.3.1", 1944 | "json-parse-better-errors": "^1.0.1" 1945 | } 1946 | }, 1947 | "pify": { 1948 | "version": "3.0.0", 1949 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1950 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 1951 | "dev": true 1952 | } 1953 | } 1954 | }, 1955 | "pkg-config": { 1956 | "version": "1.1.1", 1957 | "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", 1958 | "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", 1959 | "dev": true, 1960 | "requires": { 1961 | "debug-log": "^1.0.0", 1962 | "find-root": "^1.0.0", 1963 | "xtend": "^4.0.1" 1964 | } 1965 | }, 1966 | "pkg-dir": { 1967 | "version": "2.0.0", 1968 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", 1969 | "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", 1970 | "dev": true, 1971 | "requires": { 1972 | "find-up": "^2.1.0" 1973 | } 1974 | }, 1975 | "pluralize": { 1976 | "version": "7.0.0", 1977 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", 1978 | "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", 1979 | "dev": true 1980 | }, 1981 | "prelude-ls": { 1982 | "version": "1.1.2", 1983 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1984 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1985 | "dev": true 1986 | }, 1987 | "pretty-hash": { 1988 | "version": "1.0.1", 1989 | "resolved": "https://registry.npmjs.org/pretty-hash/-/pretty-hash-1.0.1.tgz", 1990 | "integrity": "sha1-FuBXkYje9WvbVliSvNBaXWUySAc=" 1991 | }, 1992 | "process-nextick-args": { 1993 | "version": "2.0.1", 1994 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1995 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 1996 | "dev": true 1997 | }, 1998 | "progress": { 1999 | "version": "2.0.3", 2000 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 2001 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 2002 | "dev": true 2003 | }, 2004 | "prop-types": { 2005 | "version": "15.7.2", 2006 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", 2007 | "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", 2008 | "dev": true, 2009 | "requires": { 2010 | "loose-envify": "^1.4.0", 2011 | "object-assign": "^4.1.1", 2012 | "react-is": "^16.8.1" 2013 | } 2014 | }, 2015 | "protocol-buffers-encodings": { 2016 | "version": "1.1.0", 2017 | "resolved": "https://registry.npmjs.org/protocol-buffers-encodings/-/protocol-buffers-encodings-1.1.0.tgz", 2018 | "integrity": "sha512-SmjEuAf3hc3h3rWZ6V1YaaQw2MNJWK848gLJgzx/sefOJdNLujKinJVXIS0q2cBQpQn2Q32TinawZyDZPzm4kQ==", 2019 | "requires": { 2020 | "signed-varint": "^2.0.1", 2021 | "varint": "^5.0.0" 2022 | } 2023 | }, 2024 | "pump": { 2025 | "version": "3.0.0", 2026 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 2027 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 2028 | "requires": { 2029 | "end-of-stream": "^1.1.0", 2030 | "once": "^1.3.1" 2031 | } 2032 | }, 2033 | "punycode": { 2034 | "version": "2.1.1", 2035 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2036 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 2037 | "dev": true 2038 | }, 2039 | "random-access-file": { 2040 | "version": "2.1.4", 2041 | "resolved": "https://registry.npmjs.org/random-access-file/-/random-access-file-2.1.4.tgz", 2042 | "integrity": "sha512-WAcBP5iLhg1pbjZA40WyMenjK7c5gJUY6Pi5HJ3fLJCeVFNSZv3juf20yFMKxBdvcX5GKbX/HZSfFzlLBdGTdQ==", 2043 | "dev": true, 2044 | "requires": { 2045 | "mkdirp-classic": "^0.5.2", 2046 | "random-access-storage": "^1.1.1" 2047 | } 2048 | }, 2049 | "random-access-memory": { 2050 | "version": "3.1.1", 2051 | "resolved": "https://registry.npmjs.org/random-access-memory/-/random-access-memory-3.1.1.tgz", 2052 | "integrity": "sha512-Qy1MliJDozZ1A6Hx3UbEnm8PPCfkiG/8CArbnhrxXMx1YRJPWipgPTB9qyhn4Z7WlLvCEqPb6Bd98OayyVuwrA==", 2053 | "dev": true, 2054 | "requires": { 2055 | "inherits": "^2.0.3", 2056 | "is-options": "^1.0.1", 2057 | "random-access-storage": "^1.1.1" 2058 | } 2059 | }, 2060 | "random-access-storage": { 2061 | "version": "1.4.1", 2062 | "resolved": "https://registry.npmjs.org/random-access-storage/-/random-access-storage-1.4.1.tgz", 2063 | "integrity": "sha512-DbCc2TIzOxPaHF6KCbr8zLtiYOJQQQCBHUVNHV/SckUQobCBB2YkDtbLdxGnPwPNpJfEyMWxDAm36A2xkbxxtw==", 2064 | "dev": true, 2065 | "requires": { 2066 | "inherits": "^2.0.3" 2067 | } 2068 | }, 2069 | "randombytes": { 2070 | "version": "2.1.0", 2071 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2072 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2073 | "requires": { 2074 | "safe-buffer": "^5.1.0" 2075 | } 2076 | }, 2077 | "react-is": { 2078 | "version": "16.13.1", 2079 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 2080 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", 2081 | "dev": true 2082 | }, 2083 | "read-pkg": { 2084 | "version": "2.0.0", 2085 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", 2086 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", 2087 | "dev": true, 2088 | "requires": { 2089 | "load-json-file": "^2.0.0", 2090 | "normalize-package-data": "^2.3.2", 2091 | "path-type": "^2.0.0" 2092 | } 2093 | }, 2094 | "read-pkg-up": { 2095 | "version": "2.0.0", 2096 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", 2097 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", 2098 | "dev": true, 2099 | "requires": { 2100 | "find-up": "^2.0.0", 2101 | "read-pkg": "^2.0.0" 2102 | } 2103 | }, 2104 | "readable-stream": { 2105 | "version": "3.6.0", 2106 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 2107 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 2108 | "requires": { 2109 | "inherits": "^2.0.3", 2110 | "string_decoder": "^1.1.1", 2111 | "util-deprecate": "^1.0.1" 2112 | } 2113 | }, 2114 | "record-cache": { 2115 | "version": "1.1.0", 2116 | "resolved": "https://registry.npmjs.org/record-cache/-/record-cache-1.1.0.tgz", 2117 | "integrity": "sha512-u8rbtLEJV7HRacl/ZYwSBFD8NFyB3PfTTfGLP37IW3hftQCwu6z4Q2RLyxo1YJUNRTEzJfpLpGwVuEYdaIkG9Q==" 2118 | }, 2119 | "refpool": { 2120 | "version": "1.2.1", 2121 | "resolved": "https://registry.npmjs.org/refpool/-/refpool-1.2.1.tgz", 2122 | "integrity": "sha512-14IP+RGLPL78cPvX79/c7WKDufiqwpic3sZIsJ7AhBp4+fcUfySChJc/aiHSrBKCAr7uoytWAw8yVI4/pLKjbQ==", 2123 | "dev": true, 2124 | "requires": { 2125 | "time-ordered-set": "^1.0.2" 2126 | } 2127 | }, 2128 | "regexp.prototype.flags": { 2129 | "version": "1.3.0", 2130 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", 2131 | "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", 2132 | "dev": true, 2133 | "requires": { 2134 | "define-properties": "^1.1.3", 2135 | "es-abstract": "^1.17.0-next.1" 2136 | } 2137 | }, 2138 | "regexpp": { 2139 | "version": "2.0.1", 2140 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 2141 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 2142 | "dev": true 2143 | }, 2144 | "require-uncached": { 2145 | "version": "1.0.3", 2146 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 2147 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 2148 | "dev": true, 2149 | "requires": { 2150 | "caller-path": "^0.1.0", 2151 | "resolve-from": "^1.0.0" 2152 | } 2153 | }, 2154 | "resolve": { 2155 | "version": "1.17.0", 2156 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 2157 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 2158 | "requires": { 2159 | "path-parse": "^1.0.6" 2160 | } 2161 | }, 2162 | "resolve-from": { 2163 | "version": "1.0.1", 2164 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 2165 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 2166 | "dev": true 2167 | }, 2168 | "restore-cursor": { 2169 | "version": "2.0.0", 2170 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 2171 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 2172 | "dev": true, 2173 | "requires": { 2174 | "onetime": "^2.0.0", 2175 | "signal-exit": "^3.0.2" 2176 | } 2177 | }, 2178 | "resumer": { 2179 | "version": "0.0.0", 2180 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 2181 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 2182 | "dev": true, 2183 | "requires": { 2184 | "through": "~2.3.4" 2185 | } 2186 | }, 2187 | "rimraf": { 2188 | "version": "2.6.3", 2189 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 2190 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 2191 | "dev": true, 2192 | "requires": { 2193 | "glob": "^7.1.3" 2194 | } 2195 | }, 2196 | "run-async": { 2197 | "version": "2.4.1", 2198 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 2199 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 2200 | "dev": true 2201 | }, 2202 | "run-parallel": { 2203 | "version": "1.1.9", 2204 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", 2205 | "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", 2206 | "dev": true 2207 | }, 2208 | "rxjs": { 2209 | "version": "5.5.12", 2210 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", 2211 | "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", 2212 | "dev": true, 2213 | "requires": { 2214 | "symbol-observable": "1.0.1" 2215 | } 2216 | }, 2217 | "safe-buffer": { 2218 | "version": "5.2.1", 2219 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2220 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 2221 | }, 2222 | "safer-buffer": { 2223 | "version": "2.1.2", 2224 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2225 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2226 | "dev": true 2227 | }, 2228 | "semver": { 2229 | "version": "5.7.1", 2230 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 2231 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 2232 | "dev": true 2233 | }, 2234 | "sha256-wasm": { 2235 | "version": "1.3.0", 2236 | "resolved": "https://registry.npmjs.org/sha256-wasm/-/sha256-wasm-1.3.0.tgz", 2237 | "integrity": "sha512-/bPoRjEXqbSpsA9MDdjy3J3GWQWiZG+tjJbWYqhK+Ap4JWNJBxqSMJnIIzkZOA89UFqQMdKSoioNKXqXAkDyWQ==", 2238 | "requires": { 2239 | "nanoassert": "^2.0.0" 2240 | } 2241 | }, 2242 | "sha512-wasm": { 2243 | "version": "1.2.0", 2244 | "resolved": "https://registry.npmjs.org/sha512-wasm/-/sha512-wasm-1.2.0.tgz", 2245 | "integrity": "sha512-EPphV7XDTefQZw/fXQLfLjfqMCjLKbalgjiDmkMxMk3tjJB4qpjB0w/GEervpLLf0zwLg8EfddJ29PO6s5ec2A==", 2246 | "requires": { 2247 | "nanoassert": "^2.0.0" 2248 | } 2249 | }, 2250 | "shebang-command": { 2251 | "version": "1.2.0", 2252 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 2253 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 2254 | "dev": true, 2255 | "requires": { 2256 | "shebang-regex": "^1.0.0" 2257 | } 2258 | }, 2259 | "shebang-regex": { 2260 | "version": "1.0.0", 2261 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 2262 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 2263 | "dev": true 2264 | }, 2265 | "shuffled-priority-queue": { 2266 | "version": "2.1.0", 2267 | "resolved": "https://registry.npmjs.org/shuffled-priority-queue/-/shuffled-priority-queue-2.1.0.tgz", 2268 | "integrity": "sha512-xhdh7fHyMsr0m/w2kDfRJuBFRS96b9l8ZPNWGaQ+PMvnUnZ/Eh+gJJ9NsHBd7P9k0399WYlCLzsy18EaMfyadA==", 2269 | "requires": { 2270 | "unordered-set": "^2.0.1" 2271 | } 2272 | }, 2273 | "signal-exit": { 2274 | "version": "3.0.3", 2275 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 2276 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 2277 | "dev": true 2278 | }, 2279 | "signed-varint": { 2280 | "version": "2.0.1", 2281 | "resolved": "https://registry.npmjs.org/signed-varint/-/signed-varint-2.0.1.tgz", 2282 | "integrity": "sha1-UKmYnafJjCxh2tEZvJdHDvhSgSk=", 2283 | "requires": { 2284 | "varint": "~5.0.0" 2285 | } 2286 | }, 2287 | "simple-handshake": { 2288 | "version": "2.0.0", 2289 | "resolved": "https://registry.npmjs.org/simple-handshake/-/simple-handshake-2.0.0.tgz", 2290 | "integrity": "sha512-9f832LFISpuUaL5yG9HccJ/wW8BlqqANC8DGcNTcKStG2Yjp6kaoq8IdEtUXbRe0sD+qoxAiluDiurmGHNBLjA==", 2291 | "requires": { 2292 | "nanoassert": "^2.0.0", 2293 | "noise-protocol": "^2.0.0" 2294 | } 2295 | }, 2296 | "simple-hypercore-protocol": { 2297 | "version": "2.1.0", 2298 | "resolved": "https://registry.npmjs.org/simple-hypercore-protocol/-/simple-hypercore-protocol-2.1.0.tgz", 2299 | "integrity": "sha512-ZnArJL/l/19ahzjZoECd3ojt1OUn+ZFGqZTyuQaiR0R5XarxplRhpLpK+Wr5dyle2cH9ak3cxwUNCfGCOBSN3Q==", 2300 | "requires": { 2301 | "hypercore-crypto": "^2.1.0", 2302 | "noise-protocol": "^2.0.0", 2303 | "protocol-buffers-encodings": "^1.1.0", 2304 | "simple-handshake": "^2.0.0", 2305 | "simple-message-channels": "^1.2.1", 2306 | "varint": "^5.0.0", 2307 | "xsalsa20-universal": "^1.0.0" 2308 | } 2309 | }, 2310 | "simple-message-channels": { 2311 | "version": "1.2.1", 2312 | "resolved": "https://registry.npmjs.org/simple-message-channels/-/simple-message-channels-1.2.1.tgz", 2313 | "integrity": "sha512-knSr69GKW9sCjzpoy817xQelpOASUQ53TXCBcSLDKLE7GTGpUAhZzOZYrdbX2Ig//m+8AIrNp7sM7HDNHBRzXw==", 2314 | "requires": { 2315 | "varint": "^5.0.0" 2316 | } 2317 | }, 2318 | "siphash24": { 2319 | "version": "1.1.1", 2320 | "resolved": "https://registry.npmjs.org/siphash24/-/siphash24-1.1.1.tgz", 2321 | "integrity": "sha512-dKKwjIoTOa587TARYLlBRXq2lkbu5Iz35XrEVWpelhBP1m8r2BGOy1QlaZe84GTFHG/BTucEUd2btnNc8QzIVA==", 2322 | "requires": { 2323 | "nanoassert": "^1.0.0" 2324 | }, 2325 | "dependencies": { 2326 | "nanoassert": { 2327 | "version": "1.1.0", 2328 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-1.1.0.tgz", 2329 | "integrity": "sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40=" 2330 | } 2331 | } 2332 | }, 2333 | "slice-ansi": { 2334 | "version": "1.0.0", 2335 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", 2336 | "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", 2337 | "dev": true, 2338 | "requires": { 2339 | "is-fullwidth-code-point": "^2.0.0" 2340 | } 2341 | }, 2342 | "sodium-javascript": { 2343 | "version": "0.6.1", 2344 | "resolved": "https://registry.npmjs.org/sodium-javascript/-/sodium-javascript-0.6.1.tgz", 2345 | "integrity": "sha512-XIJRAKKfgtYxfKMMK5YJaNYF+Gio+gBgwMh+kvDHQ4/6BaWm9BQH49OMHPsNMMwud+OZM6MxqSy2NW6GNXZcNg==", 2346 | "requires": { 2347 | "blake2b": "^2.1.1", 2348 | "chacha20-universal": "^1.0.4", 2349 | "nanoassert": "^2.0.0", 2350 | "sha256-wasm": "^1.3.0", 2351 | "sha512-wasm": "^1.2.0", 2352 | "siphash24": "^1.0.1", 2353 | "xsalsa20": "^1.0.0" 2354 | } 2355 | }, 2356 | "sodium-native": { 2357 | "version": "3.2.0", 2358 | "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-3.2.0.tgz", 2359 | "integrity": "sha512-8aq/vQSegLwsRch8Sb/Bpf9aAqlNe5dp0+NVhb9UjHv42zDZ0D5zX3wBRUbXK9Ejum9uZE6DUgT4vVLlUFRBWg==", 2360 | "requires": { 2361 | "ini": "^1.3.5", 2362 | "node-gyp-build": "^4.2.0" 2363 | } 2364 | }, 2365 | "sodium-universal": { 2366 | "version": "3.0.1", 2367 | "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-3.0.1.tgz", 2368 | "integrity": "sha512-cKznP/jLjqXw6xMF+CwJzPLJOGMw5HZ4iLDY0+zwSOWFFxPgb8NgLzWupPeH8e5w+cukkD2Aehfxyr157r2Fuw==", 2369 | "requires": { 2370 | "blake2b": "^2.1.1", 2371 | "chacha20-universal": "^1.0.4", 2372 | "nanoassert": "^2.0.0", 2373 | "resolve": "^1.17.0", 2374 | "sha256-wasm": "^1.3.0", 2375 | "sha512-wasm": "^1.2.0", 2376 | "siphash24": "^1.0.1", 2377 | "sodium-javascript": "~0.6.1", 2378 | "sodium-native": "^3.2.0", 2379 | "xsalsa20": "^1.0.0" 2380 | } 2381 | }, 2382 | "sparse-bitfield": { 2383 | "version": "3.0.3", 2384 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 2385 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 2386 | "dev": true, 2387 | "requires": { 2388 | "memory-pager": "^1.0.2" 2389 | } 2390 | }, 2391 | "spdx-correct": { 2392 | "version": "3.1.1", 2393 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", 2394 | "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", 2395 | "dev": true, 2396 | "requires": { 2397 | "spdx-expression-parse": "^3.0.0", 2398 | "spdx-license-ids": "^3.0.0" 2399 | } 2400 | }, 2401 | "spdx-exceptions": { 2402 | "version": "2.3.0", 2403 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", 2404 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", 2405 | "dev": true 2406 | }, 2407 | "spdx-expression-parse": { 2408 | "version": "3.0.1", 2409 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 2410 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 2411 | "dev": true, 2412 | "requires": { 2413 | "spdx-exceptions": "^2.1.0", 2414 | "spdx-license-ids": "^3.0.0" 2415 | } 2416 | }, 2417 | "spdx-license-ids": { 2418 | "version": "3.0.5", 2419 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", 2420 | "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", 2421 | "dev": true 2422 | }, 2423 | "speedometer": { 2424 | "version": "1.1.0", 2425 | "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.1.0.tgz", 2426 | "integrity": "sha512-z/wAiTESw2XVPssY2XRcme4niTc4S5FkkJ4gknudtVoc33Zil8TdTxHy5torRcgqMqksJV2Yz8HQcvtbsnw0mQ==" 2427 | }, 2428 | "sprintf-js": { 2429 | "version": "1.0.3", 2430 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2431 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2432 | "dev": true 2433 | }, 2434 | "standard": { 2435 | "version": "12.0.1", 2436 | "resolved": "https://registry.npmjs.org/standard/-/standard-12.0.1.tgz", 2437 | "integrity": "sha512-UqdHjh87OG2gUrNCSM4QRLF5n9h3TFPwrCNyVlkqu31Hej0L/rc8hzKqVvkb2W3x0WMq7PzZdkLfEcBhVOR6lg==", 2438 | "dev": true, 2439 | "requires": { 2440 | "eslint": "~5.4.0", 2441 | "eslint-config-standard": "12.0.0", 2442 | "eslint-config-standard-jsx": "6.0.2", 2443 | "eslint-plugin-import": "~2.14.0", 2444 | "eslint-plugin-node": "~7.0.1", 2445 | "eslint-plugin-promise": "~4.0.0", 2446 | "eslint-plugin-react": "~7.11.1", 2447 | "eslint-plugin-standard": "~4.0.0", 2448 | "standard-engine": "~9.0.0" 2449 | } 2450 | }, 2451 | "standard-engine": { 2452 | "version": "9.0.0", 2453 | "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-9.0.0.tgz", 2454 | "integrity": "sha512-ZfNfCWZ2Xq67VNvKMPiVMKHnMdvxYzvZkf1AH8/cw2NLDBm5LRsxMqvEJpsjLI/dUosZ3Z1d6JlHDp5rAvvk2w==", 2455 | "dev": true, 2456 | "requires": { 2457 | "deglob": "^2.1.0", 2458 | "get-stdin": "^6.0.0", 2459 | "minimist": "^1.1.0", 2460 | "pkg-conf": "^2.0.0" 2461 | } 2462 | }, 2463 | "stream-collector": { 2464 | "version": "1.0.1", 2465 | "resolved": "https://registry.npmjs.org/stream-collector/-/stream-collector-1.0.1.tgz", 2466 | "integrity": "sha1-TU5V8XE1YSGyxfZVn5RHBaso2xU=", 2467 | "requires": { 2468 | "once": "^1.3.1" 2469 | } 2470 | }, 2471 | "streamx": { 2472 | "version": "2.6.6", 2473 | "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.6.6.tgz", 2474 | "integrity": "sha512-/fl3zzRl1/MIe4AZBKUX78mNbbCXZwmCFjT0AiwORaLorHCDkFcFRSfswl7PMPayFgWLuOfRI6Q1DTMdcwYlVQ==", 2475 | "requires": { 2476 | "fast-fifo": "^1.0.0", 2477 | "nanoassert": "^2.0.0" 2478 | } 2479 | }, 2480 | "string-width": { 2481 | "version": "2.1.1", 2482 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 2483 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 2484 | "dev": true, 2485 | "requires": { 2486 | "is-fullwidth-code-point": "^2.0.0", 2487 | "strip-ansi": "^4.0.0" 2488 | } 2489 | }, 2490 | "string.prototype.trim": { 2491 | "version": "1.2.1", 2492 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz", 2493 | "integrity": "sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==", 2494 | "dev": true, 2495 | "requires": { 2496 | "define-properties": "^1.1.3", 2497 | "es-abstract": "^1.17.0-next.1", 2498 | "function-bind": "^1.1.1" 2499 | } 2500 | }, 2501 | "string.prototype.trimend": { 2502 | "version": "1.0.1", 2503 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", 2504 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", 2505 | "dev": true, 2506 | "requires": { 2507 | "define-properties": "^1.1.3", 2508 | "es-abstract": "^1.17.5" 2509 | } 2510 | }, 2511 | "string.prototype.trimstart": { 2512 | "version": "1.0.1", 2513 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 2514 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", 2515 | "dev": true, 2516 | "requires": { 2517 | "define-properties": "^1.1.3", 2518 | "es-abstract": "^1.17.5" 2519 | } 2520 | }, 2521 | "string_decoder": { 2522 | "version": "1.3.0", 2523 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2524 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2525 | "requires": { 2526 | "safe-buffer": "~5.2.0" 2527 | } 2528 | }, 2529 | "strip-ansi": { 2530 | "version": "4.0.0", 2531 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 2532 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 2533 | "dev": true, 2534 | "requires": { 2535 | "ansi-regex": "^3.0.0" 2536 | }, 2537 | "dependencies": { 2538 | "ansi-regex": { 2539 | "version": "3.0.0", 2540 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 2541 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 2542 | "dev": true 2543 | } 2544 | } 2545 | }, 2546 | "strip-bom": { 2547 | "version": "3.0.0", 2548 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 2549 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 2550 | "dev": true 2551 | }, 2552 | "strip-json-comments": { 2553 | "version": "2.0.1", 2554 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2555 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 2556 | "dev": true 2557 | }, 2558 | "supports-color": { 2559 | "version": "2.0.0", 2560 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 2561 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 2562 | "dev": true 2563 | }, 2564 | "symbol-observable": { 2565 | "version": "1.0.1", 2566 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", 2567 | "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", 2568 | "dev": true 2569 | }, 2570 | "table": { 2571 | "version": "4.0.3", 2572 | "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", 2573 | "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", 2574 | "dev": true, 2575 | "requires": { 2576 | "ajv": "^6.0.1", 2577 | "ajv-keywords": "^3.0.0", 2578 | "chalk": "^2.1.0", 2579 | "lodash": "^4.17.4", 2580 | "slice-ansi": "1.0.0", 2581 | "string-width": "^2.1.1" 2582 | } 2583 | }, 2584 | "tape": { 2585 | "version": "4.13.3", 2586 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.3.tgz", 2587 | "integrity": "sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw==", 2588 | "dev": true, 2589 | "requires": { 2590 | "deep-equal": "~1.1.1", 2591 | "defined": "~1.0.0", 2592 | "dotignore": "~0.1.2", 2593 | "for-each": "~0.3.3", 2594 | "function-bind": "~1.1.1", 2595 | "glob": "~7.1.6", 2596 | "has": "~1.0.3", 2597 | "inherits": "~2.0.4", 2598 | "is-regex": "~1.0.5", 2599 | "minimist": "~1.2.5", 2600 | "object-inspect": "~1.7.0", 2601 | "resolve": "~1.17.0", 2602 | "resumer": "~0.0.0", 2603 | "string.prototype.trim": "~1.2.1", 2604 | "through": "~2.3.8" 2605 | }, 2606 | "dependencies": { 2607 | "is-regex": { 2608 | "version": "1.0.5", 2609 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 2610 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 2611 | "dev": true, 2612 | "requires": { 2613 | "has": "^1.0.3" 2614 | } 2615 | }, 2616 | "object-inspect": { 2617 | "version": "1.7.0", 2618 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 2619 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", 2620 | "dev": true 2621 | } 2622 | } 2623 | }, 2624 | "text-table": { 2625 | "version": "0.2.0", 2626 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2627 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2628 | "dev": true 2629 | }, 2630 | "through": { 2631 | "version": "2.3.8", 2632 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2633 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 2634 | "dev": true 2635 | }, 2636 | "thunky": { 2637 | "version": "1.1.0", 2638 | "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", 2639 | "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" 2640 | }, 2641 | "time-ordered-set": { 2642 | "version": "1.0.2", 2643 | "resolved": "https://registry.npmjs.org/time-ordered-set/-/time-ordered-set-1.0.2.tgz", 2644 | "integrity": "sha512-vGO99JkxvgX+u+LtOKQEpYf31Kj3i/GNwVstfnh4dyINakMgeZCpew1e3Aj+06hEslhtHEd52g7m5IV+o1K8Mw==" 2645 | }, 2646 | "timeout-refresh": { 2647 | "version": "1.0.2", 2648 | "resolved": "https://registry.npmjs.org/timeout-refresh/-/timeout-refresh-1.0.2.tgz", 2649 | "integrity": "sha512-lsO23gD/EeW53AvEoTOleUFqTIapZTu5NPzD6ndUGs0+G1IuN0+hu2kT6I3AmNX2fiOrcC6umtzMEv1XQmajgQ==" 2650 | }, 2651 | "tmp": { 2652 | "version": "0.0.33", 2653 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 2654 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 2655 | "dev": true, 2656 | "requires": { 2657 | "os-tmpdir": "~1.0.2" 2658 | } 2659 | }, 2660 | "type-check": { 2661 | "version": "0.3.2", 2662 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2663 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2664 | "dev": true, 2665 | "requires": { 2666 | "prelude-ls": "~1.1.2" 2667 | } 2668 | }, 2669 | "uint64be": { 2670 | "version": "3.0.0", 2671 | "resolved": "https://registry.npmjs.org/uint64be/-/uint64be-3.0.0.tgz", 2672 | "integrity": "sha512-mliiCSrsE29aNBI7O9W5gGv6WmA9kBR8PtTt6Apaxns076IRdYrrtFhXHEWMj5CSum3U7cv7/pi4xmi4XsIOqg==" 2673 | }, 2674 | "uniq": { 2675 | "version": "1.0.1", 2676 | "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", 2677 | "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", 2678 | "dev": true 2679 | }, 2680 | "unordered-array-remove": { 2681 | "version": "1.0.2", 2682 | "resolved": "https://registry.npmjs.org/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz", 2683 | "integrity": "sha1-xUbo+I4xegzyZEyX7LV9umbSUO8=", 2684 | "dev": true 2685 | }, 2686 | "unordered-set": { 2687 | "version": "2.0.1", 2688 | "resolved": "https://registry.npmjs.org/unordered-set/-/unordered-set-2.0.1.tgz", 2689 | "integrity": "sha512-eUmNTPzdx+q/WvOHW0bgGYLWvWHNT3PTKEQLg0MAQhc0AHASHVHoP/9YytYd4RBVariqno/mEUhVZN98CmD7bg==" 2690 | }, 2691 | "uri-js": { 2692 | "version": "4.2.2", 2693 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 2694 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 2695 | "dev": true, 2696 | "requires": { 2697 | "punycode": "^2.1.0" 2698 | } 2699 | }, 2700 | "util-deprecate": { 2701 | "version": "1.0.2", 2702 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2703 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2704 | }, 2705 | "utp-native": { 2706 | "version": "2.2.1", 2707 | "resolved": "https://registry.npmjs.org/utp-native/-/utp-native-2.2.1.tgz", 2708 | "integrity": "sha512-7GvD4gjGyL1GaNtZAaBVHn8SeWgx9/xIVE1LufMR0m2pWUs1EVx5WiOCXrCHyt7e15+5SquBMoQfj888pJySxA==", 2709 | "requires": { 2710 | "napi-macros": "^2.0.0", 2711 | "node-gyp-build": "^4.2.0", 2712 | "readable-stream": "^3.0.2", 2713 | "timeout-refresh": "^1.0.0", 2714 | "unordered-set": "^2.0.1" 2715 | } 2716 | }, 2717 | "validate-npm-package-license": { 2718 | "version": "3.0.4", 2719 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 2720 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 2721 | "dev": true, 2722 | "requires": { 2723 | "spdx-correct": "^3.0.0", 2724 | "spdx-expression-parse": "^3.0.0" 2725 | } 2726 | }, 2727 | "varint": { 2728 | "version": "5.0.0", 2729 | "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", 2730 | "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=" 2731 | }, 2732 | "which": { 2733 | "version": "1.3.1", 2734 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2735 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2736 | "dev": true, 2737 | "requires": { 2738 | "isexe": "^2.0.0" 2739 | } 2740 | }, 2741 | "word-wrap": { 2742 | "version": "1.2.3", 2743 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 2744 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 2745 | "dev": true 2746 | }, 2747 | "wrappy": { 2748 | "version": "1.0.2", 2749 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2750 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 2751 | }, 2752 | "write": { 2753 | "version": "0.2.1", 2754 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 2755 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 2756 | "dev": true, 2757 | "requires": { 2758 | "mkdirp": "^0.5.1" 2759 | } 2760 | }, 2761 | "xor-distance": { 2762 | "version": "2.0.0", 2763 | "resolved": "https://registry.npmjs.org/xor-distance/-/xor-distance-2.0.0.tgz", 2764 | "integrity": "sha512-AsAqZfPAuWx7qB/0kyRDUEvoU3QKsHWzHU9smFlkaiprEpGfJ/NBbLze2Uq0rdkxCxkNM9uOLvz/KoNBCbZiLQ==" 2765 | }, 2766 | "xsalsa20": { 2767 | "version": "1.1.0", 2768 | "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.1.0.tgz", 2769 | "integrity": "sha512-zd3ytX2cm+tcSndRU+krm0eL4TMMpZE7evs5hLRAoOy6gviqLfe3qOlkjF3i5SeAkQUCeJk0lJZrEU56kHRfWw==" 2770 | }, 2771 | "xsalsa20-universal": { 2772 | "version": "1.0.0", 2773 | "resolved": "https://registry.npmjs.org/xsalsa20-universal/-/xsalsa20-universal-1.0.0.tgz", 2774 | "integrity": "sha512-0M/X61wiKKAGAMqsxEyJ0kY6NtjpcMiKinYSSsl4K7ypgvqXDTMwQK6hxnYE1s1Jm7h6YKcN8obDUg2CC+jVGA==", 2775 | "requires": { 2776 | "sodium-native": "^3.0.1", 2777 | "xsalsa20": "^1.1.0" 2778 | } 2779 | }, 2780 | "xtend": { 2781 | "version": "4.0.2", 2782 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2783 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 2784 | "dev": true 2785 | } 2786 | } 2787 | } 2788 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@corestore/networker", 3 | "version": "1.2.1", 4 | "description": "A corestore networking module based on Hyperswarm.", 5 | "main": "index.js", 6 | "dependencies": { 7 | "call-me-maybe": "^1.0.1", 8 | "codecs": "^2.1.0", 9 | "hypercore-protocol": "^8.0.0", 10 | "hyperswarm": "^2.14.1", 11 | "nanoresource-promise": "^1.2.2", 12 | "pump": "^3.0.0" 13 | }, 14 | "devDependencies": { 15 | "@hyperswarm/dht": "^4.0.1", 16 | "corestore": "^5.0.0", 17 | "hypercore-crypto": "^2.1.1", 18 | "random-access-memory": "^3.1.1", 19 | "standard": "^12.0.1", 20 | "tape": "^4.9.0" 21 | }, 22 | "browser": { 23 | "hyperswarm": false 24 | }, 25 | "scripts": { 26 | "test": "tape test/*.js" 27 | }, 28 | "repository": { 29 | "type": "git", 30 | "url": "git+https://github.com/andrewosh/corestore-networker.git" 31 | }, 32 | "keywords": [ 33 | "corestore", 34 | "hyperswarm" 35 | ], 36 | "author": "Andrew Osheroff ", 37 | "license": "MIT", 38 | "bugs": { 39 | "url": "https://github.com/andrewosh/corestore-networker/issues" 40 | }, 41 | "homepage": "https://github.com/andrewosh/corestore-networker#readme" 42 | } 43 | -------------------------------------------------------------------------------- /test/all.js: -------------------------------------------------------------------------------- 1 | const test = require('tape') 2 | const ram = require('random-access-memory') 3 | const dht = require('@hyperswarm/dht') 4 | const hypercoreCrypto = require('hypercore-crypto') 5 | const HypercoreProtocol = require('hypercore-protocol') 6 | const Corestore = require('corestore') 7 | 8 | const CorestoreNetworker = require('..') 9 | 10 | const BOOTSTRAP_PORT = 3100 11 | var bootstrap = null 12 | 13 | test('simple replication', async t => { 14 | const { store: store1, networker: networker1 } = await create() 15 | const { store: store2, networker: networker2 } = await create() 16 | 17 | const core1 = store1.get() 18 | const core2 = store2.get(core1.key) 19 | 20 | await networker1.configure(core1.discoveryKey) 21 | await networker2.configure(core2.discoveryKey) 22 | 23 | await append(core1, 'hello') 24 | const data = await get(core2, 0) 25 | t.same(data, Buffer.from('hello')) 26 | 27 | await cleanup([networker1, networker2]) 28 | t.end() 29 | }) 30 | 31 | test('replicate multiple top-level cores', async t => { 32 | const { store: store1, networker: networker1 } = await create() 33 | const { store: store2, networker: networker2 } = await create() 34 | 35 | const core1 = store1.get() 36 | const core2 = store1.get() 37 | const core3 = store2.get(core1.key) 38 | const core4 = store2.get(core2.key) 39 | 40 | await networker1.configure(core1.discoveryKey) 41 | await networker1.configure(core2.discoveryKey) 42 | await networker2.configure(core2.discoveryKey) 43 | await networker2.configure(core3.discoveryKey) 44 | 45 | await append(core1, 'hello') 46 | await append(core2, 'world') 47 | const d1 = await get(core3, 0) 48 | const d2 = await get(core4, 0) 49 | t.same(d1, Buffer.from('hello')) 50 | t.same(d2, Buffer.from('world')) 51 | 52 | await cleanup([networker1, networker2]) 53 | t.end() 54 | }) 55 | 56 | test('replicate to multiple receivers', async t => { 57 | const { store: store1, networker: networker1 } = await create() 58 | const { store: store2, networker: networker2 } = await create() 59 | const { store: store3, networker: networker3 } = await create() 60 | 61 | const core1 = store1.get() 62 | const core2 = store2.get(core1.key) 63 | const core3 = store3.get(core1.key) 64 | 65 | await networker1.configure(core1.discoveryKey) 66 | await networker2.configure(core2.discoveryKey) 67 | await networker3.configure(core3.discoveryKey) 68 | 69 | await append(core1, 'hello') 70 | const d1 = await get(core2, 0) 71 | const d2 = await get(core3, 0) 72 | t.same(d1, Buffer.from('hello')) 73 | t.same(d2, Buffer.from('hello')) 74 | 75 | await cleanup([networker1, networker2, networker3]) 76 | t.end() 77 | }) 78 | 79 | test('replicate sub-cores', async t => { 80 | const { store: store1, networker: networker1 } = await create() 81 | const { store: store2, networker: networker2 } = await create() 82 | 83 | const core1 = store1.get() 84 | const core3 = store2.get(core1.key) 85 | 86 | await networker1.configure(core1.discoveryKey) 87 | await networker2.configure(core3.discoveryKey) 88 | 89 | const core2 = store1.get({ parents: [core1.key] }) 90 | const core4 = store2.get({ key: core2.key, parents: [core3.key] }) 91 | 92 | await append(core1, 'hello') 93 | await append(core2, 'world') 94 | const d1 = await get(core3, 0) 95 | const d2 = await get(core4, 0) 96 | t.same(d1, Buffer.from('hello')) 97 | t.same(d2, Buffer.from('world')) 98 | 99 | await cleanup([networker1, networker2]) 100 | t.end() 101 | }) 102 | 103 | test('can replicate using a custom keypair', async t => { 104 | const keyPair1 = HypercoreProtocol.keyPair() 105 | const keyPair2 = HypercoreProtocol.keyPair() 106 | const { store: store1, networker: networker1 } = await create({ keyPair: keyPair1 }) 107 | const { store: store2, networker: networker2 } = await create({ keyPair: keyPair2 }) 108 | 109 | const core1 = store1.get() 110 | const core3 = store2.get(core1.key) 111 | 112 | await networker1.configure(core1.discoveryKey) 113 | await networker2.configure(core3.discoveryKey) 114 | 115 | const core2 = store1.get() 116 | const core4 = store2.get({ key: core2.key }) 117 | 118 | await append(core1, 'hello') 119 | await append(core2, 'world') 120 | const d1 = await get(core3, 0) 121 | const d2 = await get(core4, 0) 122 | t.same(d1, Buffer.from('hello')) 123 | t.same(d2, Buffer.from('world')) 124 | 125 | { 126 | const streams = [...networker1.streams] 127 | t.same(streams[0].remotePublicKey, keyPair2.publicKey) 128 | t.same(streams[0].publicKey, keyPair1.publicKey) 129 | } 130 | 131 | { 132 | const streams = [...networker2.streams] 133 | t.same(streams[0].remotePublicKey, keyPair1.publicKey) 134 | t.same(streams[0].publicKey, keyPair2.publicKey) 135 | } 136 | 137 | await cleanup([networker1, networker2]) 138 | t.end() 139 | }) 140 | 141 | test('join status only emits flushed after all handshakes', async t => { 142 | const { store: store1, networker: networker1 } = await create() 143 | const { store: store2, networker: networker2 } = await create() 144 | const { store: store3, networker: networker3 } = await create() 145 | 146 | const core1 = store1.get() 147 | const core2 = store2.get(core1.key) 148 | await append(core1, 'hello') 149 | 150 | let join2Flushed = 0 151 | let join3Flushed = 0 152 | let join2FlushPeers = 0 153 | let join3FlushPeers = 0 154 | 155 | // If ifAvail were not blocked, the get would immediately return with null (unless the connection's established immediately). 156 | await networker1.configure(core1.discoveryKey) 157 | networker2.on('flushed', dkey => { 158 | if (!dkey.equals(core1.discoveryKey)) return 159 | join2Flushed++ 160 | join2FlushPeers = core2.peers.length 161 | }) 162 | await networker2.configure(core1.discoveryKey) 163 | 164 | const core3 = store3.get(core1.key) 165 | networker3.on('flushed', (dkey) => { 166 | if (!dkey.equals(core1.discoveryKey)) return 167 | join3Flushed++ 168 | join3FlushPeers = core3.peers.length 169 | allFlushed() 170 | }) 171 | networker3.configure(core1.discoveryKey) 172 | 173 | async function allFlushed () { 174 | t.same(join2Flushed, 1) 175 | t.true(join2FlushPeers >= 1) 176 | t.same(join3Flushed, 1) 177 | t.true(join3FlushPeers >= 2) 178 | await cleanup([networker1, networker2, networker3]) 179 | t.end() 180 | } 181 | }) 182 | 183 | test('can destroy multiple times', async t => { 184 | const { networker } = await create() 185 | 186 | await networker.close() 187 | await networker.close() 188 | t.pass('closed successfully') 189 | 190 | await cleanup([networker]) 191 | t.end() 192 | }) 193 | 194 | test('peers are correctly added/removed', async t => { 195 | const { networker: networker1 } = await create() 196 | const { networker: networker2 } = await create() 197 | const { networker: networker3 } = await create() 198 | 199 | const dkey = hypercoreCrypto.randomBytes(32) 200 | await networker1.configure(dkey) 201 | 202 | const twoJoinsProm = new Promise(resolve => { 203 | networker1.once('peer-add', peer => { 204 | t.true(peer.remotePublicKey.equals(networker2.keyPair.publicKey)) 205 | networker1.once('peer-add', peer => { 206 | t.true(peer.remotePublicKey.equals(networker3.keyPair.publicKey)) 207 | t.same(networker1.peers.size, 2) 208 | return resolve() 209 | }) 210 | }) 211 | }) 212 | 213 | const twoLeavesProm = new Promise(resolve => { 214 | networker1.once('peer-remove', peer => { 215 | t.true(peer.remotePublicKey.equals(networker2.keyPair.publicKey)) 216 | networker1.once('peer-remove', peer => { 217 | t.true(peer.remotePublicKey.equals(networker3.keyPair.publicKey)) 218 | t.same(networker1.peers.size, 0) 219 | return resolve() 220 | }) 221 | }) 222 | }) 223 | 224 | await networker2.configure(dkey, { announce: false, lookup: true, flush: true }) 225 | await networker3.configure(dkey, { announce: false, lookup: true, flush: true }) 226 | 227 | await new Promise(resolve => setTimeout(resolve, 100)) 228 | 229 | await networker2.close() 230 | await networker3.close() 231 | 232 | await Promise.all([twoJoinsProm, twoLeavesProm]) 233 | 234 | await cleanup([networker1]) 235 | t.end() 236 | }) 237 | 238 | test('can register stream-wide extensions', async t => { 239 | const { networker: networker1 } = await create() 240 | const { networker: networker2 } = await create() 241 | const { networker: networker3 } = await create() 242 | 243 | const froms = [networker2.keyPair.publicKey, networker3.keyPair.publicKey] 244 | const msgs = ['hello', 'world'] 245 | let received = 0 246 | 247 | var onmessage = null 248 | const allReceivedProm = new Promise(resolve => { 249 | onmessage = (msg, from) => { 250 | t.true(from.remotePublicKey.equals(froms[received])) 251 | t.same(msg, msgs[received]) 252 | received++ 253 | if (received === froms.length) return resolve() 254 | } 255 | }) 256 | 257 | const extension = { 258 | name: 'test-extension', 259 | encoding: 'utf8', 260 | onmessage 261 | } 262 | networker1.registerExtension(extension) 263 | const n2Ext = networker2.registerExtension(extension) 264 | const n3Ext = networker3.registerExtension(extension) 265 | 266 | networker2.on('peer-add', peer => { 267 | n2Ext.send('hello', peer) 268 | }) 269 | networker3.on('peer-add', peer => { 270 | n3Ext.send('world', peer) 271 | }) 272 | const dkey = hypercoreCrypto.randomBytes(32) 273 | await networker1.configure(dkey) 274 | await networker2.configure(dkey, { announce: false, lookup: true, flush: true }) 275 | await networker3.configure(dkey, { announce: false, lookup: true, flush: true }) 276 | 277 | await new Promise(resolve => setTimeout(resolve, 100)) 278 | await allReceivedProm 279 | 280 | await cleanup([networker1, networker2, networker3]) 281 | t.end() 282 | }) 283 | 284 | test('can register extensions with the same name', async t => { 285 | const { networker: networker1 } = await create() 286 | const { networker: networker2 } = await create() 287 | const { networker: networker3 } = await create() 288 | 289 | const froms = [networker2.keyPair.publicKey, networker3.keyPair.publicKey] 290 | const msgs = ['hello', 'world'] 291 | let received = 0 292 | 293 | var onmessage = null 294 | const allReceivedProm = new Promise(resolve => { 295 | onmessage = (msg, from) => { 296 | t.true(from.remotePublicKey.equals(froms[received])) 297 | t.same(msg, msgs[received]) 298 | received++ 299 | if (received === froms.length) return resolve() 300 | } 301 | }) 302 | 303 | const extensionOne = { 304 | name: 'test-extension', 305 | encoding: 'utf8', 306 | onmessage 307 | } 308 | const extensionTwo = { 309 | name: 'test-extension', 310 | encoding: 'utf8', 311 | onmessage 312 | } 313 | networker1.registerExtension(extensionOne) 314 | networker1.registerExtension(extensionTwo) 315 | const n2Ext = networker2.registerExtension(extensionTwo) 316 | const n3Ext = networker3.registerExtension(extensionTwo) 317 | 318 | networker2.on('peer-add', peer => { 319 | n2Ext.send('hello', peer) 320 | }) 321 | networker3.on('peer-add', peer => { 322 | n3Ext.send('world', peer) 323 | }) 324 | const dkey = hypercoreCrypto.randomBytes(32) 325 | await networker1.configure(dkey) 326 | await networker2.configure(dkey, { announce: false, lookup: true, flush: true }) 327 | await networker3.configure(dkey, { announce: false, lookup: true, flush: true }) 328 | 329 | await new Promise(resolve => setTimeout(resolve, 100)) 330 | await allReceivedProm 331 | 332 | await cleanup([networker1, networker2, networker3]) 333 | t.end() 334 | }) 335 | 336 | test('can register function based extensions', async t => { 337 | const { networker: networker1 } = await create() 338 | const { networker: networker2 } = await create() 339 | const { networker: networker3 } = await create() 340 | 341 | const froms = [networker2.keyPair.publicKey, networker3.keyPair.publicKey] 342 | const msgs = ['hello', 'world'] 343 | let received = 0 344 | 345 | var onmessage = null 346 | const allReceivedProm = new Promise(resolve => { 347 | onmessage = (msg, from) => { 348 | t.true(from.remotePublicKey.equals(froms[received])) 349 | t.same(msg, msgs[received]) 350 | received++ 351 | if (received === froms.length) return resolve() 352 | } 353 | }) 354 | 355 | const extension = (ext) => ({ 356 | encoding: 'utf8', 357 | onmessage 358 | }) 359 | 360 | // Note: Must use name outside of the function handler for now 361 | networker1.registerExtension('test-extension', extension) 362 | const n2Ext = networker2.registerExtension('test-extension', extension) 363 | const n3Ext = networker3.registerExtension('test-extension', extension) 364 | 365 | networker2.on('peer-add', peer => { 366 | n2Ext.send('hello', peer) 367 | }) 368 | networker3.on('peer-add', peer => { 369 | n3Ext.send('world', peer) 370 | }) 371 | const dkey = hypercoreCrypto.randomBytes(32) 372 | await networker1.configure(dkey) 373 | await networker2.configure(dkey, { announce: false, lookup: true, flush: true }) 374 | await networker3.configure(dkey, { announce: false, lookup: true, flush: true }) 375 | 376 | await new Promise(resolve => setTimeout(resolve, 100)) 377 | await allReceivedProm 378 | 379 | await cleanup([networker1, networker2, networker3]) 380 | t.end() 381 | }) 382 | 383 | test('can use other encodings', async t => { 384 | const { networker: networker1 } = await create() 385 | const { networker: networker2 } = await create() 386 | const { networker: networker3 } = await create() 387 | 388 | const froms = [networker2.keyPair.publicKey, networker3.keyPair.publicKey] 389 | const msgs = [{ message: 'hello' }, { message: 'world' }] 390 | let received = 0 391 | 392 | var onmessage = null 393 | const allReceivedProm = new Promise(resolve => { 394 | onmessage = (msg, from) => { 395 | t.true(from.remotePublicKey.equals(froms[received])) 396 | t.same(msg, msgs[received]) 397 | received++ 398 | if (received === froms.length) return resolve() 399 | } 400 | }) 401 | 402 | const extension = { 403 | name: 'test-extension', 404 | encoding: 'json', 405 | onmessage 406 | } 407 | networker1.registerExtension(extension) 408 | const n2Ext = networker2.registerExtension(extension) 409 | const n3Ext = networker3.registerExtension(extension) 410 | 411 | networker2.on('peer-add', peer => { 412 | n2Ext.send({ message: 'hello' }, peer) 413 | }) 414 | networker3.on('peer-add', peer => { 415 | n3Ext.send({ message: 'world' }, peer) 416 | }) 417 | const dkey = hypercoreCrypto.randomBytes(32) 418 | await networker1.configure(dkey) 419 | await networker2.configure(dkey, { announce: false, lookup: true, flush: true }) 420 | await networker3.configure(dkey, { announce: false, lookup: true, flush: true }) 421 | 422 | await new Promise(resolve => setTimeout(resolve, 100)) 423 | await allReceivedProm 424 | 425 | await cleanup([networker1, networker2, networker3]) 426 | t.end() 427 | }) 428 | 429 | test('bidirectional extension send/receive', async t => { 430 | const { networker: networker1 } = await create() 431 | const { networker: networker2 } = await create() 432 | 433 | var firstReceivedProm = null 434 | var secondReceivedProm = null 435 | 436 | { 437 | let onmessage = null 438 | let ext = null 439 | 440 | firstReceivedProm = new Promise(resolve => { 441 | onmessage = (msg, from) => { 442 | t.true(from.remotePublicKey.equals(networker2.keyPair.publicKey)) 443 | t.same(msg, 'hello') 444 | ext.send('world', from) 445 | return resolve() 446 | } 447 | }) 448 | 449 | ext = networker1.registerExtension({ 450 | name: 'test-extension', 451 | encoding: 'utf8', 452 | onmessage 453 | }) 454 | } 455 | 456 | { 457 | let onmessage = null 458 | let ext = null 459 | 460 | secondReceivedProm = new Promise(resolve => { 461 | onmessage = (msg, from) => { 462 | t.true(from.remotePublicKey.equals(networker1.keyPair.publicKey)) 463 | t.same(msg, 'world') 464 | return resolve() 465 | } 466 | }) 467 | 468 | ext = networker2.registerExtension({ 469 | name: 'test-extension', 470 | encoding: 'utf8', 471 | onmessage 472 | }) 473 | 474 | networker2.on('peer-add', peer => { 475 | ext.send('hello', peer) 476 | }) 477 | } 478 | 479 | const dkey = hypercoreCrypto.randomBytes(32) 480 | await networker1.configure(dkey) 481 | await networker2.configure(dkey, { announce: false, lookup: true, flush: true }) 482 | 483 | await new Promise(resolve => setTimeout(resolve, 100)) 484 | 485 | await firstReceivedProm 486 | await secondReceivedProm 487 | 488 | await cleanup([networker1, networker2]) 489 | t.end() 490 | }) 491 | 492 | test('onauthentication hook', async t => { 493 | t.plan(2) 494 | const { networker: networker1 } = await create({ 495 | onauthenticate (peerPublicKey, cb) { 496 | t.deepEquals(peerPublicKey, networker2.keyPair.publicKey) 497 | cb() 498 | } 499 | }) 500 | const { networker: networker2 } = await create() 501 | 502 | const dkey = hypercoreCrypto.randomBytes(32) 503 | await networker1.configure(dkey) 504 | await networker2.configure(dkey) 505 | 506 | await new Promise(resolve => setTimeout(resolve, 100)) 507 | await cleanup([networker1, networker2]) 508 | t.end() 509 | }) 510 | 511 | async function create (opts = {}) { 512 | if (!bootstrap) { 513 | bootstrap = dht({ 514 | bootstrap: false 515 | }) 516 | bootstrap.listen(BOOTSTRAP_PORT) 517 | await new Promise(resolve => { 518 | return bootstrap.once('listening', resolve) 519 | }) 520 | } 521 | const store = new Corestore(ram) 522 | await store.ready() 523 | const networker = new CorestoreNetworker(store, { ...opts, bootstrap: `localhost:${BOOTSTRAP_PORT}` }) 524 | return { store, networker } 525 | } 526 | 527 | function append (core, data) { 528 | return new Promise((resolve, reject) => { 529 | core.append(data, err => { 530 | if (err) return reject(err) 531 | return resolve() 532 | }) 533 | }) 534 | } 535 | 536 | function get (core, idx, opts = {}) { 537 | return new Promise((resolve, reject) => { 538 | core.get(idx, opts, (err, data) => { 539 | if (err) return reject(err) 540 | return resolve(data) 541 | }) 542 | }) 543 | } 544 | 545 | async function cleanup (networkers) { 546 | for (const networker of networkers) { 547 | await networker.close() 548 | } 549 | if (bootstrap) { 550 | await bootstrap.destroy() 551 | bootstrap = null 552 | } 553 | } 554 | --------------------------------------------------------------------------------