├── .gitignore ├── LICENSE ├── README.md ├── hyperbee ├── 1a-basics.js ├── 1b-hyperspace.js ├── 2-iterators.js ├── 3-diffs.js ├── 4-sub.js ├── 5-leveldown.js └── package.json ├── hypercore ├── package.json ├── step-1.js └── step-2.js ├── hyperdrive ├── package-lock.json ├── package.json ├── step-1a.js ├── step-1b.js ├── step-2.js └── step-3.js └── hyperspace ├── 1-start-servers.js ├── 2-replicate-hypercores.js └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 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 | # Walkthroughs for the Hypercore Protocol 2 | Walkthroughs for the modules in the Hypercore Protocol stack. 3 | -------------------------------------------------------------------------------- /hyperbee/1a-basics.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk') 2 | const hypercore = require('hypercore') 3 | const ram = require('random-access-memory') 4 | const Hyperbee = require('hyperbee') 5 | 6 | start() 7 | 8 | async function start () { 9 | // A Hyperbee is stored as an embedded index within a single Hypercore. 10 | const core = hypercore(ram) 11 | 12 | // It accepts LevelDB-style key/value encoding options. 13 | const db = new Hyperbee(core, { 14 | keyEncoding: 'utf-8', 15 | valueEncoding: 'utf-8' 16 | }) 17 | await db.ready() 18 | 19 | // Key/value pairs can be inserted with the `put` method. 20 | await db.put('a', 'b') 21 | await db.put('c', 'd') 22 | 23 | // You can do large, bulk insertions with the `batch` method. 24 | // A Batch object mirrors the Hyperbee API. 25 | const b = db.batch() 26 | await b.put('e', 'f') 27 | await b.put('g', 'h') 28 | 29 | // When a batch is flushed, it's atomically committed to the Hyperbee. 30 | await b.flush() 31 | 32 | // KV-pairs can be deleted with the `del` method. 33 | await db.del('c') 34 | 35 | console.log(chalk.green('Reading KV-pairs with the \'get\' method:\n')) 36 | 37 | // KV-pairs can be read with the `get` method. 38 | console.log('Value for \'a\':', (await db.get('a')).value) 39 | console.log('Value for \'e\':', (await db.get('e')).value) 40 | console.log('Value for \'c\' (deleted):', await db.get('c')) 41 | 42 | console.log(chalk.green('\nReading KV-pairs with \'createReadStream\':\n')) 43 | 44 | // createReadStream can be used to yield KV-pairs in sorted order. 45 | // createReadStream returns a ReadableStream that supports async iteration. 46 | for await (const { key, value } of db.createReadStream()) { 47 | console.log(`${key} -> ${value}`) 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /hyperbee/1b-hyperspace.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk') 2 | const Hyperbee = require('hyperbee') 3 | const createHyperspaceSimulator = require('hyperspace/simulator') 4 | 5 | start() 6 | 7 | async function start () { 8 | // A Hyperbee can also be constructed with a RemoteHypercore instance. 9 | const { client, cleanup } = await createHyperspaceSimulator() 10 | const store = client.corestore('hyperbee-exercise') 11 | const core = store.get({ name: 'hyperbee-1' }) 12 | 13 | // It accepts LevelDB-style key/value encoding options. 14 | const db = new Hyperbee(core, { 15 | keyEncoding: 'utf-8', 16 | valueEncoding: 'utf-8' 17 | }) 18 | await db.ready() 19 | 20 | // Key/value pairs can be inserted with the `put` method. 21 | await db.put('a', 'b') 22 | await db.put('c', 'd') 23 | 24 | // You can do large, bulk insertions with the `batch` method. 25 | // A Batch object mirrors the Hyperbee API. 26 | const b = db.batch() 27 | await b.put('e', 'f') 28 | await b.put('g', 'h') 29 | 30 | // When a batch is flushed, it's atomically committed to the Hyperbee. 31 | await b.flush() 32 | 33 | // KV-pairs can be deleted with the `del` method. 34 | await db.del('c') 35 | 36 | console.log(chalk.green('Reading KV-pairs with the \'get\' method:\n')) 37 | 38 | // KV-pairs can be read with the `get` method. 39 | console.log('Value for \'a\':', (await db.get('a')).value) 40 | console.log('Value for \'e\':', (await db.get('e')).value) 41 | console.log('Value for \'c\' (deleted):', await db.get('c')) 42 | 43 | console.log(chalk.green('\nReading KV-pairs with \'createReadStream\':\n')) 44 | 45 | // createReadStream can be used to yield KV-pairs in sorted order. 46 | // createReadStream returns a ReadableStream that supports async iteration. 47 | for await (const { key, value } of db.createReadStream()) { 48 | console.log(`${key} -> ${value}`) 49 | } 50 | 51 | // Shut down the Hyperspace simulator. 52 | await cleanup() 53 | } 54 | -------------------------------------------------------------------------------- /hyperbee/2-iterators.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk') 2 | const hypercore = require('hypercore') 3 | const ram = require('random-access-memory') 4 | const Hyperbee = require('hyperbee') 5 | 6 | start() 7 | 8 | async function start () { 9 | // It accepts LevelDB-style key/value encoding options. 10 | const db = new Hyperbee(hypercore(ram), { 11 | keyEncoding: 'utf-8', 12 | valueEncoding: 'utf-8' 13 | }) 14 | await db.ready() 15 | 16 | // Let's insert a bunch of KV-pairs of the form 'a' -> 'a' etc. 17 | const keys = 'abcdefghijklmnopqrstuvwxyz' 18 | const b = db.batch() 19 | for (const char of keys) { 20 | await b.put(char, char) 21 | } 22 | await b.flush() 23 | 24 | // The createReadStream method accepts LevelDB-style gt, lt, gte, lte, limit, and reverse options. 25 | const streams = [ 26 | ['First 10', db.createReadStream({ limit: 10 })], 27 | ['Last 10, reversed', db.createReadStream({ limit: 10, reverse: true })], 28 | ['Between \'a\' and \'d\', non-inclusive', db.createReadStream({ gt: 'a', lt: 'd' })], 29 | ['Between \'a\' and \'d\', inclusive', db.createReadStream({ gte: 'a', lte: 'd' })], 30 | ['Between \'e\' and \'f\', inclusive, reversed', db.createReadStream({ gte: 'e', lte: 'f', reverse: true })] 31 | ] 32 | 33 | for (const [name, stream] of streams) { 34 | console.log(chalk.green('\n' + name + ':\n')) 35 | for await (const { key, value } of stream) { 36 | console.log(`${key} -> ${value}`) 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /hyperbee/3-diffs.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk') 2 | const hypercore = require('hypercore') 3 | const ram = require('random-access-memory') 4 | const Hyperbee = require('hyperbee') 5 | 6 | start() 7 | 8 | async function start () { 9 | const db = new Hyperbee(hypercore(ram), { 10 | keyEncoding: 'utf-8', 11 | valueEncoding: 'utf-8' 12 | }) 13 | await db.ready() 14 | 15 | // Let's insert a bunch of KV-pairs of the form 'a' -> 'a' etc. 16 | const keys = 'abcdefghijkl' 17 | for (const char of keys) { 18 | await db.put(char, char) 19 | console.log(`Version after inserting ${char}: ${db.version}`) 20 | } 21 | 22 | // The createDiffStream method allows us to observe differences between versions of the Hyperbee. 23 | // Let's see what's changed between the latest version, and version 9. 24 | console.log(chalk.green('\nDiff between the latest version, and version 9:\n')) 25 | for await (const { left, right } of db.createDiffStream(9)) { 26 | // Since we've only inserted values, `right` will always be null. 27 | console.log(`left -> ${left.key}, right -> ${right}`) 28 | } 29 | 30 | // Before modifying the database, let's record the current database version. 31 | const oldVersion = db.version 32 | 33 | // Now let's delete keys 'k' and 'l', insert key 'm', and modify 'a': 34 | await db.del('k') 35 | await db.del('l') 36 | await db.put('m', 'm') 37 | await db.put('a', 'new a') 38 | 39 | console.log(chalk.green('\nDiff after modifications:\n')) 40 | for await (const { left, right } of db.createDiffStream(oldVersion)) { 41 | // For keys 'k' and 'l', `right` is set because it's a deletion. 42 | // For 'm', `left` is set because it's a new insertion. 43 | // For 'a', both `left` and `right` are set because it's a modification 44 | console.log((`left -> ${left && left.key}, right -> ${right && right.key}`)) 45 | } 46 | 47 | // We can also check out a database snapshot for an old version 48 | // With the snapshot, we can re-create the original diff output. 49 | const snapshot = db.checkout(oldVersion) 50 | console.log(chalk.green('\nSnapshot diff to version 9:\n')) 51 | for await (const { left, right } of snapshot.createDiffStream(9)) { 52 | // Since we've only inserted values, `right` will always be null. 53 | console.log(`left -> ${left.key}, right -> ${right}`) 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /hyperbee/4-sub.js: -------------------------------------------------------------------------------- 1 | const ram = require('random-access-memory') 2 | const hypercore = require('hypercore') 3 | const Hyperbee = require('hyperbee') 4 | 5 | start() 6 | 7 | async function start () { 8 | const db = new Hyperbee(hypercore(ram), { 9 | keyEncoding: 'utf-8', 10 | valueEncoding: 'utf-8' 11 | }) 12 | 13 | // A sub-database will append a prefix to every key it inserts. 14 | // This prefix ensure that the sub acts as a separate "namespace" inside the parent db. 15 | const sub1 = db.sub('sub1') 16 | const sub2 = db.sub('sub2') 17 | 18 | await sub1.put('a', 'b') 19 | await sub2.put('c', 'd') 20 | 21 | for await (const { key, value } of sub1.createReadStream()) { 22 | console.log(`(sub1) ${key} -> ${value}`) 23 | } 24 | 25 | for await (const { key, value } of sub2.createReadStream()) { 26 | console.log(`(sub2) ${key} -> ${value}`) 27 | } 28 | 29 | // You can see the sub prefixes by iterating over the parent database. 30 | for await (const { key, value } of db.createReadStream()) { 31 | console.log(`(parent) ${key} -> ${value}`) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /hyperbee/5-leveldown.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk') 2 | const hypercore = require('hypercore') 3 | const ram = require('random-access-memory') 4 | const Hyperbee = require('hyperbee') 5 | const HyperbeeDown = require('hyperbeedown') 6 | const PouchDB = require('pouchdb') 7 | 8 | start() 9 | 10 | async function start () { 11 | const tree = new Hyperbee(hypercore(ram), { 12 | keyEncoding: 'utf-8' 13 | }) 14 | 15 | // With the addition of a small wrapper (hyperbeedown), Hyperbee supports the LevelDOWN interface. 16 | // It can be used as the storage backend for many modules in the LevelDB ecosystem. 17 | // In this example, we'll use it as the backend for PouchDB. 18 | const db = new PouchDB('my-database', { 19 | db: () => new HyperbeeDown(tree) 20 | }) 21 | 22 | // PouchDB is a document store, so we'll store and retrieve a simple record. 23 | await db.put({ _id: '1', hello: 'world' }) 24 | 25 | console.log(chalk.green('\nPouchDB Document 1:\n')) 26 | const doc = await db.get('1') 27 | console.log(chalk.blue(JSON.stringify(doc, null, 2))) 28 | } 29 | -------------------------------------------------------------------------------- /hyperbee/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hyperbee-walkthrough", 3 | "version": "1.0.0", 4 | "description": "P2P indexing with Hyperbee", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [ 10 | "hyperbee" 11 | ], 12 | "author": "Andrew Osheroff ", 13 | "license": "MIT", 14 | "dependencies": { 15 | "chalk": "^4.1.0", 16 | "hyperbee": "^1.1.1", 17 | "hyperbeedown": "^2.0.1", 18 | "hypercore": "^9.6.0", 19 | "hyperspace": "^3.18.0", 20 | "levelgraph": "^2.1.1", 21 | "pouchdb": "^7.2.2", 22 | "ram": "0.0.3" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /hypercore/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hypercore-walkthrough", 3 | "version": "1.0.0", 4 | "description": "Get started with Hypercore", 5 | "main": "index.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/andrewosh/hypercore-protocol-walkthroughs.git" 9 | }, 10 | "keywords": [ 11 | "hypercore", 12 | "walkthrough" 13 | ], 14 | "author": "Andrew Osheroff ", 15 | "license": "MIT", 16 | "bugs": { 17 | "url": "https://github.com/andrewosh/hypercore-protocol-walkthroughs/issues" 18 | }, 19 | "homepage": "https://github.com/andrewosh/hypercore-protocol-walkthroughs#readme", 20 | "dependencies": { 21 | "chalk": "^4.1.0", 22 | "hypercore": "^9.6.0", 23 | "hypercore-promisifier": "^1.0.3" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /hypercore/step-1.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk') 2 | const hypercore = require('hypercore') 3 | const { toPromises } = require('hypercore-promisifier') 4 | 5 | start() 6 | 7 | async function start () { 8 | 9 | // Step 1: Create our initial Hypercore. 10 | console.log(chalk.green('Step 1: Create the initial Hypercore\n')) 11 | 12 | // Create our first Hypercore, saving blocks to the 'main' directory. 13 | // We'll wrap it in a Promises interface, to make the walkthrough more readable. 14 | const core = toPromises(hypercore('./main', { 15 | valueEncoding: 'utf-8' // The blocks will be UTF-8 strings. 16 | })) 17 | 18 | // Append two new blocks to the core. 19 | await core.append(['hello', 'world']) 20 | 21 | // After the append, we can see that the length has updated. 22 | console.log('Length of the first core:', core.length) // Will be 2. 23 | 24 | // And we can read out the blocks. 25 | console.log('First block:', await core.get(0)) // 'hello' 26 | console.log('Second block:', await core.get(1)) // 'world' 27 | } 28 | 29 | -------------------------------------------------------------------------------- /hypercore/step-2.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk') 2 | const hypercore = require('hypercore') 3 | const { toPromises } = require('hypercore-promisifier') 4 | 5 | start() 6 | 7 | async function start () { 8 | 9 | // Step 1: Create our initial Hypercore. 10 | console.log(chalk.green('Step 1: Create the initial Hypercore\n')) 11 | 12 | // Create our first Hypercore, saving blocks to the 'main' directory. 13 | // We'll wrap it in a Promises interface, to make the walkthrough more readable. 14 | const core = toPromises(hypercore('./main', { 15 | valueEncoding: 'utf-8' // The blocks will be UTF-8 strings. 16 | })) 17 | 18 | // Append two new blocks to the core. 19 | await core.append(['hello', 'world']) 20 | 21 | // After the append, we can see that the length has updated. 22 | console.log('Length of the first core:', core.length) // Will be 2. 23 | 24 | // And we can read out the blocks. 25 | console.log('First block:', await core.get(0)) // 'hello' 26 | console.log('Second block:', await core.get(1)) // 'world' 27 | 28 | // Step 2: Create a read-only clone (this would typically be done by another peer) 29 | console.log(chalk.green('\nStep 2: Create a read-only clone\n')) 30 | 31 | // Create a clone of the first Hypercore by creating a new core with the first's public key. 32 | // This would typically be done by a different peer. 33 | // This clone is not writable, since it doesn't have access to the first core's private key. 34 | const clone = toPromises(hypercore('./clone', core.key, { 35 | valueEncoding: 'utf-8', 36 | sparse: true, // When replicating, don't eagerly download all blocks. 37 | })) 38 | 39 | // A Hypercore can be replicated over any Node.js stream. 40 | // The replication stream is E2E encrypted with the NOISE protocol. 41 | // We'll use live replication, meaning the streams will continue replicating indefinitely. 42 | const firstStream = core.replicate(true, { live: true }) 43 | const cloneStream = clone.replicate(false, { live: true }) 44 | 45 | // Pipe the stream together to begin replicating. 46 | firstStream.pipe(cloneStream).pipe(firstStream) 47 | 48 | // Now we can read blocks from the clone. 49 | // Note that these blocks will be downloaded lazily, when each one requested. 50 | console.log('First clone block:', await clone.get(0)) // 'hello' 51 | console.log('Second clone block:', await clone.get(1)) // 'world' 52 | 53 | for (let i = 0; i < 100; i++) { 54 | await core.append(`New Block ${i}`) 55 | } 56 | await clone.update() 57 | console.log(`Last Block (${clone.length - 1}):`, await clone.get(clone.length - 1)) 58 | } 59 | -------------------------------------------------------------------------------- /hyperdrive/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hyperdrive-walkthrough", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@corestore/networker": { 8 | "version": "1.0.4", 9 | "resolved": "https://registry.npmjs.org/@corestore/networker/-/networker-1.0.4.tgz", 10 | "integrity": "sha512-pBpvbWp4Zl+0K4ICSwhMjNCT09EvZvVMUf086WJA/d3htu9WkXXfuPg0JSuYRHyQ5LlHzyr1cbnCxoDh1Ol7Rw==", 11 | "requires": { 12 | "call-me-maybe": "^1.0.1", 13 | "codecs": "^2.1.0", 14 | "hypercore-protocol": "^8.0.0", 15 | "hyperswarm": "^2.14.1", 16 | "nanoresource-promise": "^1.2.2", 17 | "pump": "^3.0.0" 18 | } 19 | }, 20 | "@hyperspace/client": { 21 | "version": "1.18.0", 22 | "resolved": "https://registry.npmjs.org/@hyperspace/client/-/client-1.18.0.tgz", 23 | "integrity": "sha512-nK7jQ8IvrHwaF8gycCuqnNm1nOukzFJxDHZcVZ9Yx1O42zgynDVjDVNFa/scOW2sCAIDAnQrAI6wO4ClrtEYfQ==", 24 | "requires": { 25 | "@hyperspace/rpc": "^1.8.0", 26 | "call-me-maybe": "^1.0.1", 27 | "codecs": "^2.1.0", 28 | "freemap": "^1.0.0", 29 | "hypercore-streams": "^1.0.0", 30 | "inspect-custom-symbol": "^1.1.1", 31 | "nanoresource-promise": "^1.2.2" 32 | } 33 | }, 34 | "@hyperspace/migration-tool": { 35 | "version": "1.2.1", 36 | "resolved": "https://registry.npmjs.org/@hyperspace/migration-tool/-/migration-tool-1.2.1.tgz", 37 | "integrity": "sha512-akc8pVshSwrkJsPkpWZzCbIYr5xiXoBZk9DIBAa15DUFo/y2B9eeXDiivDEVWp5tWH9cydUpzLR0XbCUojxr9A==", 38 | "requires": { 39 | "@hyperspace/client": "^1.0.0", 40 | "buffer-json-encoding": "^1.0.2", 41 | "hyperspace": "^3.0.0", 42 | "level": "^6.0.1", 43 | "stream-collector": "^1.0.1", 44 | "subleveldown": "^5.0.0" 45 | } 46 | }, 47 | "@hyperspace/rpc": { 48 | "version": "1.15.0", 49 | "resolved": "https://registry.npmjs.org/@hyperspace/rpc/-/rpc-1.15.0.tgz", 50 | "integrity": "sha512-C5AzqV8beFWLPNbRiriXRohelodrqNP0MgjR9uE7kp7w9yn0ubf4e+qxtRQVlVb7OON/+SQz4tjlyMXBxWoKSA==", 51 | "requires": { 52 | "hrpc-runtime": "^2.0.0" 53 | } 54 | }, 55 | "@hyperswarm/dht": { 56 | "version": "4.0.1", 57 | "resolved": "https://registry.npmjs.org/@hyperswarm/dht/-/dht-4.0.1.tgz", 58 | "integrity": "sha512-wMBbz0m8rgQMERt/Ot6BGo5Y8+ovJSZmqxF0oA2xYPT8vCVBIr8g2F1BkQcLbX2iKRLXRnhic02OEq8b41M0sw==", 59 | "requires": { 60 | "@hyperswarm/hypersign": "^2.0.0", 61 | "dht-rpc": "^4.8.0", 62 | "end-of-stream": "^1.4.1", 63 | "guard-timeout": "^2.0.0", 64 | "hashlru": "^2.3.0", 65 | "protocol-buffers-encodings": "^1.1.0", 66 | "record-cache": "^1.1.0", 67 | "sodium-native": "^3.1.1" 68 | } 69 | }, 70 | "@hyperswarm/discovery": { 71 | "version": "2.0.1", 72 | "resolved": "https://registry.npmjs.org/@hyperswarm/discovery/-/discovery-2.0.1.tgz", 73 | "integrity": "sha512-LM0DxxXYFEOZoUhN4g9VhHKGeM2mQIf8rnfSu/epBLmASAKNoKMijgGUZwhrh06wPROdBSJumjVzKl+8GPnRhA==", 74 | "requires": { 75 | "@hyperswarm/dht": "^4.0.0", 76 | "multicast-dns": "^7.2.2", 77 | "timeout-refresh": "^1.0.2" 78 | } 79 | }, 80 | "@hyperswarm/hypersign": { 81 | "version": "2.1.1", 82 | "resolved": "https://registry.npmjs.org/@hyperswarm/hypersign/-/hypersign-2.1.1.tgz", 83 | "integrity": "sha512-RcczqJsu2VScRoyJdLbxpYMBNq+73HJT3FVzDZXSOob/WqEeiN2WIvuDtvmFoufAuO/3YVfde/NpZFc/OPjmjw==", 84 | "requires": { 85 | "sodium-native": "^3.1.1" 86 | } 87 | }, 88 | "@hyperswarm/network": { 89 | "version": "2.1.0", 90 | "resolved": "https://registry.npmjs.org/@hyperswarm/network/-/network-2.1.0.tgz", 91 | "integrity": "sha512-TvRRRd//a3q+JhpSh5PaHJfnP4oLM/0eZikyDh2Z+eaJpIZP+vZwdlpPd10neTsPq1zfJX8weRjYLFHNpoMZVg==", 92 | "requires": { 93 | "@hyperswarm/discovery": "^2.0.0", 94 | "nanoresource": "^1.3.0", 95 | "utp-native": "^2.2.1" 96 | } 97 | }, 98 | "abstract-extension": { 99 | "version": "3.1.1", 100 | "resolved": "https://registry.npmjs.org/abstract-extension/-/abstract-extension-3.1.1.tgz", 101 | "integrity": "sha512-qmUIqQEh6ZZBKN6JfysKgCEBqI4qVexE6/N/MUJjqtQhhuGR8a16GKnK6SGFKv/n1cAlbYxLDXbtyhkxSnVYRQ==", 102 | "requires": { 103 | "codecs": "^2.0.0" 104 | } 105 | }, 106 | "abstract-leveldown": { 107 | "version": "6.2.3", 108 | "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", 109 | "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", 110 | "requires": { 111 | "buffer": "^5.5.0", 112 | "immediate": "^3.2.3", 113 | "level-concat-iterator": "~2.0.0", 114 | "level-supports": "~1.0.0", 115 | "xtend": "~4.0.0" 116 | } 117 | }, 118 | "ansi-styles": { 119 | "version": "4.3.0", 120 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 121 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 122 | "requires": { 123 | "color-convert": "^2.0.1" 124 | } 125 | }, 126 | "arpeecee": { 127 | "version": "2.1.1", 128 | "resolved": "https://registry.npmjs.org/arpeecee/-/arpeecee-2.1.1.tgz", 129 | "integrity": "sha512-FA+P6no8f5dNpiANB4fcf2SNUSbILLfvy8L9gWDppMIzwDFDe2eWSmVzb9UrlautaxpkEr4Og5H7jFWtUd9x8g==", 130 | "requires": { 131 | "streamx": "^2.6.0", 132 | "varint": "^5.0.0" 133 | } 134 | }, 135 | "array-lru": { 136 | "version": "1.1.1", 137 | "resolved": "https://registry.npmjs.org/array-lru/-/array-lru-1.1.1.tgz", 138 | "integrity": "sha1-DH4bTgIq4Wb/HoRIxZXzGB/NMzc=" 139 | }, 140 | "atomic-batcher": { 141 | "version": "1.0.2", 142 | "resolved": "https://registry.npmjs.org/atomic-batcher/-/atomic-batcher-1.0.2.tgz", 143 | "integrity": "sha1-0WkB0QzOxZUWwZe5zNiTBom4E7Q=" 144 | }, 145 | "base64-js": { 146 | "version": "1.5.1", 147 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 148 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 149 | }, 150 | "bitfield-rle": { 151 | "version": "2.2.1", 152 | "resolved": "https://registry.npmjs.org/bitfield-rle/-/bitfield-rle-2.2.1.tgz", 153 | "integrity": "sha512-wrDhHe7LUkqaytxgbsFXoemzHRv6e8FrVNWWsQCgUfmuVYW6ke44hoGc9VdpjgfIsJ/ejmCFA8wDtDqACNAvyw==", 154 | "requires": { 155 | "buffer-alloc-unsafe": "^1.1.0", 156 | "varint": "^4.0.0" 157 | }, 158 | "dependencies": { 159 | "varint": { 160 | "version": "4.0.1", 161 | "resolved": "https://registry.npmjs.org/varint/-/varint-4.0.1.tgz", 162 | "integrity": "sha1-SQgpuULSSEY7KzUJeZXDv3NxmOk=" 163 | } 164 | } 165 | }, 166 | "blake2b": { 167 | "version": "2.1.3", 168 | "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.3.tgz", 169 | "integrity": "sha512-pkDss4xFVbMb4270aCyGD3qLv92314Et+FsKzilCLxDz5DuZ2/1g3w4nmBbu6nKApPspnjG7JcwTjGZnduB1yg==", 170 | "requires": { 171 | "blake2b-wasm": "^1.1.0", 172 | "nanoassert": "^1.0.0" 173 | } 174 | }, 175 | "blake2b-universal": { 176 | "version": "1.0.1", 177 | "resolved": "https://registry.npmjs.org/blake2b-universal/-/blake2b-universal-1.0.1.tgz", 178 | "integrity": "sha512-vmMqpF8E9RCde8/+Su/s2rZRxOBwAYQsTyCgok4kLWhWrzMrX0CzID6pVheNJSESY0S0FNTOG4QfRJqnSLOjFA==", 179 | "requires": { 180 | "blake2b": "^2.1.3", 181 | "sodium-native": "^3.0.1" 182 | } 183 | }, 184 | "blake2b-wasm": { 185 | "version": "1.1.7", 186 | "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-1.1.7.tgz", 187 | "integrity": "sha512-oFIHvXhlz/DUgF0kq5B1CqxIDjIJwh9iDeUUGQUcvgiGz7Wdw03McEO7CfLBy7QKGdsydcMCgO9jFNBAFCtFcA==", 188 | "requires": { 189 | "nanoassert": "^1.0.0" 190 | } 191 | }, 192 | "buffer": { 193 | "version": "5.7.1", 194 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 195 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 196 | "requires": { 197 | "base64-js": "^1.3.1", 198 | "ieee754": "^1.1.13" 199 | } 200 | }, 201 | "buffer-alloc": { 202 | "version": "1.2.0", 203 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 204 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 205 | "requires": { 206 | "buffer-alloc-unsafe": "^1.1.0", 207 | "buffer-fill": "^1.0.0" 208 | } 209 | }, 210 | "buffer-alloc-unsafe": { 211 | "version": "1.1.0", 212 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 213 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" 214 | }, 215 | "buffer-fill": { 216 | "version": "1.0.0", 217 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 218 | "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" 219 | }, 220 | "buffer-from": { 221 | "version": "1.1.1", 222 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 223 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 224 | }, 225 | "buffer-json": { 226 | "version": "2.0.0", 227 | "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", 228 | "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==" 229 | }, 230 | "buffer-json-encoding": { 231 | "version": "1.0.2", 232 | "resolved": "https://registry.npmjs.org/buffer-json-encoding/-/buffer-json-encoding-1.0.2.tgz", 233 | "integrity": "sha512-zH4Q0aqJnv0xPVX+Imcp+EbiyYg9xq7//mvShmQ08E6wC1EeYg2+1OG2n9EEu0rfiuYjP+j5LsSmQVufdqflrg==", 234 | "requires": { 235 | "buffer-json": "^2.0.0" 236 | } 237 | }, 238 | "bulk-write-stream": { 239 | "version": "1.1.4", 240 | "resolved": "https://registry.npmjs.org/bulk-write-stream/-/bulk-write-stream-1.1.4.tgz", 241 | "integrity": "sha512-GtKwd/4etuk1hNeprXoESBO1RSeRYJMXKf+O0qHmWdUomLT8ysNEfX/4bZFXr3BK6eukpHiEnhY2uMtEHDM2ng==", 242 | "requires": { 243 | "buffer-from": "^1.0.0", 244 | "inherits": "^2.0.1", 245 | "readable-stream": "^2.1.4" 246 | }, 247 | "dependencies": { 248 | "isarray": { 249 | "version": "1.0.0", 250 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 251 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 252 | }, 253 | "readable-stream": { 254 | "version": "2.3.7", 255 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 256 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 257 | "requires": { 258 | "core-util-is": "~1.0.0", 259 | "inherits": "~2.0.3", 260 | "isarray": "~1.0.0", 261 | "process-nextick-args": "~2.0.0", 262 | "safe-buffer": "~5.1.1", 263 | "string_decoder": "~1.1.1", 264 | "util-deprecate": "~1.0.1" 265 | } 266 | }, 267 | "safe-buffer": { 268 | "version": "5.1.2", 269 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 270 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 271 | }, 272 | "string_decoder": { 273 | "version": "1.1.1", 274 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 275 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 276 | "requires": { 277 | "safe-buffer": "~5.1.0" 278 | } 279 | } 280 | } 281 | }, 282 | "byte-stream": { 283 | "version": "2.1.0", 284 | "resolved": "https://registry.npmjs.org/byte-stream/-/byte-stream-2.1.0.tgz", 285 | "integrity": "sha1-Mu7LpiU4IdaVELnPNLMVzj5Vsxo=", 286 | "requires": { 287 | "debug": "^1.0.4", 288 | "readable-stream": "~1.1.10" 289 | } 290 | }, 291 | "call-me-maybe": { 292 | "version": "1.0.1", 293 | "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", 294 | "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" 295 | }, 296 | "chacha20-universal": { 297 | "version": "1.0.4", 298 | "resolved": "https://registry.npmjs.org/chacha20-universal/-/chacha20-universal-1.0.4.tgz", 299 | "integrity": "sha512-/IOxdWWNa7nRabfe7+oF+jVkGjlr2xUL4J8l/OvzZhj+c9RpMqoo3Dq+5nU1j/BflRV4BKnaQ4+4oH1yBpQG1Q==", 300 | "requires": { 301 | "nanoassert": "^2.0.0" 302 | }, 303 | "dependencies": { 304 | "nanoassert": { 305 | "version": "2.0.0", 306 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", 307 | "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" 308 | } 309 | } 310 | }, 311 | "chalk": { 312 | "version": "4.1.0", 313 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 314 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 315 | "requires": { 316 | "ansi-styles": "^4.1.0", 317 | "supports-color": "^7.1.0" 318 | } 319 | }, 320 | "clone": { 321 | "version": "2.1.2", 322 | "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", 323 | "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" 324 | }, 325 | "codecs": { 326 | "version": "2.2.0", 327 | "resolved": "https://registry.npmjs.org/codecs/-/codecs-2.2.0.tgz", 328 | "integrity": "sha512-+xi2ENsvchtUNa8oBUU58gHgmyN6BEEeZ8NIEgeQ0XnC+AoyihivgZYe+OOiNi+fLy/NUowugwV5gP8XWYDm0Q==" 329 | }, 330 | "color-convert": { 331 | "version": "2.0.1", 332 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 333 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 334 | "requires": { 335 | "color-name": "~1.1.4" 336 | } 337 | }, 338 | "color-name": { 339 | "version": "1.1.4", 340 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 341 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 342 | }, 343 | "core-util-is": { 344 | "version": "1.0.2", 345 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 346 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 347 | }, 348 | "corestore": { 349 | "version": "5.8.2", 350 | "resolved": "https://registry.npmjs.org/corestore/-/corestore-5.8.2.tgz", 351 | "integrity": "sha512-8OJyqGo1m3PyVvQtUoVcKYz4m4QoBAJE/2rNMJ8SD/U03NGD1z1cYep/n/32I0f3IbujYP5+4lIfBMIDkasB2w==", 352 | "requires": { 353 | "call-me-maybe": "^1.0.1", 354 | "dat-encoding": "^5.0.1", 355 | "derive-key": "^1.0.0", 356 | "derived-key-storage": "^2.1.0", 357 | "fd-lock": "^1.0.2", 358 | "hypercore": "^9.0.0", 359 | "hypercore-crypto": "^2.0.0", 360 | "hypercore-protocol": "^8.0.0", 361 | "nanoresource": "^1.3.0", 362 | "refpool": "^1.2.0" 363 | } 364 | }, 365 | "count-trailing-zeros": { 366 | "version": "1.0.1", 367 | "resolved": "https://registry.npmjs.org/count-trailing-zeros/-/count-trailing-zeros-1.0.1.tgz", 368 | "integrity": "sha1-q6bFgzvkENRbHso+bVg4RM5oLHc=" 369 | }, 370 | "custom-error-class": { 371 | "version": "1.0.0", 372 | "resolved": "https://registry.npmjs.org/custom-error-class/-/custom-error-class-1.0.0.tgz", 373 | "integrity": "sha512-bHT5BAycUbsHYexiPuoIEM/o770u48yWBrZHw/f+BRVkERn19xTgNwcHt79A/AYMxUcOfPjb9OrKoj6rVvPJuA==" 374 | }, 375 | "dat-encoding": { 376 | "version": "5.0.1", 377 | "resolved": "https://registry.npmjs.org/dat-encoding/-/dat-encoding-5.0.1.tgz", 378 | "integrity": "sha512-PET9PlGt6ejgqU07hbPLx3tP2siDMMFumUe+xwmm4+5W+0cOlpzreCPoMVUBzxWeR4sPdxL+AS53odQTBtzEqA==", 379 | "requires": { 380 | "safe-buffer": "^5.0.1" 381 | } 382 | }, 383 | "debug": { 384 | "version": "1.0.5", 385 | "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.5.tgz", 386 | "integrity": "sha1-9yQSF0MPmd7EwrRz6rkiKOh0wqw=", 387 | "requires": { 388 | "ms": "2.0.0" 389 | } 390 | }, 391 | "deferred-leveldown": { 392 | "version": "5.3.0", 393 | "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", 394 | "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", 395 | "requires": { 396 | "abstract-leveldown": "~6.2.1", 397 | "inherits": "^2.0.3" 398 | } 399 | }, 400 | "defined": { 401 | "version": "0.0.0", 402 | "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", 403 | "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=" 404 | }, 405 | "derive-key": { 406 | "version": "1.0.1", 407 | "resolved": "https://registry.npmjs.org/derive-key/-/derive-key-1.0.1.tgz", 408 | "integrity": "sha512-7DHGLGvxFF8umw8NEGH3n9KKgEN8duk4Fiy4WmN3QgNKEogDhaNIsTDd5JVN7ilB8xw4ike1Q08z8UJSJ7hebA==", 409 | "requires": { 410 | "blake2b-universal": "^1.0.0" 411 | } 412 | }, 413 | "derived-key-storage": { 414 | "version": "2.1.0", 415 | "resolved": "https://registry.npmjs.org/derived-key-storage/-/derived-key-storage-2.1.0.tgz", 416 | "integrity": "sha512-4RKKrpf2YouCASaRHqUvyxtHABGLH7UJWNXPjsJxMvzCj4tettUvuyGsmP2/mpGYhSda7caZkS2oP4rqWjgkZg==", 417 | "requires": { 418 | "random-access-storage": "^1.4.0", 419 | "thunky": "^1.0.3", 420 | "varint": "^5.0.0" 421 | } 422 | }, 423 | "dht-rpc": { 424 | "version": "4.9.6", 425 | "resolved": "https://registry.npmjs.org/dht-rpc/-/dht-rpc-4.9.6.tgz", 426 | "integrity": "sha512-gzZPsesqOh0Lj0GxjbNhPe42tppSt9qpcMXifcwtr2i3WnhgyhjlXTFrq/po9kl4X98M7+RxwmzpXzPt7hcXwA==", 427 | "requires": { 428 | "blake2b-universal": "^1.0.0", 429 | "codecs": "^2.0.0", 430 | "ipv4-peers": "^2.0.0", 431 | "k-bucket": "^5.0.0", 432 | "protocol-buffers-encodings": "^1.1.0", 433 | "sodium-native": "^3.1.1", 434 | "speedometer": "^1.1.0", 435 | "stream-collector": "^1.0.1", 436 | "time-ordered-set": "^1.0.1", 437 | "xor-distance": "^2.0.0" 438 | } 439 | }, 440 | "dns-packet": { 441 | "version": "4.2.0", 442 | "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-4.2.0.tgz", 443 | "integrity": "sha512-bn1AKpfkFbm0MIioOMHZ5qJzl2uypdBwI4nYNsqvhjsegBhcKJUlCrMPWLx6JEezRjxZmxhtIz/FkBEur2l8Cw==", 444 | "requires": { 445 | "ip": "^1.1.5", 446 | "safe-buffer": "^5.1.1" 447 | } 448 | }, 449 | "duplexify": { 450 | "version": "3.7.1", 451 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", 452 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", 453 | "requires": { 454 | "end-of-stream": "^1.0.0", 455 | "inherits": "^2.0.1", 456 | "readable-stream": "^2.0.0", 457 | "stream-shift": "^1.0.0" 458 | }, 459 | "dependencies": { 460 | "isarray": { 461 | "version": "1.0.0", 462 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 463 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 464 | }, 465 | "readable-stream": { 466 | "version": "2.3.7", 467 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 468 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 469 | "requires": { 470 | "core-util-is": "~1.0.0", 471 | "inherits": "~2.0.3", 472 | "isarray": "~1.0.0", 473 | "process-nextick-args": "~2.0.0", 474 | "safe-buffer": "~5.1.1", 475 | "string_decoder": "~1.1.1", 476 | "util-deprecate": "~1.0.1" 477 | } 478 | }, 479 | "safe-buffer": { 480 | "version": "5.1.2", 481 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 482 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 483 | }, 484 | "string_decoder": { 485 | "version": "1.1.1", 486 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 487 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 488 | "requires": { 489 | "safe-buffer": "~5.1.0" 490 | } 491 | } 492 | } 493 | }, 494 | "encoding-down": { 495 | "version": "6.3.0", 496 | "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", 497 | "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", 498 | "requires": { 499 | "abstract-leveldown": "^6.2.1", 500 | "inherits": "^2.0.3", 501 | "level-codec": "^9.0.0", 502 | "level-errors": "^2.0.0" 503 | } 504 | }, 505 | "end-of-stream": { 506 | "version": "1.4.4", 507 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 508 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 509 | "requires": { 510 | "once": "^1.4.0" 511 | } 512 | }, 513 | "errno": { 514 | "version": "0.1.8", 515 | "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", 516 | "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", 517 | "requires": { 518 | "prr": "~1.0.1" 519 | } 520 | }, 521 | "fast-bitfield": { 522 | "version": "1.2.2", 523 | "resolved": "https://registry.npmjs.org/fast-bitfield/-/fast-bitfield-1.2.2.tgz", 524 | "integrity": "sha512-t8HYqkuE3YEqNcyWlAfh55479aTxO+GpYwvQvJppYqyBfSmRdNIhzY2m09FKN/MENTzq4wH6heHOIvsPyMAwvQ==", 525 | "requires": { 526 | "count-trailing-zeros": "^1.0.1" 527 | } 528 | }, 529 | "fast-fifo": { 530 | "version": "1.0.0", 531 | "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.0.0.tgz", 532 | "integrity": "sha512-4VEXmjxLj7sbs8J//cn2qhRap50dGzF5n8fjay8mau+Jn4hxSeR3xPFwxMaQq/pDaq7+KQk0PAbC2+nWDkJrmQ==" 533 | }, 534 | "fd-lock": { 535 | "version": "1.1.1", 536 | "resolved": "https://registry.npmjs.org/fd-lock/-/fd-lock-1.1.1.tgz", 537 | "integrity": "sha512-Ng+IXbq6LPMDvvVb0Vr325NjqhPwqlLIvmf43ii7t3WQvo2sHU6V6jQY1cclflxPaPfvNUAuD5VdPuIO1sp50g==", 538 | "requires": { 539 | "napi-macros": "^2.0.0", 540 | "node-gyp-build": "^4.2.2" 541 | } 542 | }, 543 | "filesystem-constants": { 544 | "version": "1.0.0", 545 | "resolved": "https://registry.npmjs.org/filesystem-constants/-/filesystem-constants-1.0.0.tgz", 546 | "integrity": "sha512-/ue62eYa8Mk53dc1XXxT1nhwat3ygWMepjrFON8tBVjtjCTVUzM8JTEAQquNoZnmimM4dbxfV9tZeEav1KUccg==" 547 | }, 548 | "flat-tree": { 549 | "version": "1.8.0", 550 | "resolved": "https://registry.npmjs.org/flat-tree/-/flat-tree-1.8.0.tgz", 551 | "integrity": "sha512-VIdjqvARJGq1V+EhT18prwhrR4McbY2M6iH1vyKTgewfQtpyd1jhLXcnQJFZZDKBhpJM8zCB2kLQEiy51bhcOw==" 552 | }, 553 | "freemap": { 554 | "version": "1.0.1", 555 | "resolved": "https://registry.npmjs.org/freemap/-/freemap-1.0.1.tgz", 556 | "integrity": "sha512-14wmuUdlwYz3KrXwbtHe30k4oHnpDQjFrbx3GIkqZjE64hpwa6WDpvs/8p+08kZbhnip49Z58PX8t08E3H8m1g==" 557 | }, 558 | "function-bind": { 559 | "version": "1.1.1", 560 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 561 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 562 | }, 563 | "generate-function": { 564 | "version": "2.3.1", 565 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", 566 | "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", 567 | "requires": { 568 | "is-property": "^1.0.2" 569 | } 570 | }, 571 | "generate-object-property": { 572 | "version": "1.2.0", 573 | "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", 574 | "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", 575 | "requires": { 576 | "is-property": "^1.0.0" 577 | } 578 | }, 579 | "guard-timeout": { 580 | "version": "2.0.0", 581 | "resolved": "https://registry.npmjs.org/guard-timeout/-/guard-timeout-2.0.0.tgz", 582 | "integrity": "sha512-35geHv72oal0cRUE5t1tZ5KHm3OVPXzFtiMG8AnRPV5FkkEf84RUpeQ0BCeCZunfSLGATW5ZVyALhJKgM7I/6A==" 583 | }, 584 | "has": { 585 | "version": "1.0.3", 586 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 587 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 588 | "requires": { 589 | "function-bind": "^1.1.1" 590 | } 591 | }, 592 | "has-flag": { 593 | "version": "4.0.0", 594 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 595 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 596 | }, 597 | "hashlru": { 598 | "version": "2.3.0", 599 | "resolved": "https://registry.npmjs.org/hashlru/-/hashlru-2.3.0.tgz", 600 | "integrity": "sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==" 601 | }, 602 | "hmac-blake2b": { 603 | "version": "2.0.0", 604 | "resolved": "https://registry.npmjs.org/hmac-blake2b/-/hmac-blake2b-2.0.0.tgz", 605 | "integrity": "sha512-JbGNtM1YRd8EQH/2vNTAP1oy5lJVPlBFYZfCJTu3k8sqOUm0rRIf/3+MCd5noVykETwTbun6jEOc+4Tu78ubHA==", 606 | "requires": { 607 | "nanoassert": "^1.1.0", 608 | "sodium-native": "^3.1.1", 609 | "sodium-universal": "^3.0.0" 610 | } 611 | }, 612 | "hrpc-runtime": { 613 | "version": "2.1.1", 614 | "resolved": "https://registry.npmjs.org/hrpc-runtime/-/hrpc-runtime-2.1.1.tgz", 615 | "integrity": "sha512-L9fSE/eMnJat/9TtlOVKFAiw2SlvB5RH/QbtSaNcYW/oWX1lBxwdrVTTcNOCWnSNLhDBgg5llxj9oM2SACB8WA==", 616 | "requires": { 617 | "arpeecee": "^2.0.0", 618 | "protocol-buffers-encodings": "^1.1.0" 619 | } 620 | }, 621 | "hypercore": { 622 | "version": "9.6.0", 623 | "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-9.6.0.tgz", 624 | "integrity": "sha512-eBHWEYzG6UL27VYYS+AgEsYdppp7NohUdzQK6XNoi5dBmDS1yD+SoWwBoUbX4vRJlE+MfONt9wJ9QdHYXGdliQ==", 625 | "requires": { 626 | "abstract-extension": "^3.0.1", 627 | "atomic-batcher": "^1.0.2", 628 | "bitfield-rle": "^2.2.1", 629 | "codecs": "^2.0.0", 630 | "fast-bitfield": "^1.2.2", 631 | "fd-lock": "^1.0.2", 632 | "flat-tree": "^1.6.0", 633 | "hypercore-cache": "^1.0.1", 634 | "hypercore-crypto": "^2.0.0", 635 | "hypercore-protocol": "^8.0.5", 636 | "hypercore-streams": "^1.0.1", 637 | "inherits": "^2.0.3", 638 | "inspect-custom-symbol": "^1.1.0", 639 | "last-one-wins": "^1.0.4", 640 | "memory-pager": "^1.0.2", 641 | "merkle-tree-stream": "^4.0.0", 642 | "nanoguard": "^1.2.0", 643 | "nanoresource": "^1.3.0", 644 | "pretty-hash": "^1.0.1", 645 | "random-access-file": "^2.1.0", 646 | "sparse-bitfield": "^3.0.0", 647 | "timeout-refresh": "^1.0.3", 648 | "uint64be": "^2.0.1", 649 | "unordered-array-remove": "^1.0.2", 650 | "unordered-set": "^2.0.0" 651 | } 652 | }, 653 | "hypercore-byte-stream": { 654 | "version": "1.0.12", 655 | "resolved": "https://registry.npmjs.org/hypercore-byte-stream/-/hypercore-byte-stream-1.0.12.tgz", 656 | "integrity": "sha512-JnpLfCkvH9EPRZ8JXLBUAXo+L2wRQ504yWTwtveH+cSwwx0E8I2dbxXvNIsYGDeghOlX3hka0Ng3GiYI0risZw==", 657 | "requires": { 658 | "readable-stream": "^3.1.1" 659 | }, 660 | "dependencies": { 661 | "readable-stream": { 662 | "version": "3.6.0", 663 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 664 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 665 | "requires": { 666 | "inherits": "^2.0.3", 667 | "string_decoder": "^1.1.1", 668 | "util-deprecate": "^1.0.1" 669 | } 670 | }, 671 | "string_decoder": { 672 | "version": "1.3.0", 673 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 674 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 675 | "requires": { 676 | "safe-buffer": "~5.2.0" 677 | } 678 | } 679 | } 680 | }, 681 | "hypercore-cache": { 682 | "version": "1.0.2", 683 | "resolved": "https://registry.npmjs.org/hypercore-cache/-/hypercore-cache-1.0.2.tgz", 684 | "integrity": "sha512-AJ/q7y6EOrXnOH/4+DVcfDygsh1ZXMRGvNc67GBNqwCt22oSCOWhRI6EJ+3HEJciM9M2oSm1WX3qg6kgRhT/Gw==" 685 | }, 686 | "hypercore-crypto": { 687 | "version": "2.2.0", 688 | "resolved": "https://registry.npmjs.org/hypercore-crypto/-/hypercore-crypto-2.2.0.tgz", 689 | "integrity": "sha512-YawYfsZl0RfKByNwir3ToNeGfKL4KVgEEQ/E/ZVLvYby+ayQ9wmNtqZlyW63YY9vdZ1d0i8WuYZnHb3H3z8qOQ==", 690 | "requires": { 691 | "sodium-universal": "^3.0.0", 692 | "uint64be": "^3.0.0" 693 | }, 694 | "dependencies": { 695 | "uint64be": { 696 | "version": "3.0.0", 697 | "resolved": "https://registry.npmjs.org/uint64be/-/uint64be-3.0.0.tgz", 698 | "integrity": "sha512-mliiCSrsE29aNBI7O9W5gGv6WmA9kBR8PtTt6Apaxns076IRdYrrtFhXHEWMj5CSum3U7cv7/pi4xmi4XsIOqg==" 699 | } 700 | } 701 | }, 702 | "hypercore-default-storage": { 703 | "version": "1.0.0", 704 | "resolved": "https://registry.npmjs.org/hypercore-default-storage/-/hypercore-default-storage-1.0.0.tgz", 705 | "integrity": "sha512-vLRmaaFpbksg6k5ZktrvquMGLVRu9x+8GDoKL+J7HL5OLRsfgwsfXOm6MiOqi0qTlb5mZgcbmbPTXC3DAWCu0A==", 706 | "requires": { 707 | "fd-lock": "^1.0.2", 708 | "random-access-file": "^2.1.3" 709 | } 710 | }, 711 | "hypercore-protocol": { 712 | "version": "8.0.7", 713 | "resolved": "https://registry.npmjs.org/hypercore-protocol/-/hypercore-protocol-8.0.7.tgz", 714 | "integrity": "sha512-b5TXhqXUZ+Z7M/5/PlCTgElfufDRa3EzACd7y7BA7owLkxQreaUQ58wUO7nzJppDP1bnC2Hz6Hg7nlRPc75bKw==", 715 | "requires": { 716 | "abstract-extension": "^3.0.1", 717 | "debug": "^4.1.1", 718 | "hypercore-crypto": "^2.0.0", 719 | "inspect-custom-symbol": "^1.1.0", 720 | "nanoguard": "^1.2.1", 721 | "pretty-hash": "^1.0.1", 722 | "simple-hypercore-protocol": "^2.0.0", 723 | "streamx": "^2.1.0", 724 | "timeout-refresh": "^1.0.0" 725 | }, 726 | "dependencies": { 727 | "debug": { 728 | "version": "4.3.1", 729 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 730 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 731 | "requires": { 732 | "ms": "2.1.2" 733 | } 734 | }, 735 | "ms": { 736 | "version": "2.1.2", 737 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 738 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 739 | } 740 | } 741 | }, 742 | "hypercore-streams": { 743 | "version": "1.0.1", 744 | "resolved": "https://registry.npmjs.org/hypercore-streams/-/hypercore-streams-1.0.1.tgz", 745 | "integrity": "sha512-OcN2zq9DEoArC84q9VCSrf9Hx1QUkR6ineCOwyOwhE4v/8aUTOx87mAk1nyjMOf76DQmF+tl2vnS2FssLx5N+Q==", 746 | "requires": { 747 | "streamx": "^2.6.0" 748 | } 749 | }, 750 | "hyperdrive": { 751 | "version": "10.19.1", 752 | "resolved": "https://registry.npmjs.org/hyperdrive/-/hyperdrive-10.19.1.tgz", 753 | "integrity": "sha512-5hgQycmMUxJPDulSlUNKOSKnTznWZ5Ryu3wSQAJenjdqd+TzdPVYiwV2PXsmtnOK7T1xwX3ykVC9G4Hl6Z0nIg==", 754 | "requires": { 755 | "byte-stream": "^2.1.0", 756 | "corestore": "^5.3.2", 757 | "custom-error-class": "^1.0.0", 758 | "duplexify": "^3.7.1", 759 | "filesystem-constants": "^1.0.0", 760 | "hypercore-byte-stream": "^1.0.2", 761 | "hypercore-protocol": "^8.0.0", 762 | "hyperdrive-schemas": "^2.0.0", 763 | "mountable-hypertrie": "^2.6.0", 764 | "mutexify": "^1.2.0", 765 | "nanoiterator": "^1.2.0", 766 | "nanoresource": "^1.3.0", 767 | "pump": "^3.0.0", 768 | "pumpify": "^2.0.1", 769 | "stream-collector": "^1.0.1", 770 | "streamx": "^2.6.3", 771 | "thunky": "^1.0.3", 772 | "thunky-map": "^1.0.0", 773 | "unixify": "^1.0.0", 774 | "varint": "^5.0.0" 775 | } 776 | }, 777 | "hyperdrive-schemas": { 778 | "version": "2.0.0", 779 | "resolved": "https://registry.npmjs.org/hyperdrive-schemas/-/hyperdrive-schemas-2.0.0.tgz", 780 | "integrity": "sha512-mzD741NjsSt3ttIaavbh3zyNdR3zy0X55HRweNRsw/JEduWjaoOZa6EXz7ly2JxuD7MvAbJxsuNPlnVl9saL6w==", 781 | "requires": { 782 | "protocol-buffers-encodings": "^1.1.0" 783 | } 784 | }, 785 | "hyperspace": { 786 | "version": "3.18.1", 787 | "resolved": "https://registry.npmjs.org/hyperspace/-/hyperspace-3.18.1.tgz", 788 | "integrity": "sha512-9aDZ2Jc2RXOhvrJyXNl8ebv5RE7pj97WKcFTiaL4VuFV0bFyjAJUby/3Fz51ElT9aRbE1SWtuzUSbHN2PiB1tQ==", 789 | "requires": { 790 | "@corestore/networker": "^1.0.3", 791 | "@hyperspace/client": "^1.14.0", 792 | "@hyperspace/migration-tool": "^1.1.2", 793 | "@hyperspace/rpc": "^1.8.0", 794 | "corestore": "^5.7.3", 795 | "hypercore": "^9.5.4", 796 | "hypercore-cache": "^1.0.2", 797 | "hypercore-default-storage": "^1.0.0", 798 | "hyperswarm": "^2.15.1", 799 | "hypertrie": "^5.1.1", 800 | "inspect-custom-symbol": "^1.1.1", 801 | "minimist": "^1.2.5", 802 | "nanoresource-promise": "^1.2.2", 803 | "random-access-memory": "^3.1.1" 804 | } 805 | }, 806 | "hyperswarm": { 807 | "version": "2.15.2", 808 | "resolved": "https://registry.npmjs.org/hyperswarm/-/hyperswarm-2.15.2.tgz", 809 | "integrity": "sha512-4TrClGoKJWO+W3LV0bhFVqmt6iZvx4jU0lklqvfsWCXoI8WmdHDC1dXqxMvJlalA6HXJWctgbshKqz+CYUEbhg==", 810 | "requires": { 811 | "@hyperswarm/network": "^2.0.0", 812 | "shuffled-priority-queue": "^2.1.0", 813 | "utp-native": "^2.1.7" 814 | } 815 | }, 816 | "hypertrie": { 817 | "version": "5.1.1", 818 | "resolved": "https://registry.npmjs.org/hypertrie/-/hypertrie-5.1.1.tgz", 819 | "integrity": "sha512-6PjBRPsTH+hqhMpjt1QmxXMFW6XaHNXkjxH1KrL1bp8Fpz7SPOvBNSaQVttvAP6GRzDKkeLraG4q3yJiSL4IhQ==", 820 | "requires": { 821 | "array-lru": "^1.1.1", 822 | "bulk-write-stream": "^1.1.4", 823 | "codecs": "^2.0.0", 824 | "hypercore": "^9.4.1", 825 | "hypercore-protocol": "^8.0.0", 826 | "inherits": "^2.0.3", 827 | "inspect-custom-symbol": "^1.1.0", 828 | "is-options": "^1.0.1", 829 | "mutexify": "^1.2.0", 830 | "nanoiterator": "^1.2.0", 831 | "protocol-buffers-encodings": "^1.1.0", 832 | "siphash24-universal": "^1.0.0", 833 | "thunky": "^1.0.2", 834 | "unordered-set": "^2.0.1", 835 | "varint": "^5.0.0" 836 | } 837 | }, 838 | "ieee754": { 839 | "version": "1.2.1", 840 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 841 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 842 | }, 843 | "immediate": { 844 | "version": "3.3.0", 845 | "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", 846 | "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==" 847 | }, 848 | "inherits": { 849 | "version": "2.0.4", 850 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 851 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 852 | }, 853 | "ini": { 854 | "version": "1.3.8", 855 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 856 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 857 | }, 858 | "inspect-custom-symbol": { 859 | "version": "1.1.1", 860 | "resolved": "https://registry.npmjs.org/inspect-custom-symbol/-/inspect-custom-symbol-1.1.1.tgz", 861 | "integrity": "sha512-GOucsp9EcdlLdhPUyOTvQDnbFJtp2WBWZV1Jqe+mVnkJQBL3w96+fB84C+JL+EKXOspMdB0eMDQPDp5w9fkfZA==" 862 | }, 863 | "ip": { 864 | "version": "1.1.5", 865 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", 866 | "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" 867 | }, 868 | "ipv4-peers": { 869 | "version": "2.0.0", 870 | "resolved": "https://registry.npmjs.org/ipv4-peers/-/ipv4-peers-2.0.0.tgz", 871 | "integrity": "sha512-6ZMWB3JnCWT0gISUkzChcUEkJS6+LpGRU3h10f9Mfc0usVmyIcbcTN9+QPMg29gLOY8WtaKFbM5ME8qNySoh8g==" 872 | }, 873 | "is-core-module": { 874 | "version": "2.2.0", 875 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", 876 | "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", 877 | "requires": { 878 | "has": "^1.0.3" 879 | } 880 | }, 881 | "is-options": { 882 | "version": "1.0.1", 883 | "resolved": "https://registry.npmjs.org/is-options/-/is-options-1.0.1.tgz", 884 | "integrity": "sha512-2Xj8sA0zDrAcaoWfBiNmc6VPWAgKDpim0T3J9Djq7vbm1UjwbUWzeuLu/FwC46g3cBbAn0E5R0xwVtOobM6Xxg==" 885 | }, 886 | "is-property": { 887 | "version": "1.0.2", 888 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", 889 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" 890 | }, 891 | "isarray": { 892 | "version": "0.0.1", 893 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 894 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 895 | }, 896 | "k-bucket": { 897 | "version": "5.0.0", 898 | "resolved": "https://registry.npmjs.org/k-bucket/-/k-bucket-5.0.0.tgz", 899 | "integrity": "sha512-r/q+wV/Kde62/tk+rqyttEJn6h0jR7x+incdMVSYTqK73zVxVrzJa70kJL49cIKen8XjIgUZKSvk8ktnrQbK4w==", 900 | "requires": { 901 | "randombytes": "^2.0.3" 902 | } 903 | }, 904 | "last-one-wins": { 905 | "version": "1.0.4", 906 | "resolved": "https://registry.npmjs.org/last-one-wins/-/last-one-wins-1.0.4.tgz", 907 | "integrity": "sha1-wb/Qy8tGeQ7JFWuNGu6Py4bNoio=" 908 | }, 909 | "level": { 910 | "version": "6.0.1", 911 | "resolved": "https://registry.npmjs.org/level/-/level-6.0.1.tgz", 912 | "integrity": "sha512-psRSqJZCsC/irNhfHzrVZbmPYXDcEYhA5TVNwr+V92jF44rbf86hqGp8fiT702FyiArScYIlPSBTDUASCVNSpw==", 913 | "requires": { 914 | "level-js": "^5.0.0", 915 | "level-packager": "^5.1.0", 916 | "leveldown": "^5.4.0" 917 | } 918 | }, 919 | "level-codec": { 920 | "version": "9.0.2", 921 | "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", 922 | "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", 923 | "requires": { 924 | "buffer": "^5.6.0" 925 | } 926 | }, 927 | "level-concat-iterator": { 928 | "version": "2.0.1", 929 | "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", 930 | "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==" 931 | }, 932 | "level-errors": { 933 | "version": "2.0.1", 934 | "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", 935 | "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", 936 | "requires": { 937 | "errno": "~0.1.1" 938 | } 939 | }, 940 | "level-iterator-stream": { 941 | "version": "4.0.2", 942 | "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", 943 | "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", 944 | "requires": { 945 | "inherits": "^2.0.4", 946 | "readable-stream": "^3.4.0", 947 | "xtend": "^4.0.2" 948 | }, 949 | "dependencies": { 950 | "readable-stream": { 951 | "version": "3.6.0", 952 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 953 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 954 | "requires": { 955 | "inherits": "^2.0.3", 956 | "string_decoder": "^1.1.1", 957 | "util-deprecate": "^1.0.1" 958 | } 959 | }, 960 | "string_decoder": { 961 | "version": "1.3.0", 962 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 963 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 964 | "requires": { 965 | "safe-buffer": "~5.2.0" 966 | } 967 | } 968 | } 969 | }, 970 | "level-js": { 971 | "version": "5.0.2", 972 | "resolved": "https://registry.npmjs.org/level-js/-/level-js-5.0.2.tgz", 973 | "integrity": "sha512-SnBIDo2pdO5VXh02ZmtAyPP6/+6YTJg2ibLtl9C34pWvmtMEmRTWpra+qO/hifkUtBTOtfx6S9vLDjBsBK4gRg==", 974 | "requires": { 975 | "abstract-leveldown": "~6.2.3", 976 | "buffer": "^5.5.0", 977 | "inherits": "^2.0.3", 978 | "ltgt": "^2.1.2" 979 | } 980 | }, 981 | "level-option-wrap": { 982 | "version": "1.1.0", 983 | "resolved": "https://registry.npmjs.org/level-option-wrap/-/level-option-wrap-1.1.0.tgz", 984 | "integrity": "sha1-rSDmjZ88IsiJdTHMaqevWWse0Sk=", 985 | "requires": { 986 | "defined": "~0.0.0" 987 | } 988 | }, 989 | "level-packager": { 990 | "version": "5.1.1", 991 | "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", 992 | "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", 993 | "requires": { 994 | "encoding-down": "^6.3.0", 995 | "levelup": "^4.3.2" 996 | } 997 | }, 998 | "level-supports": { 999 | "version": "1.0.1", 1000 | "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", 1001 | "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", 1002 | "requires": { 1003 | "xtend": "^4.0.2" 1004 | } 1005 | }, 1006 | "leveldown": { 1007 | "version": "5.6.0", 1008 | "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-5.6.0.tgz", 1009 | "integrity": "sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==", 1010 | "requires": { 1011 | "abstract-leveldown": "~6.2.1", 1012 | "napi-macros": "~2.0.0", 1013 | "node-gyp-build": "~4.1.0" 1014 | }, 1015 | "dependencies": { 1016 | "node-gyp-build": { 1017 | "version": "4.1.1", 1018 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.1.1.tgz", 1019 | "integrity": "sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==" 1020 | } 1021 | } 1022 | }, 1023 | "levelup": { 1024 | "version": "4.4.0", 1025 | "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", 1026 | "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", 1027 | "requires": { 1028 | "deferred-leveldown": "~5.3.0", 1029 | "level-errors": "~2.0.0", 1030 | "level-iterator-stream": "~4.0.0", 1031 | "level-supports": "~1.0.0", 1032 | "xtend": "~4.0.0" 1033 | } 1034 | }, 1035 | "ltgt": { 1036 | "version": "2.2.1", 1037 | "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", 1038 | "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=" 1039 | }, 1040 | "memory-pager": { 1041 | "version": "1.5.0", 1042 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 1043 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" 1044 | }, 1045 | "merkle-tree-stream": { 1046 | "version": "4.0.0", 1047 | "resolved": "https://registry.npmjs.org/merkle-tree-stream/-/merkle-tree-stream-4.0.0.tgz", 1048 | "integrity": "sha512-TIurLf/ustQNMXi5foClGTcEsRvH6DCvxeAKu68OrwHMOSM/M1pgPXb7qe52Svk1ClvmZuAVpLtP5FWKzPr/sw==", 1049 | "requires": { 1050 | "flat-tree": "^1.3.0", 1051 | "streamx": "^2.7.1" 1052 | } 1053 | }, 1054 | "minimist": { 1055 | "version": "1.2.5", 1056 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1057 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 1058 | }, 1059 | "mkdirp-classic": { 1060 | "version": "0.5.3", 1061 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 1062 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" 1063 | }, 1064 | "mountable-hypertrie": { 1065 | "version": "2.8.0", 1066 | "resolved": "https://registry.npmjs.org/mountable-hypertrie/-/mountable-hypertrie-2.8.0.tgz", 1067 | "integrity": "sha512-UYwewr82cZvrhJRQLWJtVJRWvJv+zQnp+2SnG051yO7c4rd3auUgwWJ71LyQKfVGq7OPYG1CUtXJKqbo+bVyPw==", 1068 | "requires": { 1069 | "hypercore-crypto": "^2.0.1", 1070 | "hypercore-protocol": "^8.0.0", 1071 | "hypertrie": "^5.0.0", 1072 | "is-options": "^1.0.1", 1073 | "nanoiterator": "^1.2.0", 1074 | "nanoresource": "^1.3.0", 1075 | "protocol-buffers": "^4.1.0", 1076 | "protocol-buffers-encodings": "^1.1.0", 1077 | "thunky": "^1.1.0", 1078 | "unixify": "^1.0.0" 1079 | } 1080 | }, 1081 | "ms": { 1082 | "version": "2.0.0", 1083 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1084 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1085 | }, 1086 | "multicast-dns": { 1087 | "version": "7.2.2", 1088 | "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.2.tgz", 1089 | "integrity": "sha512-XqSMeO8EWV/nOXOpPV8ztIpNweVfE1dSpz6SQvDPp71HD74lMXjt4m/mWB1YBMG0kHtOodxRWc5WOb/UNN1A5g==", 1090 | "requires": { 1091 | "dns-packet": "^4.0.0", 1092 | "thunky": "^1.0.2" 1093 | } 1094 | }, 1095 | "mutexify": { 1096 | "version": "1.3.1", 1097 | "resolved": "https://registry.npmjs.org/mutexify/-/mutexify-1.3.1.tgz", 1098 | "integrity": "sha512-nU7mOEuaXiQIB/EgTIjYZJ7g8KqMm2D8l4qp+DqA4jxWOb/tnb1KEoqp+tlbdQIDIAiC1i7j7X/3yHDFXLxr9g==" 1099 | }, 1100 | "nanoassert": { 1101 | "version": "1.1.0", 1102 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-1.1.0.tgz", 1103 | "integrity": "sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40=" 1104 | }, 1105 | "nanoguard": { 1106 | "version": "1.3.0", 1107 | "resolved": "https://registry.npmjs.org/nanoguard/-/nanoguard-1.3.0.tgz", 1108 | "integrity": "sha512-K/ON5wyflyPyZskdeT3m7Y2gJVkm3QLdKykMCquAbK8A2erstyMpZUc3NG8Nz5jKdfatiYndONrlmLF8+pGl+A==" 1109 | }, 1110 | "nanoiterator": { 1111 | "version": "1.2.1", 1112 | "resolved": "https://registry.npmjs.org/nanoiterator/-/nanoiterator-1.2.1.tgz", 1113 | "integrity": "sha512-M7V9cvfDErMg/H3j90zIGY7Fq3vIGjnnNXwcZ/EXO4plZT3dGNwvykfslHgtbJ8prOGuu3khmc87pND0jdmkcA==", 1114 | "requires": { 1115 | "inherits": "^2.0.3", 1116 | "readable-stream": "^2.3.3" 1117 | }, 1118 | "dependencies": { 1119 | "isarray": { 1120 | "version": "1.0.0", 1121 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1122 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1123 | }, 1124 | "readable-stream": { 1125 | "version": "2.3.7", 1126 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1127 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1128 | "requires": { 1129 | "core-util-is": "~1.0.0", 1130 | "inherits": "~2.0.3", 1131 | "isarray": "~1.0.0", 1132 | "process-nextick-args": "~2.0.0", 1133 | "safe-buffer": "~5.1.1", 1134 | "string_decoder": "~1.1.1", 1135 | "util-deprecate": "~1.0.1" 1136 | } 1137 | }, 1138 | "safe-buffer": { 1139 | "version": "5.1.2", 1140 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1141 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1142 | }, 1143 | "string_decoder": { 1144 | "version": "1.1.1", 1145 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1146 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1147 | "requires": { 1148 | "safe-buffer": "~5.1.0" 1149 | } 1150 | } 1151 | } 1152 | }, 1153 | "nanoresource": { 1154 | "version": "1.3.0", 1155 | "resolved": "https://registry.npmjs.org/nanoresource/-/nanoresource-1.3.0.tgz", 1156 | "integrity": "sha512-OI5dswqipmlYfyL3k/YMm7mbERlh4Bd1KuKdMHpeoVD1iVxqxaTMKleB4qaA2mbQZ6/zMNSxCXv9M9P/YbqTuQ==", 1157 | "requires": { 1158 | "inherits": "^2.0.4" 1159 | } 1160 | }, 1161 | "nanoresource-promise": { 1162 | "version": "1.2.2", 1163 | "resolved": "https://registry.npmjs.org/nanoresource-promise/-/nanoresource-promise-1.2.2.tgz", 1164 | "integrity": "sha512-XCRcRrCoTifA6XJqYaMqlHgWFrAq6aGNnXboRa/Dxa0TNkm3S13+RWCD7/XaB4ySunAmZzx81++OS4kqkDynuA==", 1165 | "requires": { 1166 | "nanoresource": "^1.3.0" 1167 | } 1168 | }, 1169 | "napi-macros": { 1170 | "version": "2.0.0", 1171 | "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", 1172 | "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==" 1173 | }, 1174 | "node-gyp-build": { 1175 | "version": "4.2.3", 1176 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", 1177 | "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==" 1178 | }, 1179 | "noise-protocol": { 1180 | "version": "3.0.1", 1181 | "resolved": "https://registry.npmjs.org/noise-protocol/-/noise-protocol-3.0.1.tgz", 1182 | "integrity": "sha512-4rQGZvismeb4tMf91O31oDYLGntkEs4p4wa69+14juHTV4A3COtWyDck9PwBqFjg7S8TPZLCUXUdOnOZQJ5UBA==", 1183 | "requires": { 1184 | "clone": "^2.1.2", 1185 | "hmac-blake2b": "^2.0.0", 1186 | "nanoassert": "^2.0.0", 1187 | "sodium-universal": "^3.0.2" 1188 | }, 1189 | "dependencies": { 1190 | "nanoassert": { 1191 | "version": "2.0.0", 1192 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", 1193 | "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" 1194 | } 1195 | } 1196 | }, 1197 | "normalize-path": { 1198 | "version": "2.1.1", 1199 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 1200 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 1201 | "requires": { 1202 | "remove-trailing-separator": "^1.0.1" 1203 | } 1204 | }, 1205 | "once": { 1206 | "version": "1.4.0", 1207 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1208 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1209 | "requires": { 1210 | "wrappy": "1" 1211 | } 1212 | }, 1213 | "path-parse": { 1214 | "version": "1.0.6", 1215 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1216 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 1217 | }, 1218 | "pretty-hash": { 1219 | "version": "1.0.1", 1220 | "resolved": "https://registry.npmjs.org/pretty-hash/-/pretty-hash-1.0.1.tgz", 1221 | "integrity": "sha1-FuBXkYje9WvbVliSvNBaXWUySAc=" 1222 | }, 1223 | "process-nextick-args": { 1224 | "version": "2.0.1", 1225 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1226 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1227 | }, 1228 | "protocol-buffers": { 1229 | "version": "4.2.0", 1230 | "resolved": "https://registry.npmjs.org/protocol-buffers/-/protocol-buffers-4.2.0.tgz", 1231 | "integrity": "sha512-hNp56d5uuREVde7UqP+dmBkwzxrhJwYU5nL/mdivyFfkRZdgAgojkyBeU3jKo7ZHrjdSx6Q1CwUmYJI6INt20g==", 1232 | "requires": { 1233 | "generate-function": "^2.0.0", 1234 | "generate-object-property": "^1.2.0", 1235 | "protocol-buffers-encodings": "^1.1.0", 1236 | "protocol-buffers-schema": "^3.1.1", 1237 | "signed-varint": "^2.0.0", 1238 | "varint": "^5.0.0" 1239 | } 1240 | }, 1241 | "protocol-buffers-encodings": { 1242 | "version": "1.1.1", 1243 | "resolved": "https://registry.npmjs.org/protocol-buffers-encodings/-/protocol-buffers-encodings-1.1.1.tgz", 1244 | "integrity": "sha512-5aFshI9SbhtcMiDiZZu3g2tMlZeS5lhni//AGJ7V34PQLU5JA91Cva7TIs6inZhYikS3OpnUzAUuL6YtS0CyDA==", 1245 | "requires": { 1246 | "signed-varint": "^2.0.1", 1247 | "varint": "5.0.0" 1248 | }, 1249 | "dependencies": { 1250 | "varint": { 1251 | "version": "5.0.0", 1252 | "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", 1253 | "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=" 1254 | } 1255 | } 1256 | }, 1257 | "protocol-buffers-schema": { 1258 | "version": "3.4.0", 1259 | "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.4.0.tgz", 1260 | "integrity": "sha512-G/2kcamPF2S49W5yaMGdIpkG6+5wZF0fzBteLKgEHjbNzqjZQ85aAs1iJGto31EJaSTkNvHs5IXuHSaTLWBAiA==" 1261 | }, 1262 | "prr": { 1263 | "version": "1.0.1", 1264 | "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", 1265 | "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" 1266 | }, 1267 | "pump": { 1268 | "version": "3.0.0", 1269 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1270 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1271 | "requires": { 1272 | "end-of-stream": "^1.1.0", 1273 | "once": "^1.3.1" 1274 | } 1275 | }, 1276 | "pumpify": { 1277 | "version": "2.0.1", 1278 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", 1279 | "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", 1280 | "requires": { 1281 | "duplexify": "^4.1.1", 1282 | "inherits": "^2.0.3", 1283 | "pump": "^3.0.0" 1284 | }, 1285 | "dependencies": { 1286 | "duplexify": { 1287 | "version": "4.1.1", 1288 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", 1289 | "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", 1290 | "requires": { 1291 | "end-of-stream": "^1.4.1", 1292 | "inherits": "^2.0.3", 1293 | "readable-stream": "^3.1.1", 1294 | "stream-shift": "^1.0.0" 1295 | } 1296 | }, 1297 | "readable-stream": { 1298 | "version": "3.6.0", 1299 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1300 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1301 | "requires": { 1302 | "inherits": "^2.0.3", 1303 | "string_decoder": "^1.1.1", 1304 | "util-deprecate": "^1.0.1" 1305 | } 1306 | }, 1307 | "string_decoder": { 1308 | "version": "1.3.0", 1309 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1310 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1311 | "requires": { 1312 | "safe-buffer": "~5.2.0" 1313 | } 1314 | } 1315 | } 1316 | }, 1317 | "ram": { 1318 | "version": "0.0.3", 1319 | "resolved": "https://registry.npmjs.org/ram/-/ram-0.0.3.tgz", 1320 | "integrity": "sha1-islQc90wGvmz4frTEyHCdMQmQhI=" 1321 | }, 1322 | "random-access-file": { 1323 | "version": "2.1.4", 1324 | "resolved": "https://registry.npmjs.org/random-access-file/-/random-access-file-2.1.4.tgz", 1325 | "integrity": "sha512-WAcBP5iLhg1pbjZA40WyMenjK7c5gJUY6Pi5HJ3fLJCeVFNSZv3juf20yFMKxBdvcX5GKbX/HZSfFzlLBdGTdQ==", 1326 | "requires": { 1327 | "mkdirp-classic": "^0.5.2", 1328 | "random-access-storage": "^1.1.1" 1329 | } 1330 | }, 1331 | "random-access-memory": { 1332 | "version": "3.1.1", 1333 | "resolved": "https://registry.npmjs.org/random-access-memory/-/random-access-memory-3.1.1.tgz", 1334 | "integrity": "sha512-Qy1MliJDozZ1A6Hx3UbEnm8PPCfkiG/8CArbnhrxXMx1YRJPWipgPTB9qyhn4Z7WlLvCEqPb6Bd98OayyVuwrA==", 1335 | "requires": { 1336 | "inherits": "^2.0.3", 1337 | "is-options": "^1.0.1", 1338 | "random-access-storage": "^1.1.1" 1339 | } 1340 | }, 1341 | "random-access-storage": { 1342 | "version": "1.4.1", 1343 | "resolved": "https://registry.npmjs.org/random-access-storage/-/random-access-storage-1.4.1.tgz", 1344 | "integrity": "sha512-DbCc2TIzOxPaHF6KCbr8zLtiYOJQQQCBHUVNHV/SckUQobCBB2YkDtbLdxGnPwPNpJfEyMWxDAm36A2xkbxxtw==", 1345 | "requires": { 1346 | "inherits": "^2.0.3" 1347 | } 1348 | }, 1349 | "randombytes": { 1350 | "version": "2.1.0", 1351 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1352 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1353 | "requires": { 1354 | "safe-buffer": "^5.1.0" 1355 | } 1356 | }, 1357 | "reachdown": { 1358 | "version": "1.1.0", 1359 | "resolved": "https://registry.npmjs.org/reachdown/-/reachdown-1.1.0.tgz", 1360 | "integrity": "sha512-6LsdRe4cZyOjw4NnvbhUd/rGG7WQ9HMopPr+kyL018Uci4kijtxcGR5kVb5Ln13k4PEE+fEFQbjfOvNw7cnXmA==" 1361 | }, 1362 | "readable-stream": { 1363 | "version": "1.1.14", 1364 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 1365 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 1366 | "requires": { 1367 | "core-util-is": "~1.0.0", 1368 | "inherits": "~2.0.1", 1369 | "isarray": "0.0.1", 1370 | "string_decoder": "~0.10.x" 1371 | } 1372 | }, 1373 | "record-cache": { 1374 | "version": "1.1.0", 1375 | "resolved": "https://registry.npmjs.org/record-cache/-/record-cache-1.1.0.tgz", 1376 | "integrity": "sha512-u8rbtLEJV7HRacl/ZYwSBFD8NFyB3PfTTfGLP37IW3hftQCwu6z4Q2RLyxo1YJUNRTEzJfpLpGwVuEYdaIkG9Q==" 1377 | }, 1378 | "refpool": { 1379 | "version": "1.2.2", 1380 | "resolved": "https://registry.npmjs.org/refpool/-/refpool-1.2.2.tgz", 1381 | "integrity": "sha512-uxnVlknIezgMMYQu2RDU/OCkyHntFHnC68PqghdKun2z3W3t5CmAt4uDr28TcPP2GQNsTAjvX1+vpHVrjvcolg==", 1382 | "requires": { 1383 | "time-ordered-set": "^1.0.2" 1384 | } 1385 | }, 1386 | "remove-trailing-separator": { 1387 | "version": "1.1.0", 1388 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 1389 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" 1390 | }, 1391 | "resolve": { 1392 | "version": "1.19.0", 1393 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", 1394 | "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", 1395 | "requires": { 1396 | "is-core-module": "^2.1.0", 1397 | "path-parse": "^1.0.6" 1398 | } 1399 | }, 1400 | "safe-buffer": { 1401 | "version": "5.2.1", 1402 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1403 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1404 | }, 1405 | "sha256-universal": { 1406 | "version": "1.1.0", 1407 | "resolved": "https://registry.npmjs.org/sha256-universal/-/sha256-universal-1.1.0.tgz", 1408 | "integrity": "sha512-CDpS+UrEMA7UOPdogFJ1HOPNrhj0vH+mzWHT5FaU0qlsEXQ4BBey2Mc5+TfJ5nxyRf77fpABbKmXbL/QIzgz2A==", 1409 | "requires": { 1410 | "sha256-wasm": "^2.1.0" 1411 | } 1412 | }, 1413 | "sha256-wasm": { 1414 | "version": "2.1.2", 1415 | "resolved": "https://registry.npmjs.org/sha256-wasm/-/sha256-wasm-2.1.2.tgz", 1416 | "integrity": "sha512-MOddGVQmN+uULS6jnEUk7NzN57yxkT19Lbm5Mlz8mJKONx5ciFDnABZO8VokSJyvBsLCiR7cAOinMToEsifq0w==", 1417 | "requires": { 1418 | "nanoassert": "^2.0.0" 1419 | }, 1420 | "dependencies": { 1421 | "nanoassert": { 1422 | "version": "2.0.0", 1423 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", 1424 | "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" 1425 | } 1426 | } 1427 | }, 1428 | "sha512-universal": { 1429 | "version": "1.1.0", 1430 | "resolved": "https://registry.npmjs.org/sha512-universal/-/sha512-universal-1.1.0.tgz", 1431 | "integrity": "sha512-2ag5no5DwP9lv6Nk8VkJNujqv5LiJODxReqNp2qiY+O1c1bgiN/PlCRdmjQdBp0k/2XAkdIirEPDpZJoGf9gLw==", 1432 | "requires": { 1433 | "sha512-wasm": "^2.1.0" 1434 | } 1435 | }, 1436 | "sha512-wasm": { 1437 | "version": "2.1.1", 1438 | "resolved": "https://registry.npmjs.org/sha512-wasm/-/sha512-wasm-2.1.1.tgz", 1439 | "integrity": "sha512-v6t7N3YkJzc4UUhel6fpc423O+7pqlKARUrUOAthgBL3LSncb74qnUXljyd8q24+twG7yC/Kh/ouo6wc2L4oVw==", 1440 | "requires": { 1441 | "nanoassert": "^2.0.0" 1442 | }, 1443 | "dependencies": { 1444 | "nanoassert": { 1445 | "version": "2.0.0", 1446 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", 1447 | "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" 1448 | } 1449 | } 1450 | }, 1451 | "shuffled-priority-queue": { 1452 | "version": "2.1.0", 1453 | "resolved": "https://registry.npmjs.org/shuffled-priority-queue/-/shuffled-priority-queue-2.1.0.tgz", 1454 | "integrity": "sha512-xhdh7fHyMsr0m/w2kDfRJuBFRS96b9l8ZPNWGaQ+PMvnUnZ/Eh+gJJ9NsHBd7P9k0399WYlCLzsy18EaMfyadA==", 1455 | "requires": { 1456 | "unordered-set": "^2.0.1" 1457 | } 1458 | }, 1459 | "signed-varint": { 1460 | "version": "2.0.1", 1461 | "resolved": "https://registry.npmjs.org/signed-varint/-/signed-varint-2.0.1.tgz", 1462 | "integrity": "sha1-UKmYnafJjCxh2tEZvJdHDvhSgSk=", 1463 | "requires": { 1464 | "varint": "~5.0.0" 1465 | } 1466 | }, 1467 | "simple-handshake": { 1468 | "version": "3.0.0", 1469 | "resolved": "https://registry.npmjs.org/simple-handshake/-/simple-handshake-3.0.0.tgz", 1470 | "integrity": "sha512-8Te0vlxvhpNCMgwnWFTbRR6Re2l8hq8wyXQc3lY9dPYXFxYwVkh79LhDQHFCOWRavmbiOdfqq1l5HT/73Rn2/w==", 1471 | "requires": { 1472 | "nanoassert": "^2.0.0", 1473 | "noise-protocol": "^3.0.0" 1474 | }, 1475 | "dependencies": { 1476 | "nanoassert": { 1477 | "version": "2.0.0", 1478 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", 1479 | "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" 1480 | } 1481 | } 1482 | }, 1483 | "simple-hypercore-protocol": { 1484 | "version": "2.1.1", 1485 | "resolved": "https://registry.npmjs.org/simple-hypercore-protocol/-/simple-hypercore-protocol-2.1.1.tgz", 1486 | "integrity": "sha512-xKuomRCfDDf+r6PDOD3RD88cjOLcbJ0E3Iz9Z+daB4Sq3FVv6efKYsOytgzTfSZMzkszF9EpYHGIILdVI669qA==", 1487 | "requires": { 1488 | "hypercore-crypto": "^2.1.0", 1489 | "noise-protocol": "^3.0.1", 1490 | "protocol-buffers-encodings": "^1.1.0", 1491 | "simple-handshake": "^3.0.0", 1492 | "simple-message-channels": "^1.2.1", 1493 | "varint": "^5.0.0", 1494 | "xsalsa20-universal": "^1.0.0" 1495 | } 1496 | }, 1497 | "simple-message-channels": { 1498 | "version": "1.2.1", 1499 | "resolved": "https://registry.npmjs.org/simple-message-channels/-/simple-message-channels-1.2.1.tgz", 1500 | "integrity": "sha512-knSr69GKW9sCjzpoy817xQelpOASUQ53TXCBcSLDKLE7GTGpUAhZzOZYrdbX2Ig//m+8AIrNp7sM7HDNHBRzXw==", 1501 | "requires": { 1502 | "varint": "^5.0.0" 1503 | } 1504 | }, 1505 | "siphash24": { 1506 | "version": "1.1.1", 1507 | "resolved": "https://registry.npmjs.org/siphash24/-/siphash24-1.1.1.tgz", 1508 | "integrity": "sha512-dKKwjIoTOa587TARYLlBRXq2lkbu5Iz35XrEVWpelhBP1m8r2BGOy1QlaZe84GTFHG/BTucEUd2btnNc8QzIVA==", 1509 | "requires": { 1510 | "nanoassert": "^1.0.0" 1511 | } 1512 | }, 1513 | "siphash24-universal": { 1514 | "version": "1.0.0", 1515 | "resolved": "https://registry.npmjs.org/siphash24-universal/-/siphash24-universal-1.0.0.tgz", 1516 | "integrity": "sha512-TasWcrGz+ITPEvE6Bhz8hACI39bSuoO9aRBYk601lhFZRpkHikbmmCbD5OkBFenYUmhOCjbOSZDbaHb8+FdWkg==", 1517 | "requires": { 1518 | "siphash24": "^1.1.1" 1519 | } 1520 | }, 1521 | "sodium-javascript": { 1522 | "version": "0.7.3", 1523 | "resolved": "https://registry.npmjs.org/sodium-javascript/-/sodium-javascript-0.7.3.tgz", 1524 | "integrity": "sha512-J2Zzj61bo41oBO4yEM9hTaNo3J98AcmFctjRg3D7+0A5cXdB1jlQOHV1qo2NavDU3BpqCfxdHW5UXCv565zh6Q==", 1525 | "requires": { 1526 | "blake2b": "^2.1.1", 1527 | "chacha20-universal": "^1.0.4", 1528 | "nanoassert": "^2.0.0", 1529 | "sha256-universal": "^1.1.0", 1530 | "sha512-universal": "^1.1.0", 1531 | "siphash24": "^1.0.1", 1532 | "xsalsa20": "^1.0.0" 1533 | }, 1534 | "dependencies": { 1535 | "nanoassert": { 1536 | "version": "2.0.0", 1537 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", 1538 | "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" 1539 | } 1540 | } 1541 | }, 1542 | "sodium-native": { 1543 | "version": "3.2.0", 1544 | "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-3.2.0.tgz", 1545 | "integrity": "sha512-8aq/vQSegLwsRch8Sb/Bpf9aAqlNe5dp0+NVhb9UjHv42zDZ0D5zX3wBRUbXK9Ejum9uZE6DUgT4vVLlUFRBWg==", 1546 | "requires": { 1547 | "ini": "^1.3.5", 1548 | "node-gyp-build": "^4.2.0" 1549 | } 1550 | }, 1551 | "sodium-universal": { 1552 | "version": "3.0.3", 1553 | "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-3.0.3.tgz", 1554 | "integrity": "sha512-kSU3K6bN5r/c/hbaMnYpz5GCzj2hsVSoHvYI9TTln99YCfZn61IVxCYFu+ELQPvvks3PY1HcZbOzEogcU/7iRg==", 1555 | "requires": { 1556 | "blake2b": "^2.1.1", 1557 | "chacha20-universal": "^1.0.4", 1558 | "nanoassert": "^2.0.0", 1559 | "resolve": "^1.17.0", 1560 | "sha256-universal": "^1.0.1", 1561 | "sha512-universal": "^1.0.1", 1562 | "siphash24": "^1.0.1", 1563 | "sodium-javascript": "~0.7.2", 1564 | "sodium-native": "^3.2.0", 1565 | "xsalsa20": "^1.0.0" 1566 | }, 1567 | "dependencies": { 1568 | "nanoassert": { 1569 | "version": "2.0.0", 1570 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", 1571 | "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" 1572 | } 1573 | } 1574 | }, 1575 | "sparse-bitfield": { 1576 | "version": "3.0.3", 1577 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 1578 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 1579 | "requires": { 1580 | "memory-pager": "^1.0.2" 1581 | } 1582 | }, 1583 | "speedometer": { 1584 | "version": "1.1.0", 1585 | "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.1.0.tgz", 1586 | "integrity": "sha512-z/wAiTESw2XVPssY2XRcme4niTc4S5FkkJ4gknudtVoc33Zil8TdTxHy5torRcgqMqksJV2Yz8HQcvtbsnw0mQ==" 1587 | }, 1588 | "stream-collector": { 1589 | "version": "1.0.1", 1590 | "resolved": "https://registry.npmjs.org/stream-collector/-/stream-collector-1.0.1.tgz", 1591 | "integrity": "sha1-TU5V8XE1YSGyxfZVn5RHBaso2xU=", 1592 | "requires": { 1593 | "once": "^1.3.1" 1594 | } 1595 | }, 1596 | "stream-shift": { 1597 | "version": "1.0.1", 1598 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 1599 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" 1600 | }, 1601 | "streamx": { 1602 | "version": "2.10.0", 1603 | "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.10.0.tgz", 1604 | "integrity": "sha512-yRWWgVtnVRePoNxkrU4StupcZ3GplpIR6COGLnTBDgS19SqB0aK8L572lw5g1SenmZHsRr/qBZWfZbnIBiK88A==", 1605 | "requires": { 1606 | "fast-fifo": "^1.0.0", 1607 | "nanoassert": "^2.0.0" 1608 | }, 1609 | "dependencies": { 1610 | "nanoassert": { 1611 | "version": "2.0.0", 1612 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", 1613 | "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" 1614 | } 1615 | } 1616 | }, 1617 | "string_decoder": { 1618 | "version": "0.10.31", 1619 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1620 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 1621 | }, 1622 | "subleveldown": { 1623 | "version": "5.0.1", 1624 | "resolved": "https://registry.npmjs.org/subleveldown/-/subleveldown-5.0.1.tgz", 1625 | "integrity": "sha512-cVqd/URpp7si1HWu5YqQ3vqQkjuolAwHypY1B4itPlS71/lsf6TQPZ2Y0ijT22EYVkvH5ove9JFJf4u7VGPuZw==", 1626 | "requires": { 1627 | "abstract-leveldown": "^6.3.0", 1628 | "encoding-down": "^6.2.0", 1629 | "inherits": "^2.0.3", 1630 | "level-option-wrap": "^1.1.0", 1631 | "levelup": "^4.4.0", 1632 | "reachdown": "^1.1.0" 1633 | }, 1634 | "dependencies": { 1635 | "abstract-leveldown": { 1636 | "version": "6.3.0", 1637 | "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", 1638 | "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", 1639 | "requires": { 1640 | "buffer": "^5.5.0", 1641 | "immediate": "^3.2.3", 1642 | "level-concat-iterator": "~2.0.0", 1643 | "level-supports": "~1.0.0", 1644 | "xtend": "~4.0.0" 1645 | } 1646 | } 1647 | } 1648 | }, 1649 | "supports-color": { 1650 | "version": "7.2.0", 1651 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1652 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1653 | "requires": { 1654 | "has-flag": "^4.0.0" 1655 | } 1656 | }, 1657 | "thunky": { 1658 | "version": "1.1.0", 1659 | "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", 1660 | "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" 1661 | }, 1662 | "thunky-map": { 1663 | "version": "1.0.1", 1664 | "resolved": "https://registry.npmjs.org/thunky-map/-/thunky-map-1.0.1.tgz", 1665 | "integrity": "sha512-RC34aHdxC9CYpvuO1TLBnsFa2G9KWFvUbbIbYnqX3hWdUfECWUzjDmv1XRgjRsQ9oGVmUZC+pOD4fAUWB6HU4Q==" 1666 | }, 1667 | "time-ordered-set": { 1668 | "version": "1.0.2", 1669 | "resolved": "https://registry.npmjs.org/time-ordered-set/-/time-ordered-set-1.0.2.tgz", 1670 | "integrity": "sha512-vGO99JkxvgX+u+LtOKQEpYf31Kj3i/GNwVstfnh4dyINakMgeZCpew1e3Aj+06hEslhtHEd52g7m5IV+o1K8Mw==" 1671 | }, 1672 | "timeout-refresh": { 1673 | "version": "1.0.3", 1674 | "resolved": "https://registry.npmjs.org/timeout-refresh/-/timeout-refresh-1.0.3.tgz", 1675 | "integrity": "sha512-Mz0CX4vBGM5lj8ttbIFt7o4ZMxk/9rgudJRh76EvB7xXZMur7T/cjRiH2w4Fmkq0zxf2QpM8IFvOSRn8FEu3gA==" 1676 | }, 1677 | "uint64be": { 1678 | "version": "2.0.2", 1679 | "resolved": "https://registry.npmjs.org/uint64be/-/uint64be-2.0.2.tgz", 1680 | "integrity": "sha512-9QqdvpGQTXgxthP+lY4e/gIBy+RuqcBaC6JVwT5I3bDLgT/btL6twZMR0pI3/Fgah9G/pdwzIprE5gL6v9UvyQ==", 1681 | "requires": { 1682 | "buffer-alloc": "^1.1.0" 1683 | } 1684 | }, 1685 | "unixify": { 1686 | "version": "1.0.0", 1687 | "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", 1688 | "integrity": "sha1-OmQcjC/7zk2mg6XHDwOkYpQMIJA=", 1689 | "requires": { 1690 | "normalize-path": "^2.1.1" 1691 | } 1692 | }, 1693 | "unordered-array-remove": { 1694 | "version": "1.0.2", 1695 | "resolved": "https://registry.npmjs.org/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz", 1696 | "integrity": "sha1-xUbo+I4xegzyZEyX7LV9umbSUO8=" 1697 | }, 1698 | "unordered-set": { 1699 | "version": "2.0.1", 1700 | "resolved": "https://registry.npmjs.org/unordered-set/-/unordered-set-2.0.1.tgz", 1701 | "integrity": "sha512-eUmNTPzdx+q/WvOHW0bgGYLWvWHNT3PTKEQLg0MAQhc0AHASHVHoP/9YytYd4RBVariqno/mEUhVZN98CmD7bg==" 1702 | }, 1703 | "util-deprecate": { 1704 | "version": "1.0.2", 1705 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1706 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1707 | }, 1708 | "utp-native": { 1709 | "version": "2.2.2", 1710 | "resolved": "https://registry.npmjs.org/utp-native/-/utp-native-2.2.2.tgz", 1711 | "integrity": "sha512-xwn5neM3aKgRCNYaiENRf2pwPa2G79O7r+OCZJDiy92x2q58Ez9hFUPeAW0IQcv0Ii5l1ytDIFWWyaiYVOtlng==", 1712 | "requires": { 1713 | "napi-macros": "^2.0.0", 1714 | "node-gyp-build": "^4.2.0", 1715 | "readable-stream": "^3.0.2", 1716 | "timeout-refresh": "^1.0.0", 1717 | "unordered-set": "^2.0.1" 1718 | }, 1719 | "dependencies": { 1720 | "readable-stream": { 1721 | "version": "3.6.0", 1722 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1723 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1724 | "requires": { 1725 | "inherits": "^2.0.3", 1726 | "string_decoder": "^1.1.1", 1727 | "util-deprecate": "^1.0.1" 1728 | } 1729 | }, 1730 | "string_decoder": { 1731 | "version": "1.3.0", 1732 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1733 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1734 | "requires": { 1735 | "safe-buffer": "~5.2.0" 1736 | } 1737 | } 1738 | } 1739 | }, 1740 | "varint": { 1741 | "version": "5.0.2", 1742 | "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", 1743 | "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" 1744 | }, 1745 | "wrappy": { 1746 | "version": "1.0.2", 1747 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1748 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1749 | }, 1750 | "xor-distance": { 1751 | "version": "2.0.0", 1752 | "resolved": "https://registry.npmjs.org/xor-distance/-/xor-distance-2.0.0.tgz", 1753 | "integrity": "sha512-AsAqZfPAuWx7qB/0kyRDUEvoU3QKsHWzHU9smFlkaiprEpGfJ/NBbLze2Uq0rdkxCxkNM9uOLvz/KoNBCbZiLQ==" 1754 | }, 1755 | "xsalsa20": { 1756 | "version": "1.1.0", 1757 | "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.1.0.tgz", 1758 | "integrity": "sha512-zd3ytX2cm+tcSndRU+krm0eL4TMMpZE7evs5hLRAoOy6gviqLfe3qOlkjF3i5SeAkQUCeJk0lJZrEU56kHRfWw==" 1759 | }, 1760 | "xsalsa20-universal": { 1761 | "version": "1.0.0", 1762 | "resolved": "https://registry.npmjs.org/xsalsa20-universal/-/xsalsa20-universal-1.0.0.tgz", 1763 | "integrity": "sha512-0M/X61wiKKAGAMqsxEyJ0kY6NtjpcMiKinYSSsl4K7ypgvqXDTMwQK6hxnYE1s1Jm7h6YKcN8obDUg2CC+jVGA==", 1764 | "requires": { 1765 | "sodium-native": "^3.0.1", 1766 | "xsalsa20": "^1.1.0" 1767 | } 1768 | }, 1769 | "xtend": { 1770 | "version": "4.0.2", 1771 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1772 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1773 | } 1774 | } 1775 | } 1776 | -------------------------------------------------------------------------------- /hyperdrive/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hyperdrive-walkthrough", 3 | "version": "1.0.0", 4 | "description": "Sharing Files with Hyperdrive", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [ 10 | "hyperdrive" 11 | ], 12 | "author": "Paul Frazee ", 13 | "license": "MIT", 14 | "dependencies": { 15 | "chalk": "^4.1.0", 16 | "hyperdrive": "^10.19.1", 17 | "hyperspace": "^3.18.1", 18 | "pump": "^3.0.0", 19 | "ram": "0.0.3" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /hyperdrive/step-1a.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk') 2 | const ram = require('random-access-memory') 3 | const hyperdrive = require('hyperdrive') 4 | 5 | start() 6 | 7 | async function start () { 8 | // A Hyperdrive uses two Hypercores internally: one for metadata and one for content. 9 | // - param 1: The storage (we'll use random-access-memory to avoid writing to disk). 10 | // - param 2: The key of the drive to load; `null` means "create a new drive." 11 | const drive = hyperdrive(ram, null) 12 | 13 | // Wait for setup to finish. 14 | await drive.promises.ready() 15 | 16 | // Let's dump some info! 17 | console.log(chalk.green('✓ Drive created in-memory:')) 18 | console.log(' Key:', drive.key.toString('hex')) // the drive's public key, used to identify it 19 | console.log(' Discovery Key:', drive.discoveryKey.toString('hex')) // the drive's discovery key for the DHT 20 | console.log(' Writable:', drive.writable) // do we possess the private key of this drive? 21 | console.log(' Version:', drive.version) // what is the version-number of this drive? 22 | 23 | // Loading a drive by an existing key is similar, we just pass the key into the constructor. 24 | const drive2 = hyperdrive(ram, drive.key) 25 | await drive2.promises.ready() 26 | 27 | // Because we loaded the second drive in a separate RAM, it will show as writable=false. 28 | console.log(chalk.green('✓ Drive copy created in-memory:')) 29 | console.log(' Key:', drive2.key.toString('hex')) 30 | console.log(' Writable:', drive2.writable) 31 | } 32 | -------------------------------------------------------------------------------- /hyperdrive/step-1b.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk') 2 | const createHyperspaceSimulator = require('hyperspace/simulator') 3 | const hyperdrive = require('hyperdrive') 4 | 5 | start() 6 | 7 | async function start () { 8 | // A Hyperdrive can also be constructed with a RemoteHypercore instance. 9 | const { client, cleanup } = await createHyperspaceSimulator() 10 | 11 | // In this case, we'll pass the RemoteCorestore as the storage 12 | // and `null` as the key in order to create a new drive. 13 | const drive = hyperdrive(client.corestore(), null) 14 | 15 | // Wait for setup to finish. 16 | await drive.promises.ready() 17 | 18 | // Let's dump some info! 19 | console.log(chalk.green('✓ Drive created in-memory:')) 20 | console.log(' Key:', drive.key.toString('hex')) // the drive's public key, used to identify it 21 | console.log(' Discovery Key:', drive.discoveryKey.toString('hex')) // the drive's discovery key for the DHT 22 | console.log(' Writable:', drive.writable) // do we possess the private key of this drive? 23 | console.log(' Version:', drive.version) // what is the version-number of this drive? 24 | 25 | // Loading a drive by an existing key is similar, we just pass the key into the constructor. 26 | const drive2 = hyperdrive(client.corestore(), drive.key) 27 | await drive2.promises.ready() 28 | 29 | // Unlike step-1a, we're using the same storage between the drive copies (Hyperspace's corestore). 30 | // Therefore we will get writable=true. 31 | console.log(chalk.green('✓ Drive copy created in-memory:')) 32 | console.log(' Key:', drive2.key.toString('hex')) 33 | console.log(' Writable:', drive2.writable) 34 | 35 | // Don't forget to cleanup your simulator. 36 | await cleanup() 37 | } 38 | -------------------------------------------------------------------------------- /hyperdrive/step-2.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk') 2 | const pump = require('pump') 3 | const createHyperspaceSimulator = require('hyperspace/simulator') 4 | const hyperdrive = require('hyperdrive') 5 | 6 | start() 7 | 8 | async function start () { 9 | // Let's start by creating a new hyperdrive. 10 | const { client, cleanup } = await createHyperspaceSimulator() 11 | const drive = hyperdrive(client.corestore(), null) 12 | await drive.promises.ready() 13 | 14 | console.log(chalk.green('✓ Drive created in-memory:')) 15 | console.log(' Key:', drive.key.toString('hex')) 16 | 17 | // Many of the functions on Hyperdrive mirror the NodeJS "fs" module. 18 | 19 | await drive.promises.writeFile('/hello.txt', 'World') 20 | console.log(chalk.green('✓ writeFile(/hello.txt)')) 21 | 22 | const st = await drive.promises.stat('/hello.txt') 23 | console.log(chalk.green('✓ stat(/hello.txt)')) 24 | console.log(' Is Directory:', st.isDirectory()) 25 | console.log(' Is File:', st.isFile()) 26 | console.log(' Size (in bytes):', st.size) 27 | console.log(' Size (in blocks):', st.blocks) 28 | 29 | const content = await drive.promises.readFile('/hello.txt', 'utf8') 30 | console.log(chalk.green('✓ readFile(/hello.txt)')) 31 | console.log(' Content:', content) 32 | const list1 = await drive.promises.readdir('/') 33 | console.log(chalk.green('✓ readdir(/)')) 34 | console.log(' Listing:', list1) 35 | const list2 = await drive.promises.readdir('/', {recursive: true, includeStats: true}) 36 | console.log(chalk.green('✓ readdir(/, {recursive: true, includeStats: true})')) 37 | console.log(' Listing:', list2.map(item => ({name: item.name, path: item.path, stat: {isFile: item.stat.isFile()}}))) 38 | 39 | await drive.promises.mkdir('/dir') 40 | console.log(chalk.green('✓ mkdir(/dir)')) 41 | await drive.promises.rmdir('/dir') 42 | console.log(chalk.green('✓ rmdir(/dir)')) 43 | 44 | // You can also read and write using streams. 45 | // Let's use streams to copy a file. 46 | 47 | await new Promise((resolve, reject) => { 48 | pump( 49 | drive.createReadStream('/hello.txt'), 50 | drive.createWriteStream('/copy.txt'), 51 | err => { 52 | if (err) reject(err) 53 | else resolve(err) 54 | } 55 | ) 56 | }) 57 | const st2 = await drive.promises.stat('/copy.txt') 58 | console.log(chalk.green('✓ Copy via streams')) 59 | console.log(' Copied file size is equal:', st.size === st2.size) 60 | 61 | await drive.promises.unlink('/copy.txt') // delete the copy 62 | console.log(chalk.green('✓ unlink(/copy.txt)')) 63 | 64 | // Don't forget to cleanup your simulator. 65 | await cleanup() 66 | } 67 | -------------------------------------------------------------------------------- /hyperdrive/step-3.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk') 2 | const createHyperspaceSimulator = require('hyperspace/simulator') 3 | const hyperdrive = require('hyperdrive') 4 | 5 | start() 6 | 7 | async function start () { 8 | // Let's start by creating a new hyperdrive. 9 | const { client, cleanup } = await createHyperspaceSimulator() 10 | const drive = hyperdrive(client.corestore(), null) 11 | await drive.promises.ready() 12 | 13 | console.log(chalk.green('✓ Drive created in-memory:')) 14 | console.log(' Key:', drive.key.toString('hex')) 15 | 16 | // Let's write a file and capture a checkout at this time. 17 | await drive.promises.writeFile('/hello.txt', 'world') 18 | const frozen = drive.checkout(drive.version) 19 | 20 | // Now let's delete the file... 21 | await drive.promises.unlink('/hello.txt') 22 | 23 | // ...and output the difference. 24 | console.log(chalk.green('✓ Diffing version', drive.version, 'with version', frozen.version)) 25 | for await (let change of drive.createDiffStream(frozen)) { 26 | console.log(' Change:', change.type, change.name, change.previous) 27 | } 28 | 29 | // Tag the current version as "tag1". 30 | await drive.promises.createTag('tag1', drive.version) 31 | console.log(chalk.green('✓ Created a version tag: "tag1"')) 32 | 33 | // Write a new file. 34 | await drive.promises.writeFile('/new.txt', 'This is new') 35 | 36 | // Fetch the tagged version's seq number. 37 | const tag1Version = await drive.promises.getTaggedVersion('tag1') 38 | console.log(chalk.green('✓ Fetched a version tag: "tag1"')) 39 | console.log(' "tag1" ->', tag1Version) 40 | 41 | // Output the diff 42 | console.log(chalk.green('✓ Diffing version', drive.version, 'with version', tag1Version)) 43 | for await (let change of drive.createDiffStream(tag1Version)) { 44 | console.log(' Change:', change.type, change.name, change.seq, {isFile: change.value.isFile(), size: change.value.size}) 45 | } 46 | 47 | // Don't forget to cleanup your simulator. 48 | await cleanup() 49 | } 50 | -------------------------------------------------------------------------------- /hyperspace/1-start-servers.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk') 2 | const { Server: HyperspaceServer } = require('hyperspace') 3 | 4 | start() 5 | 6 | async function start () { 7 | // Create one server to simulate your local Hyperspace instance. 8 | const localServer = new HyperspaceServer({ 9 | storage: './storage/hyperspace-storage-1', 10 | host: 'hyperspace-demo-1' 11 | }) 12 | // Create a second server to simulate a remote peer. 13 | const remoteServer = new HyperspaceServer({ 14 | storage: './storage/hyperspace-storage-2', 15 | host: 'hyperspace-demo-2' 16 | }) 17 | await localServer.ready() 18 | await remoteServer.ready() 19 | console.log('Both Hyperspace server are listening...') 20 | 21 | // Print some client connection/disconnection events. 22 | localServer.on('client-open', () => { 23 | console.log(chalk.green('(local) A HyperspaceClient has connected')) 24 | }) 25 | localServer.on('client-close', () => { 26 | console.log(chalk.green('(local) A HyperspaceClient has disconnected')) 27 | }) 28 | 29 | remoteServer.on('client-open', () => { 30 | console.log(chalk.blue('(remote) A HyperspaceClient has connected')) 31 | }) 32 | remoteServer.on('client-close', () => { 33 | console.log(chalk.blue('(remote) A HyperspaceClient has disconnected')) 34 | }) 35 | 36 | process.on('SIGINT', cleanup) 37 | 38 | async function cleanup () { 39 | console.log('Hyperspace servers are shutting down...') 40 | await localServer.close() 41 | await remoteServer.close() 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /hyperspace/2-replicate-hypercores.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk') 2 | const { Client: HyperspaceClient } = require('hyperspace') 3 | 4 | start() 5 | 6 | async function start () { 7 | // Create a client that's connected to the "local" peer. 8 | const localClient = new HyperspaceClient({ 9 | host: 'hyperspace-demo-1' 10 | }) 11 | 12 | // Create a client that's connected to the "remote" peer. 13 | const remoteClient = new HyperspaceClient({ 14 | host: 'hyperspace-demo-2' 15 | }) 16 | 17 | // Now let's replicate a Hypercore between both servers. 18 | 19 | // First, create the Hypercore on the local instance. 20 | var sharedKey = null 21 | { 22 | // Create a new RemoteCorestore. 23 | const store = localClient.corestore() 24 | 25 | // Create a fresh Remotehypercore. 26 | const core = store.get({ 27 | valueEncoding: 'utf-8' 28 | }) 29 | 30 | // Append two blocks to the RemoteHypercore. 31 | await core.append(['hello', 'world']) 32 | 33 | // Log when the core has any new peers. 34 | core.on('peer-add', () => { 35 | console.log(chalk.blue('(local) Replicating with a new peer.')) 36 | }) 37 | 38 | // Start seeding the Hypercore on the Hyperswarm network. 39 | localClient.replicate(core) 40 | 41 | sharedKey = core.key 42 | } 43 | 44 | // Now, create a clone on the remote instance, and read the first two blocks. 45 | { 46 | // Create a new RemoteCorestore. 47 | const store = remoteClient.corestore() 48 | 49 | // Create a fresh Remotehypercore. 50 | // Here we'll get a core using the shared key from above. 51 | const core = store.get({ 52 | key: sharedKey, 53 | valueEncoding: 'utf-8' 54 | }) 55 | 56 | // Log when the core has any new peers. 57 | core.on('peer-add', () => { 58 | console.log(chalk.blue('(remote) Replicating with a new peer.')) 59 | }) 60 | 61 | // Start seeding the Hypercore (this will connect to the first Hyperspace instance) 62 | remoteClient.replicate(core) 63 | 64 | // The core should not have one connected peer, so we can read the first two blocks. 65 | console.log(chalk.green('First two blocks:', [ 66 | await core.get(0), 67 | await core.get(1) 68 | ])) 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /hyperspace/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hyperspace-walkthrough", 3 | "version": "1.0.0", 4 | "description": "Getting started with Hyperspace", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [ 10 | "hyperspace" 11 | ], 12 | "author": "Andrew Osheroff ", 13 | "license": "MIT", 14 | "dependencies": { 15 | "chalk": "^4.1.0", 16 | "hyperspace": "^3.17.0" 17 | } 18 | } 19 | --------------------------------------------------------------------------------