From 4f73657a9fd788530c32b05ed71a879e3c62e8d2 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Tue, 8 Jan 2019 12:21:24 +0100 Subject: [PATCH 01/60] generate an eph key and include it in requests --- recover/async/request.js | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/recover/async/request.js b/recover/async/request.js index 3e1b9a5..d40bc3b 100644 --- a/recover/async/request.js +++ b/recover/async/request.js @@ -3,6 +3,7 @@ const pull = require('pull-stream') const getContent = require('ssb-msg-content') const { isMsgId, isFeed } = require('ssb-ref') const { isRequest } = require('ssb-dark-crystal-schema') +const ephemeralKeys = require('ephemeral-keys') const PullShardsByRoot = require('../../shard/pull/by-root') @@ -26,15 +27,22 @@ module.exports = function (server) { recipients ? pull.filter(isShardForNamedRecipient) : pull.through(), - pull.map(shard => { + pull.asyncMap((shard, cb) => { const { recps } = getContent(shard) - return { - type: 'invite', // is over-written by invites.async.private.publish - version: '1', // ditto - root: rootId, - recps, - body: "Hi you've been holding a shard for me, can I please have it back?" - } + + // TODO: not sure if we need to tell level that dbkey is an object + const dbKey = { rootId, recp: recps.find(notMe) } + + ephemeralKeys.generateAndStore(dbKey, (err, ephPublicKey) => { + if (err) cb(err) + cb(null, { + type: 'invite', // is over-written by invites.async.private.publish + version: '1', // ditto + root: rootId, + recps, + body: ephPublicKey + }) + }) }), pull.filter(isRequest), pull.collect((err, requests) => { @@ -55,6 +63,10 @@ module.exports = function (server) { return recps.some(r => recipients.includes(r)) } } + + function notMe (recp) { + return recp !== server.id + } } function recpsValid (recipients) { @@ -67,3 +79,4 @@ function recpsValid (recipients) { return feedIds.length === recipients.length } + From b6c736d4dc825327fbfdd4013f49f5d4b0fb4161 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Thu, 10 Jan 2019 13:00:01 +0100 Subject: [PATCH 02/60] encrypt returned shards --- package-lock.json | 3384 ++++++++++++++++------------ recover/async/reply.js | 16 +- recover/async/request.js | 3 +- test/recover/async/request.test.js | 1 + 4 files changed, 1974 insertions(+), 1430 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3f5fde0..b5d63bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-4.0.3.tgz", "integrity": "sha512-qsIHFQy0u17JqSY+3ZUT+ykqxYY17yOfvAsLkFkw8kSQqi05d1jyj0bCuSX6sjYlXuY9cKpgUt5EudQdP4aXyA==", "requires": { - "xtend": "4.0.1" + "xtend": "~4.0.0" } }, "acorn": { @@ -30,10 +30,10 @@ "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", "dev": true, "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "ajv-keywords": { @@ -48,11 +48,11 @@ "integrity": "sha512-KE27h781ueGONLqSBY2ik6LJRr9vo0L/i3GGhtQgJfCk0MO2QNSgrXZVCk2t7UeZKYTxcTfl+yBgcZWqBiAGPQ==", "dev": true, "requires": { - "hashlru": "2.3.0", - "int53": "0.2.4", - "mkdirp": "0.5.1", + "hashlru": "^2.1.0", + "int53": "^0.2.4", + "mkdirp": "^0.5.1", "obv": "0.0.0", - "uint48be": "1.0.2" + "uint48be": "^1.0.1" } }, "ansi-escapes": { @@ -77,8 +77,8 @@ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" } }, "append-batch": { @@ -97,8 +97,8 @@ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "argparse": { @@ -107,7 +107,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "arr-diff": { @@ -116,7 +116,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "arr-flatten": { @@ -137,8 +137,8 @@ "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "dev": true, "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.12.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" } }, "array-union": { @@ -147,7 +147,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -210,7 +210,7 @@ "integrity": "sha1-KPUTk92LuL2q2XI0JRm/CWIaNaM=", "dev": true, "requires": { - "unherit": "1.1.1" + "unherit": "^1.0.0" } }, "babel-code-frame": { @@ -218,9 +218,9 @@ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, "babel-core": { @@ -228,25 +228,25 @@ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.6.0", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.11", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" } }, "babel-generator": { @@ -254,14 +254,14 @@ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.11", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" } }, "babel-helper-call-delegate": { @@ -269,10 +269,10 @@ "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-get-function-arity": { @@ -280,8 +280,8 @@ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-hoist-variables": { @@ -289,8 +289,8 @@ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helpers": { @@ -298,8 +298,8 @@ "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-messages": { @@ -307,7 +307,7 @@ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-check-es2015-constants": { @@ -315,7 +315,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -323,7 +323,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -331,11 +331,11 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.11" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -343,8 +343,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-destructuring": { @@ -352,7 +352,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -360,12 +360,12 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -373,8 +373,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-spread": { @@ -382,7 +382,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-template-literals": { @@ -390,7 +390,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-preset-es2040": { @@ -398,15 +398,15 @@ "resolved": "https://registry.npmjs.org/babel-preset-es2040/-/babel-preset-es2040-1.1.1.tgz", "integrity": "sha1-QIzDNyRwggXHgGZ7kw+njfW8j5Q=", "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-template-literals": "6.22.0" + "babel-plugin-check-es2015-constants": "^6.8.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.8.0", + "babel-plugin-transform-es2015-block-scoping": "^6.9.0", + "babel-plugin-transform-es2015-computed-properties": "^6.8.0", + "babel-plugin-transform-es2015-destructuring": "^6.9.0", + "babel-plugin-transform-es2015-parameters": "^6.9.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.8.0", + "babel-plugin-transform-es2015-spread": "^6.8.0", + "babel-plugin-transform-es2015-template-literals": "^6.8.0" } }, "babel-register": { @@ -414,13 +414,13 @@ "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "requires": { - "babel-core": "6.26.3", - "babel-runtime": "6.26.0", - "core-js": "2.6.1", - "home-or-tmp": "2.0.0", - "lodash": "4.17.11", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" } }, "babel-runtime": { @@ -428,8 +428,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.6.1", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "babel-template": { @@ -437,11 +437,11 @@ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.11" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -449,15 +449,15 @@ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.11" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" } }, "babel-types": { @@ -465,10 +465,10 @@ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.11", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, "babylon": { @@ -493,13 +493,13 @@ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { @@ -508,7 +508,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -517,7 +517,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -526,7 +526,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -535,9 +535,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -586,8 +586,8 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "requires": { - "readable-stream": "2.3.6", - "safe-buffer": "5.1.2" + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" } }, "blake2s": { @@ -601,7 +601,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -611,9 +611,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.3" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "broadcast-stream": { @@ -632,8 +632,8 @@ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "requires": { - "buffer-alloc-unsafe": "1.1.0", - "buffer-fill": "1.0.0" + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, "buffer-alloc-unsafe": { @@ -670,8 +670,8 @@ "integrity": "sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4=", "dev": true, "requires": { - "bytewise-core": "1.2.3", - "typewise": "1.0.3" + "bytewise-core": "^1.2.2", + "typewise": "^1.0.3" } }, "bytewise-core": { @@ -680,7 +680,7 @@ "integrity": "sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI=", "dev": true, "requires": { - "typewise-core": "1.2.0" + "typewise-core": "^1.2" } }, "cache-base": { @@ -689,15 +689,15 @@ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" }, "dependencies": { "isobject": { @@ -714,7 +714,7 @@ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "0.2.0" + "callsites": "^0.2.0" } }, "callsites": { @@ -739,11 +739,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "character-entities": { @@ -786,11 +786,11 @@ "resolved": "https://registry.npmjs.org/chloride/-/chloride-2.2.10.tgz", "integrity": "sha512-CbU1ISGiB2JBV6PDXx7hkl8D94d2TPD1BANUMFbr8rZYKJi8De2d3Hu2XDIOLAhXf+8yhoFOdjtLG6fxz3QByQ==", "requires": { - "is-electron": "2.2.0", - "sodium-browserify": "1.2.4", - "sodium-browserify-tweetnacl": "0.2.3", - "sodium-chloride": "1.1.2", - "sodium-native": "2.2.3" + "is-electron": "^2.0.0", + "sodium-browserify": "^1.2.4", + "sodium-browserify-tweetnacl": "^0.2.2", + "sodium-chloride": "^1.1.0", + "sodium-native": "^2.1.6" } }, "chloride-test": { @@ -798,7 +798,7 @@ "resolved": "https://registry.npmjs.org/chloride-test/-/chloride-test-1.2.2.tgz", "integrity": "sha1-F4aGqF6SeARREulujHkXk/mhCuo=", "requires": { - "json-buffer": "2.0.11" + "json-buffer": "^2.0.11" } }, "chokidar": { @@ -807,14 +807,15 @@ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "dev": true, "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.2.1" + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" } }, "chownr": { @@ -834,10 +835,10 @@ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -846,7 +847,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "isobject": { @@ -863,7 +864,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "cli-width": { @@ -877,9 +878,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -897,8 +898,8 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -906,7 +907,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -934,8 +935,8 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color-convert": { @@ -963,9 +964,9 @@ "resolved": "https://registry.npmjs.org/compare-at-paths/-/compare-at-paths-1.0.0.tgz", "integrity": "sha512-Ke1ejo/RZ+Hzku4gcW34uPMOR4Cpq87MAotELgV9mwiAzDN726cu+eWo0zWg1vRIfyf6yK5bW9uIW+c/SksQ5w==", "requires": { - "libnested": "1.4.1", - "tape": "4.9.2", - "typewiselite": "1.0.0" + "libnested": "^1.3.2", + "tape": "^4.9.1", + "typewiselite": "^1.0.0" } }, "component-emitter": { @@ -985,10 +986,10 @@ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "buffer-from": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "console-control-strings": { @@ -1002,9 +1003,9 @@ "integrity": "sha1-aHTx6TX8qZ0EjK6qrZoK6wILzOA=", "dev": true, "requires": { - "continuable": "1.2.0", - "continuable-para": "1.2.0", - "continuable-series": "1.2.0" + "continuable": "~1.2.0", + "continuable-para": "~1.2.0", + "continuable-series": "~1.2.0" } }, "contains-path": { @@ -1025,7 +1026,7 @@ "integrity": "sha1-gcdNQXcdjJJ4Ph4A5fEbNNbfx4w=", "dev": true, "requires": { - "continuable": "1.1.8" + "continuable": "~1.1.6" }, "dependencies": { "continuable": { @@ -1042,7 +1043,7 @@ "integrity": "sha1-h88G7FgHFuEN/5X7C4TF8OisrF8=", "dev": true, "requires": { - "continuable": "1.1.8" + "continuable": "~1.1.6" }, "dependencies": { "continuable": { @@ -1059,8 +1060,8 @@ "integrity": "sha1-RFUQ9klFndD8NchyAVFGEicxxYM=", "dev": true, "requires": { - "continuable-hash": "0.1.4", - "continuable-list": "0.1.6" + "continuable-hash": "~0.1.4", + "continuable-list": "~0.1.5" } }, "continuable-series": { @@ -1074,7 +1075,7 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.1" } }, "copy-descriptor": { @@ -1098,11 +1099,11 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "requires": { - "nice-try": "1.0.5", - "path-key": "2.0.1", - "semver": "5.6.0", - "shebang-command": "1.2.0", - "which": "1.3.1" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "debug": { @@ -1135,7 +1136,7 @@ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "requires": { - "mimic-response": "1.0.1" + "mimic-response": "^1.0.0" } }, "deep-equal": { @@ -1159,7 +1160,7 @@ "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-3.0.0.tgz", "integrity": "sha512-ajbXqRPMXRlcdyt0TuWqknOJkp1JgQjGB7xOl2V+ebol7/U11E9h3/nCZAtN1M7djmAJEIhypCUc1tIWxdQAuQ==", "requires": { - "abstract-leveldown": "4.0.3" + "abstract-leveldown": "~4.0.0" } }, "define-properties": { @@ -1167,7 +1168,7 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "requires": { - "object-keys": "1.0.12" + "object-keys": "^1.0.12" } }, "define-property": { @@ -1176,8 +1177,8 @@ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -1186,7 +1187,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1195,7 +1196,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1204,9 +1205,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -1234,12 +1235,12 @@ "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", "dev": true, "requires": { - "find-root": "1.1.0", - "glob": "7.1.3", - "ignore": "3.3.10", - "pkg-config": "1.1.1", - "run-parallel": "1.1.9", - "uniq": "1.0.1" + "find-root": "^1.0.0", + "glob": "^7.0.5", + "ignore": "^3.0.9", + "pkg-config": "^1.1.0", + "run-parallel": "^1.1.2", + "uniq": "^1.0.1" }, "dependencies": { "ignore": { @@ -1260,7 +1261,7 @@ "resolved": "https://registry.npmjs.org/depject/-/depject-4.1.1.tgz", "integrity": "sha1-6/ciCGgsEfx9BRIjxG6223jVYFg=", "requires": { - "libnested": "1.4.1" + "libnested": "^1.1.0" } }, "depnest": { @@ -1268,8 +1269,8 @@ "resolved": "https://registry.npmjs.org/depnest/-/depnest-1.3.0.tgz", "integrity": "sha1-FL2KNh30RdLTT37LNi1sdFcoiVk=", "requires": { - "es2040": "1.2.6", - "libnested": "1.4.1" + "es2040": "^1.2.3", + "libnested": "^1.2.1" } }, "detab": { @@ -1278,7 +1279,7 @@ "integrity": "sha1-AbwqSr57x8xnwwOYCO265HBJoO4=", "dev": true, "requires": { - "repeat-string": "1.6.1" + "repeat-string": "^1.5.2" } }, "detect-indent": { @@ -1286,7 +1287,7 @@ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "detect-libc": { @@ -1305,7 +1306,7 @@ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "2.0.2" + "esutils": "^2.0.2" } }, "duplexer": { @@ -1320,7 +1321,7 @@ "integrity": "sha512-VadGXbWmiFFFTzlUyS/ICPvMEIPTsiVyWNIRj5qXPOj/iuTw9TgOZLRPMjKcik7g0GKb2mT3UMyTfqRj0aArSA==", "dev": true, "requires": { - "heap": "0.2.6" + "heap": "^0.2.6" } }, "ed2curve": { @@ -1328,7 +1329,7 @@ "resolved": "https://registry.npmjs.org/ed2curve/-/ed2curve-0.1.4.tgz", "integrity": "sha1-lKRCSLuH2jXbDv968KpXYWgRf1k=", "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "0.x.x" } }, "elegant-spinner": { @@ -1349,7 +1350,7 @@ "integrity": "sha1-0GPP7prxGMxa7vvC6bPdUIWBXGM=", "dev": true, "requires": { - "emoji-named-characters": "1.0.2" + "emoji-named-characters": "~1.0.2" } }, "encoding-down": { @@ -1357,10 +1358,10 @@ "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-4.0.1.tgz", "integrity": "sha512-AlSE+ugBIpLL0i9if2SlnOZ4oWj/XvBb8tw2Ie/pFB73vdYs5O/6plRyqIgjbZbz8onaL20AAuMP87LWbP56IQ==", "requires": { - "abstract-leveldown": "4.0.3", - "level-codec": "8.0.0", - "level-errors": "1.1.2", - "xtend": "4.0.1" + "abstract-leveldown": "^4.0.0", + "level-codec": "^8.0.0", + "level-errors": "^1.0.4", + "xtend": "^4.0.1" } }, "end-of-stream": { @@ -1368,7 +1369,7 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "requires": { - "once": "1.4.0" + "once": "^1.4.0" } }, "epidemic-broadcast-trees": { @@ -1377,8 +1378,8 @@ "integrity": "sha512-FYCOslXU7OBkz8A9FXsykcpgby3WKcRdLTCr1LivLLSU2nzaO/x86jBGNFEZkezZPx9/Z5fDVX8SGQyXLz8WZQ==", "dev": true, "requires": { - "inherits": "2.0.3", - "push-stream": "10.0.4" + "inherits": "^2.0.3", + "push-stream": "^10.0.0" } }, "errno": { @@ -1386,7 +1387,7 @@ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" } }, "error-ex": { @@ -1395,7 +1396,7 @@ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es-abstract": { @@ -1403,11 +1404,11 @@ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", "requires": { - "es-to-primitive": "1.2.0", - "function-bind": "1.1.1", - "has": "1.0.3", - "is-callable": "1.1.4", - "is-regex": "1.0.4" + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" } }, "es-to-primitive": { @@ -1415,9 +1416,9 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", "requires": { - "is-callable": "1.1.4", - "is-date-object": "1.0.1", - "is-symbol": "1.0.2" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, "es2040": { @@ -1425,9 +1426,9 @@ "resolved": "https://registry.npmjs.org/es2040/-/es2040-1.2.6.tgz", "integrity": "sha512-+sAm7CSGH2+0NMZqm63huevZVoyk8OwF8lVIdwPcNtvZxX3YIITGiui8bfLYS8oNcgCgHNYO+QsgMafwo1OWwg==", "requires": { - "babel-core": "6.26.3", - "babel-preset-es2040": "1.1.1", - "through2": "2.0.5" + "babel-core": "^6.9.1", + "babel-preset-es2040": "^1.1.0", + "through2": "^2.0.1" } }, "escape-string-regexp": { @@ -1441,44 +1442,44 @@ "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", "dev": true, "requires": { - "ajv": "6.6.2", - "babel-code-frame": "6.26.0", - "chalk": "2.4.1", - "cross-spawn": "6.0.5", - "debug": "3.2.6", - "doctrine": "2.1.0", - "eslint-scope": "4.0.0", - "eslint-utils": "1.3.1", - "eslint-visitor-keys": "1.0.0", - "espree": "4.1.0", - "esquery": "1.0.1", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.3", - "globals": "11.9.0", - "ignore": "4.0.6", - "imurmurhash": "0.1.4", - "inquirer": "5.2.0", - "is-resolvable": "1.1.0", - "js-yaml": "3.12.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.11", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.3", - "regexpp": "2.0.1", - "require-uncached": "1.0.3", - "semver": "5.6.0", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "4.0.3", - "text-table": "0.2.0" + "ajv": "^6.5.0", + "babel-code-frame": "^6.26.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.0.0", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.2", + "imurmurhash": "^0.1.4", + "inquirer": "^5.2.0", + "is-resolvable": "^1.1.0", + "js-yaml": "^3.11.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^2.0.0", + "require-uncached": "^1.0.3", + "semver": "^5.5.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^4.0.3", + "text-table": "^0.2.0" }, "dependencies": { "ansi-regex": { @@ -1493,7 +1494,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "chalk": { @@ -1502,9 +1503,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "debug": { @@ -1513,7 +1514,7 @@ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.1.1" + "ms": "^2.1.1" } }, "globals": { @@ -1534,7 +1535,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "supports-color": { @@ -1543,7 +1544,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -1566,8 +1567,8 @@ "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", "dev": true, "requires": { - "debug": "2.6.9", - "resolve": "1.7.1" + "debug": "^2.6.9", + "resolve": "^1.5.0" } }, "eslint-module-utils": { @@ -1576,8 +1577,8 @@ "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", "dev": true, "requires": { - "debug": "2.6.9", - "pkg-dir": "1.0.0" + "debug": "^2.6.8", + "pkg-dir": "^1.0.0" } }, "eslint-plugin-es": { @@ -1586,8 +1587,8 @@ "integrity": "sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw==", "dev": true, "requires": { - "eslint-utils": "1.3.1", - "regexpp": "2.0.1" + "eslint-utils": "^1.3.0", + "regexpp": "^2.0.1" } }, "eslint-plugin-import": { @@ -1596,16 +1597,16 @@ "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", "dev": true, "requires": { - "contains-path": "0.1.0", - "debug": "2.6.9", + "contains-path": "^0.1.0", + "debug": "^2.6.8", "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.3.2", - "eslint-module-utils": "2.2.0", - "has": "1.0.3", - "lodash": "4.17.11", - "minimatch": "3.0.4", - "read-pkg-up": "2.0.0", - "resolve": "1.7.1" + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.0" }, "dependencies": { "doctrine": { @@ -1614,8 +1615,8 @@ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } } } @@ -1626,12 +1627,12 @@ "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", "dev": true, "requires": { - "eslint-plugin-es": "1.4.0", - "eslint-utils": "1.3.1", - "ignore": "4.0.6", - "minimatch": "3.0.4", - "resolve": "1.9.0", - "semver": "5.6.0" + "eslint-plugin-es": "^1.3.1", + "eslint-utils": "^1.3.1", + "ignore": "^4.0.2", + "minimatch": "^3.0.4", + "resolve": "^1.8.1", + "semver": "^5.5.0" }, "dependencies": { "resolve": { @@ -1640,7 +1641,7 @@ "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", "dev": true, "requires": { - "path-parse": "1.0.6" + "path-parse": "^1.0.6" } } } @@ -1657,11 +1658,11 @@ "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", "dev": true, "requires": { - "array-includes": "3.0.3", - "doctrine": "2.1.0", - "has": "1.0.3", - "jsx-ast-utils": "2.0.1", - "prop-types": "15.6.2" + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1", + "prop-types": "^15.6.2" } }, "eslint-plugin-standard": { @@ -1676,8 +1677,8 @@ "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", "dev": true, "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "eslint-utils": { @@ -1698,9 +1699,9 @@ "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", "dev": true, "requires": { - "acorn": "6.0.4", - "acorn-jsx": "5.0.1", - "eslint-visitor-keys": "1.0.0" + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" } }, "esprima": { @@ -1715,7 +1716,7 @@ "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.0.0" } }, "esrecurse": { @@ -1724,7 +1725,7 @@ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -1743,13 +1744,13 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "requires": { - "cross-spawn": "6.0.5", - "get-stream": "4.1.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "exit-hook": { @@ -1764,7 +1765,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "expand-range": { @@ -1773,7 +1774,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.4" + "fill-range": "^2.1.0" } }, "expand-template": { @@ -1798,8 +1799,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -1808,7 +1809,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -1825,9 +1826,9 @@ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.24", - "tmp": "0.0.33" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" } }, "extglob": { @@ -1836,7 +1837,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "fast-deep-equal": { @@ -1868,7 +1869,7 @@ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { @@ -1877,8 +1878,8 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "1.3.4", - "object-assign": "4.1.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "filename-regex": { @@ -1893,11 +1894,11 @@ "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "3.1.1", - "repeat-element": "1.1.3", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "find-root": { @@ -1911,7 +1912,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { - "locate-path": "3.0.0" + "locate-path": "^3.0.0" } }, "flat-cache": { @@ -1920,10 +1921,10 @@ "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", "dev": true, "requires": { - "circular-json": "0.3.3", - "graceful-fs": "4.1.15", - "rimraf": "2.6.2", - "write": "0.2.1" + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" } }, "flumecodec": { @@ -1932,7 +1933,7 @@ "integrity": "sha1-Ns4Gq+Lg4BxE3WnyoWUwWiMgZJs=", "dev": true, "requires": { - "level-codec": "6.2.0" + "level-codec": "^6.2.0" }, "dependencies": { "level-codec": { @@ -1949,12 +1950,12 @@ "integrity": "sha512-mT0v0dY9EkWRGwDtTfavYNv2Z6nrMNlVZCNJD7qxjfPJymfv8kNYB4UvDdBHleHegvzjufjnE73IkRG5DgMjww==", "dev": true, "requires": { - "cont": "1.0.3", - "explain-error": "1.0.4", + "cont": "^1.0.3", + "explain-error": "^1.0.3", "obv": "0.0.1", "pull-cont": "0.0.0", - "pull-looper": "1.0.0", - "pull-stream": "3.6.9" + "pull-looper": "^1.0.0", + "pull-stream": "^3.5.0" }, "dependencies": { "obv": { @@ -1977,17 +1978,17 @@ "integrity": "sha512-KG0TCb+cWuEvnL44xjBhVNu+jRmJ8Msh2b1krYb4FllLwSbjreaCU/hH3uzv+HmUrtU/EhJepcAu79WxLH3EZQ==", "dev": true, "requires": { - "aligned-block-file": "1.1.4", - "append-batch": "0.0.1", - "explain-error": "1.0.4", - "hashlru": "2.3.0", - "int53": "0.2.4", - "looper": "4.0.0", - "ltgt": "2.2.1", + "aligned-block-file": "^1.1.2", + "append-batch": "^0.0.1", + "explain-error": "^1.0.3", + "hashlru": "^2.2.0", + "int53": "^0.2.4", + "looper": "^4.0.0", + "ltgt": "^2.1.3", "obv": "0.0.1", - "pull-cursor": "3.0.0", - "pull-looper": "1.0.0", - "uint48be": "1.0.2" + "pull-cursor": "^3.0.0", + "pull-looper": "^1.0.0", + "uint48be": "^1.0.1" }, "dependencies": { "looper": { @@ -2010,10 +2011,10 @@ "integrity": "sha512-4L52hBelX7dYVAQQ9uPjksqxOCxLwI4NsfEG/+sTM423axT2Poq5cnfdvGm3HzmNowzwDIKtdy429r6PbfKEIw==", "dev": true, "requires": { - "async-single": "1.0.5", - "atomic-file": "1.1.5", + "async-single": "^1.0.5", + "atomic-file": "^1.1.3", "obv": "0.0.1", - "pull-stream": "3.6.9" + "pull-stream": "^3.6.0" }, "dependencies": { "atomic-file": { @@ -2035,16 +2036,16 @@ "resolved": "https://registry.npmjs.org/flumeview-level/-/flumeview-level-3.0.6.tgz", "integrity": "sha512-omfYDMixWGL8Xx/mFl7xoALZvvOePiN/7jzY/kUJz3TR4px55QV4tZMba63QPyKj7NZVAPE61wq//P5sdiqvQw==", "requires": { - "charwise": "3.0.1", - "explain-error": "1.0.4", - "level": "3.0.2", - "ltgt": "2.2.1", - "mkdirp": "0.5.1", + "charwise": "^3.0.1", + "explain-error": "^1.0.4", + "level": "^3.0.1", + "ltgt": "^2.1.3", + "mkdirp": "^0.5.1", "obv": "0.0.0", - "pull-level": "2.0.4", - "pull-paramap": "1.2.2", - "pull-stream": "3.6.9", - "pull-write": "1.1.4" + "pull-level": "^2.0.3", + "pull-paramap": "^1.2.1", + "pull-stream": "^3.5.0", + "pull-write": "^1.1.1" } }, "flumeview-query": { @@ -2052,13 +2053,13 @@ "resolved": "https://registry.npmjs.org/flumeview-query/-/flumeview-query-6.3.0.tgz", "integrity": "sha512-8QBannTFLICARmflhHpXNeR5hh6IzIyJz4XhKTofzmxq/hXEn1un7aF6P6dRQkOwthENDTbSB07eWKqwnYDKtw==", "requires": { - "deep-equal": "1.0.1", - "flumeview-level": "3.0.6", - "map-filter-reduce": "3.2.2", + "deep-equal": "^1.0.1", + "flumeview-level": "^3.0.0", + "map-filter-reduce": "^3.0.7", "pull-flatmap": "0.0.1", - "pull-paramap": "1.2.2", + "pull-paramap": "^1.1.3", "pull-sink-through": "0.0.0", - "pull-stream": "3.6.9" + "pull-stream": "^3.4.0" } }, "flumeview-reduce": { @@ -2067,13 +2068,13 @@ "integrity": "sha512-hMk9g42JrD92PCmNDiET6JGjur09wQrlAUQRPjmsk8LNqDz/tC5upvCfiynIgWUphe8dZMhUHIzOTh75xa1WKA==", "dev": true, "requires": { - "async-single": "1.0.5", - "atomic-file": "1.1.5", - "deep-equal": "1.0.1", + "async-single": "^1.0.5", + "atomic-file": "^1.1.3", + "deep-equal": "^1.0.1", "flumecodec": "0.0.0", "obv": "0.0.0", - "pull-notify": "0.1.1", - "pull-stream": "3.6.9" + "pull-notify": "^0.1.1", + "pull-stream": "^3.5.0" }, "dependencies": { "atomic-file": { @@ -2089,7 +2090,7 @@ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "requires": { - "is-callable": "1.1.4" + "is-callable": "^1.1.3" } }, "for-in": { @@ -2104,7 +2105,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "fragment-cache": { @@ -2113,7 +2114,7 @@ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "0.2.2" + "map-cache": "^0.2.2" } }, "fs-constants": { @@ -2126,6 +2127,535 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -2142,14 +2672,14 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.3" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "generate-function": { @@ -2157,7 +2687,7 @@ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", "requires": { - "is-property": "1.0.2" + "is-property": "^1.0.2" } }, "generate-object-property": { @@ -2165,7 +2695,7 @@ "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", "requires": { - "is-property": "1.0.2" + "is-property": "^1.0.0" } }, "get-caller-file": { @@ -2184,7 +2714,7 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "requires": { - "pump": "3.0.0" + "pump": "^3.0.0" }, "dependencies": { "pump": { @@ -2192,8 +2722,8 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } } } @@ -2214,12 +2744,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-base": { @@ -2228,8 +2758,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" } }, "glob-parent": { @@ -2238,7 +2768,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, "globals": { @@ -2252,12 +2782,12 @@ "integrity": "sha1-CA9UVJ7BuCpsYOYx/ILhIR2+lfg=", "dev": true, "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "6.0.4", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^6.0.1", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "dependencies": { "glob": { @@ -2266,11 +2796,11 @@ "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", "dev": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } @@ -2286,7 +2816,7 @@ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -2294,7 +2824,7 @@ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -2325,9 +2855,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" }, "dependencies": { "isobject": { @@ -2344,8 +2874,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { @@ -2354,7 +2884,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -2363,7 +2893,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -2374,7 +2904,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -2402,8 +2932,8 @@ "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, "hoox": { @@ -2424,7 +2954,7 @@ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore": { @@ -2449,8 +2979,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -2469,19 +2999,19 @@ "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", "dev": true, "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.4.1", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.11", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rxjs": "5.5.12", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" }, "dependencies": { "ansi-escapes": { @@ -2502,7 +3032,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "chalk": { @@ -2511,9 +3041,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "cli-cursor": { @@ -2522,7 +3052,7 @@ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "2.0.0" + "restore-cursor": "^2.0.0" } }, "is-fullwidth-code-point": { @@ -2537,7 +3067,7 @@ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "restore-cursor": { @@ -2546,8 +3076,8 @@ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "string-width": { @@ -2556,8 +3086,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -2566,7 +3096,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "supports-color": { @@ -2575,7 +3105,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -2591,7 +3121,7 @@ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "requires": { - "loose-envify": "1.4.0" + "loose-envify": "^1.0.0" } }, "invert-kv": { @@ -2616,7 +3146,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-alphabetical": { @@ -2631,8 +3161,8 @@ "integrity": "sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==", "dev": true, "requires": { - "is-alphabetical": "1.0.2", - "is-decimal": "1.0.2" + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" } }, "is-arrayish": { @@ -2647,7 +3177,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.12.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -2662,7 +3192,7 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-callable": { @@ -2681,7 +3211,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-date-object": { @@ -2701,9 +3231,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { @@ -2731,7 +3261,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -2751,7 +3281,7 @@ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -2759,7 +3289,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-glob": { @@ -2768,7 +3298,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-hexadecimal": { @@ -2787,11 +3317,11 @@ "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz", "integrity": "sha512-mG0f/unGX1HZ5ep4uhRaPOS8EkAY8/j6mDRMJrutq4CqhoJWYp7qAlonIPy3TV7p3ju4TK9fo/PbnoksWmsp5Q==", "requires": { - "generate-function": "2.3.1", - "generate-object-property": "1.2.0", - "is-my-ip-valid": "1.0.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" } }, "is-number": { @@ -2800,7 +3330,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-plain-object": { @@ -2809,7 +3339,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -2848,7 +3378,7 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "requires": { - "has": "1.0.3" + "has": "^1.0.1" } }, "is-resolvable": { @@ -2867,7 +3397,7 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", "requires": { - "has-symbols": "1.0.0" + "has-symbols": "^1.0.0" } }, "is-valid-domain": { @@ -2911,8 +3441,8 @@ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "4.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "jsesc": { @@ -2959,7 +3489,7 @@ "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", "dev": true, "requires": { - "array-includes": "3.0.3" + "array-includes": "^3.0.3" } }, "kind-of": { @@ -2968,7 +3498,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "layered-graph": { @@ -2977,10 +3507,10 @@ "integrity": "sha512-OaV2u8eMWxUkVYTGhXKDBjFBVPONubDJfnw6dy6ndZDTANfZeeapq35x3oWnqpW1GxbulXuf7fMhxy97r+k2Sg==", "dev": true, "requires": { - "dynamic-dijkstra": "1.0.1", - "pull-cont": "0.1.1", - "pull-notify": "0.1.1", - "pull-stream": "3.6.9" + "dynamic-dijkstra": "^1.0.0", + "pull-cont": "^0.1.1", + "pull-notify": "^0.1.1", + "pull-stream": "^3.6.9" } }, "lcid": { @@ -2988,7 +3518,7 @@ "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "requires": { - "invert-kv": "2.0.0" + "invert-kv": "^2.0.0" } }, "level": { @@ -2996,9 +3526,9 @@ "resolved": "https://registry.npmjs.org/level/-/level-3.0.2.tgz", "integrity": "sha512-2qYbbiptPsPWGUI+AgB1gTNXqIjPpALRqrQyNx1zWYNZxhhuzEj/IE4Unu9weEBnsUEocfYe56xOGlAceb8/Fg==", "requires": { - "level-packager": "2.1.1", - "leveldown": "3.0.2", - "opencollective-postinstall": "2.0.1" + "level-packager": "^2.0.2", + "leveldown": "^3.0.0", + "opencollective-postinstall": "^2.0.0" } }, "level-codec": { @@ -3011,7 +3541,7 @@ "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.1.2.tgz", "integrity": "sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w==", "requires": { - "errno": "0.1.7" + "errno": "~0.1.1" } }, "level-iterator-stream": { @@ -3019,9 +3549,9 @@ "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz", "integrity": "sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig==", "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "xtend": "4.0.1" + "inherits": "^2.0.1", + "readable-stream": "^2.0.5", + "xtend": "^4.0.0" } }, "level-packager": { @@ -3029,8 +3559,8 @@ "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-2.1.1.tgz", "integrity": "sha512-6l3G6dVkmdvHwOJrEA9d9hL6SSFrzwjQoLP8HsvohOgfY/8Z9LyTKNCM5Gc84wtsUWCuIHu6r+S6WrCtTWUJCw==", "requires": { - "encoding-down": "4.0.1", - "levelup": "2.0.2" + "encoding-down": "~4.0.0", + "levelup": "^2.0.0" } }, "level-post": { @@ -3038,7 +3568,7 @@ "resolved": "https://registry.npmjs.org/level-post/-/level-post-1.0.7.tgz", "integrity": "sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==", "requires": { - "ltgt": "2.2.1" + "ltgt": "^2.1.2" } }, "level-sublevel": { @@ -3047,14 +3577,14 @@ "integrity": "sha512-SBSR60x+dghhwGUxPKS+BvV1xNqnwsEUBKmnFepPaHJ6VkBXyPK9SImGc3K2BkwBfpxlt7GKkBNlCnrdufsejA==", "dev": true, "requires": { - "bytewise": "1.1.0", - "levelup": "0.19.1", - "ltgt": "2.1.3", - "pull-defer": "0.2.3", - "pull-level": "2.0.4", - "pull-stream": "3.6.9", - "typewiselite": "1.0.0", - "xtend": "4.0.1" + "bytewise": "~1.1.0", + "levelup": "~0.19.0", + "ltgt": "~2.1.1", + "pull-defer": "^0.2.2", + "pull-level": "^2.0.3", + "pull-stream": "^3.6.8", + "typewiselite": "~1.0.0", + "xtend": "~4.0.0" }, "dependencies": { "abstract-leveldown": { @@ -3063,7 +3593,7 @@ "integrity": "sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA=", "dev": true, "requires": { - "xtend": "3.0.0" + "xtend": "~3.0.0" }, "dependencies": { "xtend": { @@ -3080,7 +3610,7 @@ "integrity": "sha1-yba8oI0bwuoA/Ir7Txpf0eHGbk4=", "dev": true, "requires": { - "readable-stream": "1.0.34" + "readable-stream": "~1.0.26" } }, "deferred-leveldown": { @@ -3089,7 +3619,7 @@ "integrity": "sha1-LO8fER4cV4cNi7uK8mUOWHzS9bQ=", "dev": true, "requires": { - "abstract-leveldown": "0.12.4" + "abstract-leveldown": "~0.12.1" } }, "isarray": { @@ -3104,13 +3634,13 @@ "integrity": "sha1-86anIFJyxLXzXkEv8ASgOgrt9Qs=", "dev": true, "requires": { - "bl": "0.8.2", - "deferred-leveldown": "0.2.0", - "errno": "0.1.7", - "prr": "0.0.0", - "readable-stream": "1.0.34", - "semver": "5.1.1", - "xtend": "3.0.0" + "bl": "~0.8.1", + "deferred-leveldown": "~0.2.0", + "errno": "~0.1.1", + "prr": "~0.0.0", + "readable-stream": "~1.0.26", + "semver": "~5.1.0", + "xtend": "~3.0.0" }, "dependencies": { "xtend": { @@ -3139,10 +3669,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "semver": { @@ -3164,11 +3694,11 @@ "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-3.0.2.tgz", "integrity": "sha512-+ANRScj1npQQzv6e4DYAKRjVQZZ+ahMoubKrNP68nIq+l9bYgb+WiXF+14oTcQTg2f7qE9WHGW7rBG9nGSsA+A==", "requires": { - "abstract-leveldown": "4.0.3", - "bindings": "1.3.1", - "fast-future": "1.0.2", - "nan": "2.10.0", - "prebuild-install": "4.0.0" + "abstract-leveldown": "~4.0.0", + "bindings": "~1.3.0", + "fast-future": "~1.0.2", + "nan": "~2.10.0", + "prebuild-install": "^4.0.0" } }, "levelup": { @@ -3176,10 +3706,10 @@ "resolved": "https://registry.npmjs.org/levelup/-/levelup-2.0.2.tgz", "integrity": "sha512-us+nTLUyd/eLnclYYddOCdAVw1hnymGx/9p4Jr5ThohStsjLqMVmbYiz6/SYFZEPXNF+AKQSvh6fA2e2KZpC8w==", "requires": { - "deferred-leveldown": "3.0.0", - "level-errors": "1.1.2", - "level-iterator-stream": "2.0.3", - "xtend": "4.0.1" + "deferred-leveldown": "~3.0.0", + "level-errors": "~1.1.0", + "level-iterator-stream": "~2.0.0", + "xtend": "~4.0.0" } }, "levn": { @@ -3188,8 +3718,8 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "libnested": { @@ -3216,10 +3746,10 @@ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "graceful-fs": "4.1.15", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "locate-path": { @@ -3227,8 +3757,8 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "lodash": { @@ -3257,7 +3787,7 @@ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", "dev": true, "requires": { - "chalk": "1.1.3" + "chalk": "^1.0.0" } }, "log-update": { @@ -3266,8 +3796,8 @@ "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "cli-cursor": "1.0.2" + "ansi-escapes": "^1.0.0", + "cli-cursor": "^1.0.2" } }, "longest-streak": { @@ -3286,7 +3816,7 @@ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0 || ^4.0.0" } }, "lossy-store": { @@ -3295,8 +3825,8 @@ "integrity": "sha1-Vi4qkgPYZh9g6HEt5Af72t8nXck=", "dev": true, "requires": { - "mkdirp": "0.5.1", - "tape": "4.9.2" + "mkdirp": "^0.5.1", + "tape": "^4.6.3" } }, "lru-cache": { @@ -3305,8 +3835,8 @@ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "ltgt": { @@ -3319,7 +3849,7 @@ "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "requires": { - "p-defer": "1.0.0" + "p-defer": "^1.0.0" } }, "map-cache": { @@ -3333,12 +3863,12 @@ "resolved": "https://registry.npmjs.org/map-filter-reduce/-/map-filter-reduce-3.2.2.tgz", "integrity": "sha512-p+NIGQbEBxlw/qWwG+NME98G/9kjOQI70hmaH8QEZtIWfTmfMYLKQW4PJChP4izPHNAxlOfv/qefP0+2ZXn84A==", "requires": { - "binary-search": "1.3.4", - "compare-at-paths": "1.0.0", + "binary-search": "^1.2.0", + "compare-at-paths": "^1.0.0", "pull-sink-through": "0.0.0", - "pull-sort": "1.0.2", - "pull-stream": "3.6.9", - "typewiselite": "1.0.0" + "pull-sort": "^1.0.1", + "pull-stream": "^3.4.3", + "typewiselite": "^1.0.0" } }, "map-merge": { @@ -3353,7 +3883,7 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, "markdown-table": { @@ -3374,10 +3904,10 @@ "integrity": "sha1-wEiRiDwoyDYC4dBrBaEQN+NZtMg=", "dev": true, "requires": { - "minimist": "1.2.0", - "remark": "3.2.3", - "remark-html": "2.0.2", - "word-wrap": "1.2.3" + "minimist": "^1.2.0", + "remark": "^3.2.2", + "remark-html": "^2.0.2", + "word-wrap": "^1.1.0" } }, "mem": { @@ -3385,9 +3915,9 @@ "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", "requires": { - "map-age-cleaner": "0.1.3", - "mimic-fn": "1.2.0", - "p-is-promise": "1.1.0" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^1.1.0" } }, "micromatch": { @@ -3396,19 +3926,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "mimic-fn": { @@ -3426,7 +3956,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -3440,8 +3970,8 @@ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -3450,7 +3980,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -3492,23 +4022,23 @@ "integrity": "sha512-z1nRV/iLDQQ2ih1lkOmOod4OLaaYk1LayU5mUJTGItekthyuWVWT+uuMp7mI1zXczEVuWky4MaDXuekKHkrJUQ==", "dev": true, "requires": { - "blake2s": "1.0.1", - "cont": "1.0.3", - "explain-error": "1.0.4", - "mkdirp": "0.5.1", - "pull-cat": "1.1.11", - "pull-catch": "1.0.0", - "pull-defer": "0.2.3", - "pull-file": "0.5.0", - "pull-glob": "1.0.7", - "pull-live": "1.0.1", - "pull-notify": "0.1.1", - "pull-paramap": "1.2.2", - "pull-stream": "3.6.9", - "pull-write-file": "0.2.4", - "rc": "1.2.8", - "rimraf": "2.2.8", - "stream-to-pull-stream": "1.7.2" + "blake2s": "~1.0.1", + "cont": "~1.0.1", + "explain-error": "~1.0.1", + "mkdirp": "~0.5.0", + "pull-cat": "^1.1.8", + "pull-catch": "^1.0.0", + "pull-defer": "^0.2.2", + "pull-file": "^0.5.0", + "pull-glob": "~1.0.6", + "pull-live": "^1.0.0", + "pull-notify": "^0.1.1", + "pull-paramap": "^1.2.2", + "pull-stream": "^3.6.2", + "pull-write-file": "^0.2.1", + "rc": "~1.2.8", + "rimraf": "~2.2.8", + "stream-to-pull-stream": "^1.7.2" }, "dependencies": { "pull-file": { @@ -3534,8 +4064,8 @@ "integrity": "sha512-hVaXryaqJ3vvKjRNcOCEadzgO99nR+haxlptswr3vRvgavbK/Y/I7/Nat12WIQno2/A8+nkbE+ZcrsN3UDbtQw==", "dev": true, "requires": { - "pull-stream": "3.6.9", - "stream-to-pull-stream": "1.7.2" + "pull-stream": "^3.4.3", + "stream-to-pull-stream": "^1.7.0" } }, "multicb": { @@ -3548,13 +4078,13 @@ "resolved": "https://registry.npmjs.org/multiserver/-/multiserver-1.13.7.tgz", "integrity": "sha512-nQKAe6+u7nWJY29pJjegltw0ROj2bDc2bCTm9Bnr4EQrp5H5Tav+ESUjgl3D4vuQgCeveb4h+CtLtjB8QnK1Dw==", "requires": { - "pull-cat": "1.1.11", - "pull-stream": "3.6.9", - "pull-ws": "3.3.1", - "secret-handshake": "1.1.14", + "pull-cat": "~1.1.5", + "pull-stream": "^3.6.1", + "pull-ws": "^3.3.0", + "secret-handshake": "^1.1.12", "separator-escape": "0.0.0", "socks": "2.2.1", - "stream-to-pull-stream": "1.7.2" + "stream-to-pull-stream": "^1.7.2" } }, "multiserver-address": { @@ -3562,7 +4092,7 @@ "resolved": "https://registry.npmjs.org/multiserver-address/-/multiserver-address-1.0.1.tgz", "integrity": "sha512-IfZMAGs9onCLkYNSnNBri3JxuvhQYllMyh3W9ry86iEDcfW9uPVsHTHDsjDxQtL+dPq3byshmA+Y4LN2wLHwNw==", "requires": { - "nearley": "2.16.0" + "nearley": "^2.15.1" } }, "mutant": { @@ -3571,7 +4101,7 @@ "integrity": "sha1-kEh1RvcAs8KKqApD0c99M48wdYE=", "requires": { "browser-split": "0.0.1", - "xtend": "4.0.1" + "xtend": "^4.0.1" } }, "mute-stream": { @@ -3585,11 +4115,11 @@ "resolved": "https://registry.npmjs.org/muxrpc/-/muxrpc-6.4.2.tgz", "integrity": "sha512-1wRnouHgHO3JYN3xbyzQGTFsd/wo12/zaikmQusP8ma+lmL+ewNvuvuwKSEJasKQTRnbTwbzh/OPdt9N76CA4g==", "requires": { - "explain-error": "1.0.4", - "packet-stream": "2.0.4", - "packet-stream-codec": "1.1.2", + "explain-error": "^1.0.1", + "packet-stream": "~2.0.0", + "packet-stream-codec": "^1.1.1", "pull-goodbye": "0.0.2", - "pull-stream": "3.6.9" + "pull-stream": "^3.2.3" } }, "muxrpc-validation": { @@ -3598,8 +4128,8 @@ "integrity": "sha1-zWUNFyAl/p0GQjCqs4ymMo3Rby8=", "dev": true, "requires": { - "pull-stream": "2.28.4", - "zerr": "1.0.4" + "pull-stream": "^2.28.3", + "zerr": "^1.0.1" }, "dependencies": { "pull-stream": { @@ -3608,7 +4138,7 @@ "integrity": "sha1-fql0E8FhnCC8O9+eEOkTR7AyU+Q=", "dev": true, "requires": { - "pull-core": "1.1.0" + "pull-core": "~1.1.0" } } } @@ -3619,10 +4149,10 @@ "integrity": "sha1-Sum6mGq4JcSlwS/LccbaqB6rUVg=", "dev": true, "requires": { - "minimist": "1.2.0", - "pull-stream": "2.28.4", - "stream-to-pull-stream": "1.7.2", - "word-wrap": "1.2.3" + "minimist": "^1.2.0", + "pull-stream": "^2.28.3", + "stream-to-pull-stream": "^1.6.6", + "word-wrap": "^1.1.0" }, "dependencies": { "pull-stream": { @@ -3631,7 +4161,7 @@ "integrity": "sha1-fql0E8FhnCC8O9+eEOkTR7AyU+Q=", "dev": true, "requires": { - "pull-core": "1.1.0" + "pull-core": "~1.1.0" } } } @@ -3642,9 +4172,9 @@ "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", "dev": true, "requires": { - "mkdirp": "0.5.1", - "ncp": "2.0.0", - "rimraf": "2.4.5" + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" }, "dependencies": { "glob": { @@ -3653,11 +4183,11 @@ "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", "dev": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "rimraf": { @@ -3666,7 +4196,7 @@ "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", "dev": true, "requires": { - "glob": "6.0.4" + "glob": "^6.0.1" } } } @@ -3682,17 +4212,17 @@ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "arr-diff": { @@ -3732,11 +4262,11 @@ "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.16.0.tgz", "integrity": "sha512-Tr9XD3Vt/EujXbZBv6UAHYoLUSMQAxSsTnm9K3koXzjzNWY195NqALeyrzLZBKzAkL3gl92BcSogqrHjD8QuUg==", "requires": { - "commander": "2.19.0", - "moo": "0.4.3", - "railroad-diagrams": "1.0.0", + "commander": "^2.19.0", + "moo": "^0.4.3", + "railroad-diagrams": "^1.0.0", "randexp": "0.4.6", - "semver": "5.6.0" + "semver": "^5.4.1" } }, "nice-try": { @@ -3749,7 +4279,7 @@ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.5.1.tgz", "integrity": "sha512-oDbFc7vCFx0RWWCweTer3hFm1u+e60N5FtGnmRV6QqvgATGFH/XRR6vqWIeBVosCYCqt6YdIr2L0exLZuEdVcQ==", "requires": { - "semver": "5.6.0" + "semver": "^5.4.1" } }, "node-gyp-build": { @@ -3762,7 +4292,7 @@ "resolved": "https://registry.npmjs.org/non-private-ip/-/non-private-ip-1.4.4.tgz", "integrity": "sha512-K9nTVFOGUOYutaG8ywiKpCdVu458RFxSgSJ0rribUxtf5iLM9B2+raFJgkID3p5op0+twmoQqFaPnu9KYz6qzg==", "requires": { - "ip": "1.1.5" + "ip": "^1.1.5" } }, "noop-logger": { @@ -3776,10 +4306,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.7.1", - "is-builtin-module": "1.0.0", - "semver": "5.6.0", - "validate-npm-package-license": "3.0.4" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -3788,7 +4318,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "normalize-uri": { @@ -3803,9 +4333,9 @@ "integrity": "sha1-5hlFX3B0ulTMZtbQ033Z8b5ry8A=", "dev": true, "requires": { - "rc": "1.2.8", - "shellsubstitute": "1.2.0", - "untildify": "2.1.0" + "rc": "^1.1.0", + "shellsubstitute": "^1.1.0", + "untildify": "^2.1.0" } }, "npm-run-path": { @@ -3813,7 +4343,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "npmlog": { @@ -3821,10 +4351,10 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "requires": { - "are-we-there-yet": "1.1.5", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -3843,9 +4373,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -3854,7 +4384,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -3875,7 +4405,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" }, "dependencies": { "isobject": { @@ -3892,8 +4422,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "object.pick": { @@ -3902,7 +4432,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -3925,7 +4455,7 @@ "integrity": "sha1-ME6XyFrdpw7NfwjaRQZ475Dwtwc=", "dev": true, "requires": { - "observ": "0.2.0" + "observ": "~0.2.0" } }, "obv": { @@ -3950,7 +4480,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -3970,12 +4500,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" } }, "options": { @@ -3993,9 +4523,9 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "requires": { - "execa": "1.0.0", - "lcid": "2.0.0", - "mem": "4.0.0" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, "os-tmpdir": { @@ -4009,8 +4539,8 @@ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "p-defer": { @@ -4033,7 +4563,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", "requires": { - "p-try": "2.0.0" + "p-try": "^2.0.0" } }, "p-locate": { @@ -4041,7 +4571,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { - "p-limit": "2.1.0" + "p-limit": "^2.0.0" } }, "p-try": { @@ -4059,8 +4589,8 @@ "resolved": "https://registry.npmjs.org/packet-stream-codec/-/packet-stream-codec-1.1.2.tgz", "integrity": "sha1-ebMC/BRM37tKtv66cEDmpdmcecc=", "requires": { - "pull-reader": "1.3.1", - "pull-through": "1.0.18" + "pull-reader": "^1.2.4", + "pull-through": "^1.0.17" } }, "parse-entities": { @@ -4069,12 +4599,12 @@ "integrity": "sha512-XXtDdOPLSB0sHecbEapQi6/58U/ODj/KWfIXmmMCJF/eRn8laX6LZbOyioMoETOOJoWRW8/qTSl5VQkUIfKM5g==", "dev": true, "requires": { - "character-entities": "1.2.2", - "character-entities-legacy": "1.1.2", - "character-reference-invalid": "1.1.2", - "is-alphanumerical": "1.0.2", - "is-decimal": "1.0.2", - "is-hexadecimal": "1.0.2" + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" } }, "parse-glob": { @@ -4083,10 +4613,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" } }, "parse-json": { @@ -4095,7 +4625,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.2" + "error-ex": "^1.2.0" } }, "parse-ms": { @@ -4142,7 +4672,7 @@ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "2.3.0" + "pify": "^2.0.0" } }, "pify": { @@ -4163,7 +4693,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-conf": { @@ -4172,8 +4702,8 @@ "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", "dev": true, "requires": { - "find-up": "2.1.0", - "load-json-file": "4.0.0" + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" }, "dependencies": { "find-up": { @@ -4182,7 +4712,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "load-json-file": { @@ -4191,10 +4721,10 @@ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { - "graceful-fs": "4.1.15", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" } }, "locate-path": { @@ -4203,8 +4733,8 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "p-limit": { @@ -4213,7 +4743,7 @@ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { - "p-try": "1.0.0" + "p-try": "^1.0.0" } }, "p-locate": { @@ -4222,7 +4752,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.3.0" + "p-limit": "^1.1.0" } }, "p-try": { @@ -4237,8 +4767,8 @@ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, "pify": { @@ -4255,9 +4785,9 @@ "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", "dev": true, "requires": { - "debug-log": "1.0.1", - "find-root": "1.1.0", - "xtend": "4.0.1" + "debug-log": "^1.0.0", + "find-root": "^1.0.0", + "xtend": "^4.0.1" } }, "pkg-dir": { @@ -4266,7 +4796,7 @@ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dev": true, "requires": { - "find-up": "1.1.2" + "find-up": "^1.0.0" }, "dependencies": { "find-up": { @@ -4275,8 +4805,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "path-exists": { @@ -4285,7 +4815,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } } } @@ -4296,7 +4826,7 @@ "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", "dev": true, "requires": { - "irregular-plurals": "1.4.0" + "irregular-plurals": "^1.0.0" } }, "pluralize": { @@ -4316,21 +4846,21 @@ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-4.0.0.tgz", "integrity": "sha512-7tayxeYboJX0RbVzdnKyGl2vhQRWr6qfClEXDhOkXjuaOKCw2q8aiuFhONRYVsG/czia7KhpykIlI2S2VaPunA==", "requires": { - "detect-libc": "1.0.3", - "expand-template": "1.1.1", + "detect-libc": "^1.0.3", + "expand-template": "^1.0.2", "github-from-package": "0.0.0", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "node-abi": "2.5.1", - "noop-logger": "0.1.1", - "npmlog": "4.1.2", - "os-homedir": "1.0.2", - "pump": "2.0.1", - "rc": "1.2.8", - "simple-get": "2.8.1", - "tar-fs": "1.16.3", - "tunnel-agent": "0.6.0", - "which-pm-runs": "1.0.0" + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "node-abi": "^2.2.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "os-homedir": "^1.0.1", + "pump": "^2.0.1", + "rc": "^1.1.6", + "simple-get": "^2.7.0", + "tar-fs": "^1.13.0", + "tunnel-agent": "^0.6.0", + "which-pm-runs": "^1.0.0" } }, "prelude-ls": { @@ -4351,9 +4881,9 @@ "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", "dev": true, "requires": { - "is-finite": "1.0.2", - "parse-ms": "1.0.1", - "plur": "1.0.0" + "is-finite": "^1.0.1", + "parse-ms": "^1.0.0", + "plur": "^1.0.0" }, "dependencies": { "plur": { @@ -4374,7 +4904,7 @@ "resolved": "https://registry.npmjs.org/private-box/-/private-box-0.3.0.tgz", "integrity": "sha512-zsK6DDEC+cnNiunYamcVbx4ZCLbKnzTOZa09K4Pj3/tH3nQFPUO9K2QoYy4kfxLqmoyw6RPDtACN9OYviMQZ2Q==", "requires": { - "chloride": "2.2.10" + "chloride": "^2.2.9" } }, "process-nextick-args": { @@ -4394,8 +4924,8 @@ "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", "dev": true, "requires": { - "loose-envify": "1.4.0", - "object-assign": "4.1.1" + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "prr": { @@ -4420,12 +4950,12 @@ "resolved": "https://registry.npmjs.org/pull-box-stream/-/pull-box-stream-1.0.13.tgz", "integrity": "sha1-w+JAOY6rP1lRsu0QeMWYi/egork=", "requires": { - "chloride": "2.2.10", - "increment-buffer": "1.0.1", - "pull-reader": "1.3.1", - "pull-stream": "3.6.9", - "pull-through": "1.0.18", - "split-buffer": "1.0.0" + "chloride": "^2.2.7", + "increment-buffer": "~1.0.0", + "pull-reader": "^1.2.5", + "pull-stream": "^3.2.3", + "pull-through": "^1.0.18", + "split-buffer": "~1.0.0" } }, "pull-cat": { @@ -4457,9 +4987,9 @@ "integrity": "sha512-95lZVSF2eSEdOmUtlOBaD9p5YOvlYeCr5FBv2ySqcj/4rpaXI6d8OH+zPHHjKAf58R8QXJRZuyfHkcCX8TZbAg==", "dev": true, "requires": { - "looper": "4.0.0", - "ltgt": "2.2.1", - "pull-stream": "3.6.9" + "looper": "^4.0.0", + "ltgt": "^2.2.0", + "pull-stream": "^3.6.0" }, "dependencies": { "looper": { @@ -4481,7 +5011,7 @@ "integrity": "sha1-HdmHYF1jV6DSPB5Lgm95FaIVEpw=", "dev": true, "requires": { - "pull-utf8-decoder": "1.0.2" + "pull-utf8-decoder": "^1.0.2" } }, "pull-flatmap": { @@ -4495,10 +5025,10 @@ "integrity": "sha1-8YT2p3KLtNlWQTdr6tafb2bfR80=", "dev": true, "requires": { - "pull-file": "0.5.0", - "pull-stream": "3.6.9", - "pull-traverse": "1.0.3", - "pull-write-file": "0.2.4" + "pull-file": "^0.5.0", + "pull-stream": "^3.3.0", + "pull-traverse": "^1.0.3", + "pull-write-file": "^0.2.1" }, "dependencies": { "pull-file": { @@ -4507,7 +5037,7 @@ "integrity": "sha1-s8pAUwbggvnUUoKIkzutsrZWNls=", "dev": true, "requires": { - "pull-utf8-decoder": "1.0.2" + "pull-utf8-decoder": "^1.0.2" } } } @@ -4518,8 +5048,8 @@ "integrity": "sha1-7vkV3eZEvdvqjdLgEG1USqy81cI=", "dev": true, "requires": { - "pull-fs": "1.1.6", - "pull-stream": "3.6.9" + "pull-fs": "~1.1.6", + "pull-stream": "^3.3.0" } }, "pull-goodbye": { @@ -4527,7 +5057,7 @@ "resolved": "https://registry.npmjs.org/pull-goodbye/-/pull-goodbye-0.0.2.tgz", "integrity": "sha1-jYNX21XiKnEN//DxaoyQtF7+QXE=", "requires": { - "pull-stream": "3.5.0" + "pull-stream": "~3.5.0" }, "dependencies": { "pull-stream": { @@ -4542,10 +5072,10 @@ "resolved": "https://registry.npmjs.org/pull-handshake/-/pull-handshake-1.1.4.tgz", "integrity": "sha1-YACg/QGIhM39c3JU+Mxgqypjd5E=", "requires": { - "pull-cat": "1.1.11", - "pull-pair": "1.1.0", - "pull-pushable": "2.2.0", - "pull-reader": "1.3.1" + "pull-cat": "^1.1.9", + "pull-pair": "~1.1.0", + "pull-pushable": "^2.0.0", + "pull-reader": "^1.2.3" } }, "pull-hash": { @@ -4559,8 +5089,8 @@ "integrity": "sha512-swJ/jwkIN/O1bQCE3iY7Xy9r3gYuJ50MXaxZilw/HIduAy4tJu+vcz2/If0L+xNK7Ku/FfjtVbTpRTe7sf3hmA==", "dev": true, "requires": { - "pull-abortable": "4.0.0", - "pull-stream": "3.6.9" + "pull-abortable": "~4.0.0", + "pull-stream": "^3.4.5" }, "dependencies": { "pull-abortable": { @@ -4576,13 +5106,13 @@ "resolved": "https://registry.npmjs.org/pull-level/-/pull-level-2.0.4.tgz", "integrity": "sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg==", "requires": { - "level-post": "1.0.7", - "pull-cat": "1.1.11", - "pull-live": "1.0.1", - "pull-pushable": "2.2.0", - "pull-stream": "3.6.9", - "pull-window": "2.1.4", - "stream-to-pull-stream": "1.7.2" + "level-post": "^1.0.7", + "pull-cat": "^1.1.9", + "pull-live": "^1.0.1", + "pull-pushable": "^2.0.0", + "pull-stream": "^3.4.0", + "pull-window": "^2.1.4", + "stream-to-pull-stream": "^1.7.1" } }, "pull-live": { @@ -4590,8 +5120,8 @@ "resolved": "https://registry.npmjs.org/pull-live/-/pull-live-1.0.1.tgz", "integrity": "sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU=", "requires": { - "pull-cat": "1.1.11", - "pull-stream": "3.6.9" + "pull-cat": "^1.1.9", + "pull-stream": "^3.4.0" } }, "pull-looper": { @@ -4600,7 +5130,7 @@ "integrity": "sha512-djlD60A6NGe5goLdP5pgbqzMEiWmk1bInuAzBp0QOH4vDrVwh05YDz6UP8+pOXveKEk8wHVP+rB2jBrK31QMPA==", "dev": true, "requires": { - "looper": "4.0.0" + "looper": "^4.0.0" }, "dependencies": { "looper": { @@ -4617,7 +5147,7 @@ "integrity": "sha1-Pa3ZttFWxUVyG9qNAAPdjqoGKT4=", "dev": true, "requires": { - "pull-stream": "3.6.9" + "pull-stream": "^3.4.5" } }, "pull-merge": { @@ -4635,11 +5165,11 @@ "resolved": "https://registry.npmjs.org/pull-next-query/-/pull-next-query-1.0.0.tgz", "integrity": "sha512-pZuaV0A6SH5IQmCNNBKB2WSpHfzgj/lNeprLvCMVRV2Wh4zidtBvjgJrThRLOYxdZilL4z01T3pri0zroqKJcg==", "requires": { - "lodash.get": "4.4.2", - "lodash.merge": "4.6.1", - "lodash.set": "4.3.2", - "pull-next": "1.0.1", - "pull-stream": "3.6.9" + "lodash.get": "^4.4.2", + "lodash.merge": "^4.6.1", + "lodash.set": "^4.3.2", + "pull-next": "^1.0.1", + "pull-stream": "^3.6.8" } }, "pull-notify": { @@ -4648,7 +5178,7 @@ "integrity": "sha1-b4b/ldJwuJw+vyVbYDG3Ay3JnMo=", "dev": true, "requires": { - "pull-pushable": "2.2.0" + "pull-pushable": "^2.0.0" } }, "pull-pair": { @@ -4661,7 +5191,7 @@ "resolved": "https://registry.npmjs.org/pull-paramap/-/pull-paramap-1.2.2.tgz", "integrity": "sha1-UaQZPOnI1yFdla2tReK824STsjo=", "requires": { - "looper": "4.0.0" + "looper": "^4.0.0" }, "dependencies": { "looper": { @@ -4677,9 +5207,9 @@ "integrity": "sha1-e8SjQBZ9rYj2gqGWxjSFc1x6CJQ=", "dev": true, "requires": { - "pull-pushable": "2.2.0", - "pull-stream": "3.6.9", - "statistics": "3.3.0" + "pull-pushable": "^2.0.0", + "pull-stream": "^3.4.5", + "statistics": "^3.3.0" } }, "pull-pushable": { @@ -4693,7 +5223,7 @@ "integrity": "sha1-F7IxrV81n2dYJmcBcrDlkMiWTo0=", "dev": true, "requires": { - "pull-stream": "3.6.9" + "pull-stream": "^3.6.0" } }, "pull-reader": { @@ -4711,8 +5241,8 @@ "resolved": "https://registry.npmjs.org/pull-sort/-/pull-sort-1.0.2.tgz", "integrity": "sha512-jGcAHMP+0Le+bEIhSODlbNNd3jW+S6XrXOlhVzfcKU5HQZjP92OzQSgHHSlwvWRsiTWi+UGgbFpL/5gGgmFoVQ==", "requires": { - "pull-defer": "0.2.3", - "pull-stream": "3.6.9" + "pull-defer": "^0.2.3", + "pull-stream": "^3.6.9" } }, "pull-stream": { @@ -4737,7 +5267,7 @@ "resolved": "https://registry.npmjs.org/pull-through/-/pull-through-1.0.18.tgz", "integrity": "sha1-jdYjFCY+Wc9Qlur7sSeitu8xBzU=", "requires": { - "looper": "3.0.0" + "looper": "~3.0.0" }, "dependencies": { "looper": { @@ -4764,7 +5294,7 @@ "resolved": "https://registry.npmjs.org/pull-window/-/pull-window-2.1.4.tgz", "integrity": "sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA=", "requires": { - "looper": "2.0.0" + "looper": "^2.0.0" } }, "pull-write": { @@ -4772,9 +5302,9 @@ "resolved": "https://registry.npmjs.org/pull-write/-/pull-write-1.1.4.tgz", "integrity": "sha1-3d6jFJO0j2douEooHQHrO1Mf4Lg=", "requires": { - "looper": "4.0.0", - "pull-cat": "1.1.11", - "pull-stream": "3.6.9" + "looper": "^4.0.0", + "pull-cat": "^1.1.11", + "pull-stream": "^3.4.5" }, "dependencies": { "looper": { @@ -4795,9 +5325,9 @@ "resolved": "https://registry.npmjs.org/pull-ws/-/pull-ws-3.3.1.tgz", "integrity": "sha512-kJodbLQT+oKjcRIQO+vQNw6xWBuEo7Kxp51VMOvb6cvPvHYA+aNLzm+NmkB/5dZwbuTRYGMal9QPvH52tzM1ZA==", "requires": { - "relative-url": "1.0.2", - "safe-buffer": "5.1.2", - "ws": "1.1.5" + "relative-url": "^1.0.2", + "safe-buffer": "^5.1.1", + "ws": "^1.1.0" } }, "pump": { @@ -4805,8 +5335,8 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, "punycode": { @@ -4827,8 +5357,8 @@ "integrity": "sha512-pdE/OKi/jnp9DqGgNRzLY0oVHffn/8TXJmBPzv+ikdvpkeA0J//l5d7TZk1yWwZj9P0JcOIEVDOuHzhXaeBlmw==", "dev": true, "requires": { - "pull-looper": "1.0.0", - "push-stream": "10.0.4" + "pull-looper": "^1.0.0", + "push-stream": "^10.0.3" } }, "railroad-diagrams": { @@ -4842,7 +5372,7 @@ "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", "requires": { "discontinuous-range": "1.0.0", - "ret": "0.1.15" + "ret": "~0.1.10" } }, "randomatic": { @@ -4851,9 +5381,9 @@ "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", "dev": true, "requires": { - "is-number": "4.0.0", - "kind-of": "6.0.2", - "math-random": "1.0.1" + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" }, "dependencies": { "is-number": { @@ -4875,10 +5405,10 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "requires": { - "deep-extend": "0.6.0", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" } }, "re-emitter": { @@ -4893,9 +5423,9 @@ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, "read-pkg-up": { @@ -4904,8 +5434,8 @@ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" }, "dependencies": { "find-up": { @@ -4914,7 +5444,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "locate-path": { @@ -4923,8 +5453,8 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "p-limit": { @@ -4933,7 +5463,7 @@ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { - "p-try": "1.0.0" + "p-try": "^1.0.0" } }, "p-locate": { @@ -4942,7 +5472,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.3.0" + "p-limit": "^1.1.0" } }, "p-try": { @@ -4958,13 +5488,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "readdirp": { @@ -4973,9 +5503,9 @@ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "requires": { - "graceful-fs": "4.1.15", - "micromatch": "3.1.10", - "readable-stream": "2.3.6" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" }, "dependencies": { "arr-diff": { @@ -4996,16 +5526,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.3", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -5014,7 +5544,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -5025,13 +5555,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -5040,7 +5570,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -5049,7 +5579,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -5058,7 +5588,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -5067,7 +5597,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -5078,7 +5608,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -5087,7 +5617,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -5098,9 +5628,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -5117,14 +5647,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -5133,7 +5663,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -5142,7 +5672,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -5153,10 +5683,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -5165,7 +5695,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -5176,7 +5706,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -5185,7 +5715,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -5194,9 +5724,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-number": { @@ -5205,7 +5735,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -5214,7 +5744,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -5237,19 +5767,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } } } @@ -5265,7 +5795,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "regex-not": { @@ -5274,8 +5804,8 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regexpp": { @@ -5295,37 +5825,37 @@ "integrity": "sha1-gCo4w6qYyeHj6gFe66IR0ny2Xh8=", "dev": true, "requires": { - "camelcase": "2.1.1", - "ccount": "1.0.3", - "chalk": "1.1.3", - "chokidar": "1.7.0", - "collapse-white-space": "1.0.4", - "commander": "2.19.0", - "concat-stream": "1.6.2", - "debug": "2.6.9", - "elegant-spinner": "1.0.1", + "camelcase": "^2.0.0", + "ccount": "^1.0.0", + "chalk": "^1.0.0", + "chokidar": "^1.0.5", + "collapse-white-space": "^1.0.0", + "commander": "^2.0.0", + "concat-stream": "^1.0.0", + "debug": "^2.0.0", + "elegant-spinner": "^1.0.0", "extend.js": "0.0.2", - "glob": "6.0.4", - "globby": "4.1.0", - "he": "0.5.0", - "log-update": "1.0.2", - "longest-streak": "1.0.0", - "markdown-table": "0.4.0", - "minimatch": "3.0.4", - "npm-prefix": "1.2.0", - "parse-entities": "1.2.0", - "repeat-string": "1.6.1", - "stringify-entities": "1.3.2", - "to-vfile": "1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "1.1.1", - "unified": "2.1.4", - "user-home": "2.0.0", - "vfile": "1.4.0", - "vfile-find-down": "1.0.0", - "vfile-find-up": "1.0.0", - "vfile-reporter": "1.5.0", - "ware": "1.3.0" + "glob": "^6.0.1", + "globby": "^4.0.0", + "he": "^0.5.0", + "log-update": "^1.0.1", + "longest-streak": "^1.0.0", + "markdown-table": "^0.4.0", + "minimatch": "^3.0.0", + "npm-prefix": "^1.0.1", + "parse-entities": "^1.0.0", + "repeat-string": "^1.5.0", + "stringify-entities": "^1.0.0", + "to-vfile": "^1.0.0", + "trim": "^0.0.1", + "trim-trailing-lines": "^1.0.0", + "unified": "^2.0.0", + "user-home": "^2.0.0", + "vfile": "^1.1.0", + "vfile-find-down": "^1.0.0", + "vfile-find-up": "^1.0.0", + "vfile-reporter": "^1.5.0", + "ware": "^1.3.0" }, "dependencies": { "camelcase": { @@ -5340,11 +5870,11 @@ "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", "dev": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } @@ -5355,13 +5885,13 @@ "integrity": "sha1-WSo0e909WIH08IDJi1sVL7FAepI=", "dev": true, "requires": { - "collapse-white-space": "1.0.4", - "detab": "1.0.2", - "normalize-uri": "1.1.1", - "object-assign": "4.1.1", + "collapse-white-space": "^1.0.0", + "detab": "^1.0.0", + "normalize-uri": "^1.0.0", + "object-assign": "^4.0.1", "trim": "0.0.1", - "trim-lines": "1.1.1", - "unist-util-visit": "1.4.0" + "trim-lines": "^1.0.0", + "unist-util-visit": "^1.0.0" } }, "remove-trailing-separator": { @@ -5387,7 +5917,7 @@ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "require-directory": { @@ -5406,8 +5936,8 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" } }, "resolve": { @@ -5415,7 +5945,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "requires": { - "path-parse": "1.0.6" + "path-parse": "^1.0.5" } }, "resolve-from": { @@ -5436,8 +5966,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } }, "resumer": { @@ -5445,7 +5975,7 @@ "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", "requires": { - "through": "2.3.8" + "through": "~2.3.4" } }, "ret": { @@ -5459,7 +5989,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "7.1.3" + "glob": "^7.0.5" } }, "run-async": { @@ -5468,7 +5998,7 @@ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "is-promise": "2.1.0" + "is-promise": "^2.1.0" } }, "run-parallel": { @@ -5497,7 +6027,7 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, "safer-buffer": { @@ -5511,9 +6041,9 @@ "resolved": "https://registry.npmjs.org/scuttle-inject/-/scuttle-inject-1.0.3.tgz", "integrity": "sha512-ddtx35eBLUxFWsDLj025gVCOIBkiU6GuxH05oES3O6e2VDUDwyfSiT/OtzkY9wDBNgJ2RkPxdtCqEBNEskk0Rw==", "requires": { - "libnested": "1.4.1", - "mutant": "3.22.1", - "pull-defer": "0.2.3" + "libnested": "^1.3.2", + "mutant": "^3.22.1", + "pull-defer": "^0.2.2" } }, "scuttle-invite": { @@ -5521,15 +6051,15 @@ "resolved": "https://registry.npmjs.org/scuttle-invite/-/scuttle-invite-1.0.3.tgz", "integrity": "sha512-/qGjMo1h6B9YMjZZIphUNhpi/EYJEFYxFSZStO+X4gFdvRv9RVNwVAH7Z3uhCgezdrbQZCuUV5jUnm17Gdvp1A==", "requires": { - "pull-merge": "1.0.4", - "pull-next-query": "1.0.0", - "pull-stream": "3.6.9", - "scuttle-inject": "1.0.3", - "ssb-backlinks": "0.7.3", + "pull-merge": "^1.0.4", + "pull-next-query": "^1.0.0", + "pull-stream": "^3.6.7", + "scuttle-inject": "^1.0.3", + "ssb-backlinks": "^0.7.3", "ssb-invite-schema": "0.0.10", - "ssb-msg-content": "1.0.1", - "ssb-ref": "2.13.9", - "ssb-sort": "1.1.3" + "ssb-msg-content": "^1.0.1", + "ssb-ref": "^2.11.1", + "ssb-sort": "^1.1.0" } }, "scuttle-testbot": { @@ -5538,9 +6068,9 @@ "integrity": "sha512-CdVTjPK+kN2kePz43XQCvsh2LE4TKKKZcBjyXVRPXZNR3AC10vhlKn+8GkFdLwjxoiRAPFGnrUjPTeHKUSvwjQ==", "dev": true, "requires": { - "rimraf": "2.6.2", - "scuttlebot": "11.4.4", - "ssb-keys": "7.1.3" + "rimraf": "^2.6.2", + "scuttlebot": "^11.1.0", + "ssb-keys": "^7.0.13" } }, "scuttlebot": { @@ -5550,62 +6080,62 @@ "dev": true, "requires": { "atomic-file": "0.0.1", - "bash-color": "0.0.4", - "broadcast-stream": "0.2.2", - "cont": "1.0.3", - "cross-spawn": "5.1.0", - "deep-equal": "1.0.1", - "explain-error": "1.0.4", + "bash-color": "~0.0.3", + "broadcast-stream": "^0.2.1", + "cont": "~1.0.3", + "cross-spawn": "^5.1.0", + "deep-equal": "^1.0.1", + "explain-error": "^1.0.3", "has-network": "0.0.1", - "ip": "0.3.3", - "mdmanifest": "1.0.8", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "multiblob": "1.13.2", - "multicb": "1.2.2", - "multiserver": "1.13.7", - "muxrpc": "6.4.2", - "muxrpc-validation": "2.0.1", - "muxrpcli": "1.1.0", - "mv": "2.1.1", - "non-private-ip": "1.4.4", - "observ-debounce": "1.1.1", + "ip": "^0.3.3", + "mdmanifest": "^1.0.4", + "minimist": "^1.1.3", + "mkdirp": "~0.5.0", + "multiblob": "^1.13.0", + "multicb": "^1.0.0", + "multiserver": "^1.12.0", + "muxrpc": "^6.4.0", + "muxrpc-validation": "^2.0.0", + "muxrpcli": "^1.0.0", + "mv": "^2.1.1", + "non-private-ip": "^1.4.3", + "observ-debounce": "^1.1.1", "obv": "0.0.1", "on-change-network": "0.0.2", - "on-wakeup": "1.0.1", - "osenv": "0.1.5", - "pull-abortable": "4.1.1", - "pull-cat": "1.1.11", - "pull-file": "1.1.0", + "on-wakeup": "^1.0.0", + "osenv": "^0.1.5", + "pull-abortable": "~4.1.0", + "pull-cat": "~1.1.5", + "pull-file": "^1.0.0", "pull-flatmap": "0.0.1", - "pull-inactivity": "2.1.3", - "pull-level": "2.0.4", - "pull-many": "1.0.8", - "pull-next": "1.0.1", + "pull-inactivity": "~2.1.1", + "pull-level": "^2.0.2", + "pull-many": "~1.0.6", + "pull-next": "^1.0.0", "pull-notify": "0.1.1", - "pull-paramap": "1.2.2", - "pull-ping": "2.0.2", - "pull-pushable": "2.2.0", - "pull-stream": "3.6.9", - "pull-stream-to-stream": "1.3.4", - "pull-stringify": "1.2.2", - "rimraf": "2.6.2", - "secret-stack": "4.2.4", - "secure-scuttlebutt": "18.6.0", - "ssb-blobs": "1.1.7", - "ssb-client": "4.6.0", - "ssb-config": "2.3.7", - "ssb-ebt": "5.3.0", - "ssb-friends": "3.1.10", - "ssb-keys": "7.1.3", - "ssb-links": "3.0.3", - "ssb-msgs": "5.2.0", - "ssb-query": "2.3.0", - "ssb-ref": "2.13.9", - "ssb-ws": "2.1.1", - "statistics": "3.3.0", - "stream-to-pull-stream": "1.7.2", - "zerr": "1.0.4" + "pull-paramap": "~1.2.1", + "pull-ping": "^2.0.2", + "pull-pushable": "^2.2.0", + "pull-stream": "^3.6.2", + "pull-stream-to-stream": "~1.3.0", + "pull-stringify": "~1.2.2", + "rimraf": "^2.4.2", + "secret-stack": "^4.1.0", + "secure-scuttlebutt": "^18.2.0", + "ssb-blobs": "^1.1.4", + "ssb-client": "^4.5.7", + "ssb-config": "^2.0.0", + "ssb-ebt": "^5.1.4", + "ssb-friends": "^3.1.3", + "ssb-keys": "^7.0.13", + "ssb-links": "^3.0.2", + "ssb-msgs": "~5.2.0", + "ssb-query": "^2.1.0", + "ssb-ref": "^2.9.1", + "ssb-ws": "^2.1.1", + "statistics": "^3.0.0", + "stream-to-pull-stream": "^1.6.10", + "zerr": "^1.0.0" }, "dependencies": { "cross-spawn": { @@ -5614,9 +6144,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.5", - "shebang-command": "1.2.0", - "which": "1.3.1" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "ip": { @@ -5638,11 +6168,11 @@ "resolved": "https://registry.npmjs.org/secret-handshake/-/secret-handshake-1.1.14.tgz", "integrity": "sha512-e4hiMTahaLiN5XKap1YrifoyT8yRu9yQEZrMTglTBgq8Lv8iChFKLpbmXYeNxy2rCnutuWaQDFbp3sBgl4NQ4g==", "requires": { - "chloride": "2.2.10", - "deep-equal": "1.0.1", - "pull-box-stream": "1.0.13", - "pull-handshake": "1.1.4", - "pull-stream": "3.6.9" + "chloride": "^2.2.7", + "deep-equal": "~1.0.0", + "pull-box-stream": "^1.0.13", + "pull-handshake": "^1.1.1", + "pull-stream": "^3.4.5" } }, "secret-stack": { @@ -5652,15 +6182,15 @@ "dev": true, "requires": { "hoox": "0.0.1", - "ip": "1.1.5", - "map-merge": "1.1.0", - "multiserver": "1.13.7", - "muxrpc": "6.4.2", - "non-private-ip": "1.4.4", - "pull-inactivity": "2.1.3", - "pull-rate": "1.0.2", - "pull-stream": "3.6.9", - "stream-to-pull-stream": "1.7.2" + "ip": "^1.1.5", + "map-merge": "^1.1.0", + "multiserver": "^1.13.0", + "muxrpc": "^6.4.0", + "non-private-ip": "^1.4.3", + "pull-inactivity": "~2.1.1", + "pull-rate": "^1.0.2", + "pull-stream": "^3.4.5", + "stream-to-pull-stream": "^1.6.1" } }, "secrets.js-grempe": { @@ -5674,30 +6204,30 @@ "integrity": "sha512-gKQ8tJVnxd8WJEMusXyVkcHGZHoYB+F+TuQYisFYlhAntqlKBExdN+IT6DjVmHev7DvxE68PVtR8Ijqme93d2w==", "dev": true, "requires": { - "async-write": "2.1.0", - "cont": "1.0.3", - "explain-error": "1.0.4", - "flumedb": "1.0.1", - "flumelog-offset": "3.3.2", - "flumeview-hashtable": "1.0.4", - "flumeview-level": "3.0.6", - "flumeview-reduce": "1.3.14", - "level": "4.0.0", - "level-sublevel": "6.6.5", - "ltgt": "2.2.1", - "monotonic-timestamp": "0.0.9", + "async-write": "^2.1.0", + "cont": "~1.0.0", + "explain-error": "~1.0.1", + "flumedb": "^1.0.0", + "flumelog-offset": "^3.3.1", + "flumeview-hashtable": "^1.0.3", + "flumeview-level": "^3.0.5", + "flumeview-reduce": "^1.3.9", + "level": "^4.0.0", + "level-sublevel": "^6.6.2", + "ltgt": "^2.2.0", + "monotonic-timestamp": "~0.0.8", "obv": "0.0.1", - "pull-cont": "0.1.1", - "pull-level": "2.0.4", - "pull-live": "1.0.1", - "pull-notify": "0.1.1", - "pull-paramap": "1.2.2", - "pull-stream": "3.6.9", - "ssb-keys": "7.1.3", - "ssb-msgs": "5.2.0", - "ssb-ref": "2.13.9", - "ssb-validate": "4.0.4", - "typewiselite": "1.0.0" + "pull-cont": "^0.1.1", + "pull-level": "^2.0.3", + "pull-live": "^1.0.1", + "pull-notify": "^0.1.0", + "pull-paramap": "^1.1.6", + "pull-stream": "^3.4.0", + "ssb-keys": "^7.1.3", + "ssb-msgs": "^5.0.0", + "ssb-ref": "^2.12.0", + "ssb-validate": "^4.0.0", + "typewiselite": "^1.0.0" }, "dependencies": { "abstract-leveldown": { @@ -5706,7 +6236,7 @@ "integrity": "sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==", "dev": true, "requires": { - "xtend": "4.0.1" + "xtend": "~4.0.0" } }, "deferred-leveldown": { @@ -5715,8 +6245,8 @@ "integrity": "sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==", "dev": true, "requires": { - "abstract-leveldown": "5.0.0", - "inherits": "2.0.3" + "abstract-leveldown": "~5.0.0", + "inherits": "^2.0.3" } }, "encoding-down": { @@ -5725,11 +6255,11 @@ "integrity": "sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw==", "dev": true, "requires": { - "abstract-leveldown": "5.0.0", - "inherits": "2.0.3", - "level-codec": "9.0.0", - "level-errors": "2.0.0", - "xtend": "4.0.1" + "abstract-leveldown": "^5.0.0", + "inherits": "^2.0.3", + "level-codec": "^9.0.0", + "level-errors": "^2.0.0", + "xtend": "^4.0.1" } }, "level": { @@ -5738,9 +6268,9 @@ "integrity": "sha512-4epzCOlEcJ529NOdlAYiuiakS/kZTDdiKSBNJmE1B8bsmA+zEVwcpxyH86qJSQTpOu7SODrlaD9WgPRHLkGutA==", "dev": true, "requires": { - "level-packager": "3.1.0", - "leveldown": "4.0.1", - "opencollective-postinstall": "2.0.1" + "level-packager": "^3.0.0", + "leveldown": "^4.0.0", + "opencollective-postinstall": "^2.0.0" } }, "level-codec": { @@ -5755,7 +6285,7 @@ "integrity": "sha512-AmY4HCp9h3OiU19uG+3YWkdELgy05OTP/r23aNHaQKWv8DO787yZgsEuGVkoph40uwN+YdUKnANlrxSsoOaaxg==", "dev": true, "requires": { - "errno": "0.1.7" + "errno": "~0.1.1" } }, "level-iterator-stream": { @@ -5764,9 +6294,9 @@ "integrity": "sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g==", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "xtend": "4.0.1" + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "xtend": "^4.0.0" } }, "level-packager": { @@ -5775,8 +6305,8 @@ "integrity": "sha512-UxVEfK5WH0u0InR3WxTCSAroiorAGKzXWZT6i+nBjambmvINuXFUsFx2Ai3UIjUUtnyWhluv42jMlzUZCsAk9A==", "dev": true, "requires": { - "encoding-down": "5.0.4", - "levelup": "3.1.1" + "encoding-down": "~5.0.0", + "levelup": "^3.0.0" } }, "leveldown": { @@ -5785,11 +6315,11 @@ "integrity": "sha512-ZlBKVSsglPIPJnz4ggB8o2R0bxDxbsMzuQohbfgoFMVApyTE118DK5LNRG0cRju6rt3OkGxe0V6UYACGlq/byg==", "dev": true, "requires": { - "abstract-leveldown": "5.0.0", - "bindings": "1.3.1", - "fast-future": "1.0.2", - "nan": "2.10.0", - "prebuild-install": "4.0.0" + "abstract-leveldown": "~5.0.0", + "bindings": "~1.3.0", + "fast-future": "~1.0.2", + "nan": "~2.10.0", + "prebuild-install": "^4.0.0" } }, "levelup": { @@ -5798,10 +6328,10 @@ "integrity": "sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==", "dev": true, "requires": { - "deferred-leveldown": "4.0.2", - "level-errors": "2.0.0", - "level-iterator-stream": "3.0.1", - "xtend": "4.0.1" + "deferred-leveldown": "~4.0.0", + "level-errors": "~2.0.0", + "level-iterator-stream": "~3.0.0", + "xtend": "~4.0.0" } }, "obv": { @@ -5833,10 +6363,10 @@ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -5845,7 +6375,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -5855,7 +6385,7 @@ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.5.tgz", "integrity": "sha1-J9Fx78yCoRi5ljn/WBZgJCtQbnw=", "requires": { - "inherits": "2.0.3" + "inherits": "^2.0.1" } }, "shebang-command": { @@ -5863,7 +6393,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -5892,9 +6422,9 @@ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", "requires": { - "decompress-response": "3.3.0", - "once": "1.4.0", - "simple-concat": "1.0.0" + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, "slash": { @@ -5908,7 +6438,7 @@ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0" + "is-fullwidth-code-point": "^2.0.0" }, "dependencies": { "is-fullwidth-code-point": { @@ -5930,14 +6460,14 @@ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.2", - "use": "3.1.1" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { "define-property": { @@ -5946,7 +6476,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -5955,7 +6485,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -5966,9 +6496,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -5977,7 +6507,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -5986,7 +6516,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -5995,7 +6525,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -6004,9 +6534,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -6029,7 +6559,7 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" } }, "socks": { @@ -6037,8 +6567,8 @@ "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.1.tgz", "integrity": "sha512-0GabKw7n9mI46vcNrVfs0o6XzWzjVa3h6GaSo2UPxtWAROXUWavfJWh1M4PR5tnE0dcnQXZIDFP4yrAysLze/w==", "requires": { - "ip": "1.1.5", - "smart-buffer": "4.0.1" + "ip": "^1.1.5", + "smart-buffer": "^4.0.1" } }, "sodium-browserify": { @@ -6046,10 +6576,10 @@ "resolved": "https://registry.npmjs.org/sodium-browserify/-/sodium-browserify-1.2.4.tgz", "integrity": "sha512-IYcxKje/uf/c3a7VhZYJLlUxWMcktfbD4AjqHjUD1/VWKjj0Oq5wNbX8wjJOWVO9UhUMqJQiOn2xFbzKWBmy5w==", "requires": { - "libsodium-wrappers": "0.7.3", + "libsodium-wrappers": "^0.7.3", "sha.js": "2.4.5", - "sodium-browserify-tweetnacl": "0.2.3", - "tweetnacl": "0.14.5" + "sodium-browserify-tweetnacl": "^0.2.3", + "tweetnacl": "^0.14.1" } }, "sodium-browserify-tweetnacl": { @@ -6057,11 +6587,11 @@ "resolved": "https://registry.npmjs.org/sodium-browserify-tweetnacl/-/sodium-browserify-tweetnacl-0.2.3.tgz", "integrity": "sha1-tVN//LufdOvEQ7i2ohGykej8vI4=", "requires": { - "chloride-test": "1.2.2", - "ed2curve": "0.1.4", - "sha.js": "2.4.11", - "tweetnacl": "0.14.5", - "tweetnacl-auth": "0.3.1" + "chloride-test": "^1.1.0", + "ed2curve": "^0.1.4", + "sha.js": "^2.4.8", + "tweetnacl": "^0.14.1", + "tweetnacl-auth": "^0.3.0" }, "dependencies": { "sha.js": { @@ -6069,8 +6599,8 @@ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } } } @@ -6085,9 +6615,9 @@ "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-2.2.3.tgz", "integrity": "sha512-0rQvKwlWW86YmmAhosnJ6/2PR3mdAtfuWW147L4x3/gwfL7XiJ7mf2BPvBwU16vsYQNY1yxOQg9YT/MN6qoZOA==", "requires": { - "ini": "1.3.5", - "nan": "2.10.0", - "node-gyp-build": "3.7.0" + "ini": "^1.3.5", + "nan": "^2.4.0", + "node-gyp-build": "^3.0.0" } }, "source-map": { @@ -6101,11 +6631,11 @@ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "2.1.2", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-support": { @@ -6113,7 +6643,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "requires": { - "source-map": "0.5.7" + "source-map": "^0.5.6" } }, "source-map-url": { @@ -6128,8 +6658,8 @@ "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.3" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { @@ -6144,8 +6674,8 @@ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { - "spdx-exceptions": "2.2.0", - "spdx-license-ids": "3.0.3" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { @@ -6160,7 +6690,7 @@ "integrity": "sha1-xDlc5oOrzSVLwo/h2rtuXCfc/64=", "dev": true, "requires": { - "through": "2.3.8" + "through": "2" } }, "split-buffer": { @@ -6174,7 +6704,7 @@ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" } }, "sprintf-js": { @@ -6188,13 +6718,13 @@ "resolved": "https://registry.npmjs.org/ssb-backlinks/-/ssb-backlinks-0.7.3.tgz", "integrity": "sha512-84s5phSVyZsYV0FTmBJvICPgOMuu8ouzukG8Gz2XtuOui95GBP/G7UIBURgYVS82XA6g9xPA/jf38fsMxid38Q==", "requires": { - "base64-url": "2.2.0", - "deep-equal": "1.0.1", - "flumeview-query": "6.3.0", - "pull-stream": "3.6.9", - "ssb-keys": "7.1.3", - "ssb-ref": "2.13.9", - "xtend": "4.0.1" + "base64-url": "^2.2.0", + "deep-equal": "^1.0.1", + "flumeview-query": "^6.2.0", + "pull-stream": "^3.6.7", + "ssb-keys": "^7.0.14", + "ssb-ref": "^2.9.0", + "xtend": "^4.0.1" } }, "ssb-blobs": { @@ -6203,13 +6733,13 @@ "integrity": "sha512-y2GP3xIyGPbRYvpwUgA/U8QaCE2y+7cT22/yN6PcoMqbZOPI7qNP7eFzCXa/HYa7LuIczyID5/25UFkP84rrig==", "dev": true, "requires": { - "cont": "1.0.3", - "level": "4.0.0", - "multiblob": "1.13.2", - "pull-level": "2.0.4", - "pull-notify": "0.1.1", - "pull-stream": "3.6.9", - "ssb-ref": "2.13.9" + "cont": "^1.0.3", + "level": "^4.0.0", + "multiblob": "^1.12.0", + "pull-level": "^2.0.4", + "pull-notify": "^0.1.0", + "pull-stream": "^3.3.0", + "ssb-ref": "^2.3.0" }, "dependencies": { "abstract-leveldown": { @@ -6218,7 +6748,7 @@ "integrity": "sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==", "dev": true, "requires": { - "xtend": "4.0.1" + "xtend": "~4.0.0" } }, "deferred-leveldown": { @@ -6227,8 +6757,8 @@ "integrity": "sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==", "dev": true, "requires": { - "abstract-leveldown": "5.0.0", - "inherits": "2.0.3" + "abstract-leveldown": "~5.0.0", + "inherits": "^2.0.3" } }, "encoding-down": { @@ -6237,11 +6767,11 @@ "integrity": "sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw==", "dev": true, "requires": { - "abstract-leveldown": "5.0.0", - "inherits": "2.0.3", - "level-codec": "9.0.0", - "level-errors": "2.0.0", - "xtend": "4.0.1" + "abstract-leveldown": "^5.0.0", + "inherits": "^2.0.3", + "level-codec": "^9.0.0", + "level-errors": "^2.0.0", + "xtend": "^4.0.1" } }, "level": { @@ -6250,9 +6780,9 @@ "integrity": "sha512-4epzCOlEcJ529NOdlAYiuiakS/kZTDdiKSBNJmE1B8bsmA+zEVwcpxyH86qJSQTpOu7SODrlaD9WgPRHLkGutA==", "dev": true, "requires": { - "level-packager": "3.1.0", - "leveldown": "4.0.1", - "opencollective-postinstall": "2.0.1" + "level-packager": "^3.0.0", + "leveldown": "^4.0.0", + "opencollective-postinstall": "^2.0.0" } }, "level-codec": { @@ -6267,7 +6797,7 @@ "integrity": "sha512-AmY4HCp9h3OiU19uG+3YWkdELgy05OTP/r23aNHaQKWv8DO787yZgsEuGVkoph40uwN+YdUKnANlrxSsoOaaxg==", "dev": true, "requires": { - "errno": "0.1.7" + "errno": "~0.1.1" } }, "level-iterator-stream": { @@ -6276,9 +6806,9 @@ "integrity": "sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g==", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "xtend": "4.0.1" + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "xtend": "^4.0.0" } }, "level-packager": { @@ -6287,8 +6817,8 @@ "integrity": "sha512-UxVEfK5WH0u0InR3WxTCSAroiorAGKzXWZT6i+nBjambmvINuXFUsFx2Ai3UIjUUtnyWhluv42jMlzUZCsAk9A==", "dev": true, "requires": { - "encoding-down": "5.0.4", - "levelup": "3.1.1" + "encoding-down": "~5.0.0", + "levelup": "^3.0.0" } }, "leveldown": { @@ -6297,11 +6827,11 @@ "integrity": "sha512-ZlBKVSsglPIPJnz4ggB8o2R0bxDxbsMzuQohbfgoFMVApyTE118DK5LNRG0cRju6rt3OkGxe0V6UYACGlq/byg==", "dev": true, "requires": { - "abstract-leveldown": "5.0.0", - "bindings": "1.3.1", - "fast-future": "1.0.2", - "nan": "2.10.0", - "prebuild-install": "4.0.0" + "abstract-leveldown": "~5.0.0", + "bindings": "~1.3.0", + "fast-future": "~1.0.2", + "nan": "~2.10.0", + "prebuild-install": "^4.0.0" } }, "levelup": { @@ -6310,10 +6840,10 @@ "integrity": "sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==", "dev": true, "requires": { - "deferred-leveldown": "4.0.2", - "level-errors": "2.0.0", - "level-iterator-stream": "3.0.1", - "xtend": "4.0.1" + "deferred-leveldown": "~4.0.0", + "level-errors": "~2.0.0", + "level-iterator-stream": "~3.0.0", + "xtend": "~4.0.0" } } } @@ -6323,14 +6853,14 @@ "resolved": "https://registry.npmjs.org/ssb-client/-/ssb-client-4.6.0.tgz", "integrity": "sha512-LyH5Y/U7xvafmAuG1puyhNv4G3Ew9xC67dYgRX0wwbUf5iT422WB1Cvat9qGFAu3/BQbdctXtdEQPxaAn0+hYA==", "requires": { - "explain-error": "1.0.4", - "multicb": "1.2.2", - "multiserver": "1.13.7", - "muxrpc": "6.4.2", - "pull-hash": "1.0.0", - "pull-stream": "3.6.9", - "ssb-config": "2.3.7", - "ssb-keys": "7.1.3" + "explain-error": "^1.0.1", + "multicb": "^1.2.1", + "multiserver": "^1.13.2", + "muxrpc": "^6.4.0", + "pull-hash": "^1.0.0", + "pull-stream": "^3.6.0", + "ssb-config": "^2.2.0", + "ssb-keys": "^7.0.13" } }, "ssb-config": { @@ -6338,10 +6868,10 @@ "resolved": "https://registry.npmjs.org/ssb-config/-/ssb-config-2.3.7.tgz", "integrity": "sha512-djjLoNpDlE0K/UfhU1mNuJqOy8oJsv/6Q8RLDTHdby2Z+r2MxKRaACH3R9DMZyzgnd3wLjXba5ntNvsuabjx5g==", "requires": { - "deep-extend": "0.6.0", - "non-private-ip": "1.4.4", - "os-homedir": "1.0.2", - "rc": "1.2.8" + "deep-extend": "^0.6.0", + "non-private-ip": "^1.2.1", + "os-homedir": "^1.0.1", + "rc": "^1.1.6" } }, "ssb-dark-crystal-schema": { @@ -6349,13 +6879,13 @@ "resolved": "https://registry.npmjs.org/ssb-dark-crystal-schema/-/ssb-dark-crystal-schema-1.2.6.tgz", "integrity": "sha512-FkZ/TO9zzDkzLgxr29MidOCx4zMUcO7zCg1wMADQHLLeN2oYhkZh6FT//gR6H5dCw2klGpXefs7EqLQDLy72lA==", "requires": { - "is-my-json-valid": "2.19.0", - "lodash.merge": "4.6.1", + "is-my-json-valid": "^2.17.2", + "lodash.merge": "^4.6.1", "ssb-invite-schema": "0.0.10", - "ssb-msg-content": "1.0.1", - "ssb-ref": "2.13.9", - "ssb-schema-definitions": "1.1.5", - "ssb-schema-validation": "1.1.0" + "ssb-msg-content": "^1.0.1", + "ssb-ref": "^2.11.1", + "ssb-schema-definitions": "^1.0.6", + "ssb-schema-validation": "^1.1.0" } }, "ssb-ebt": { @@ -6364,12 +6894,12 @@ "integrity": "sha512-fllaNW7g3lvZzzaid3/XsMsh7CKxkin8sWpmwPWejgz5bpfWJlc8MGnj+28l+Y+48G0ti3J5+oDWw5Kp5EuuVQ==", "dev": true, "requires": { - "base64-url": "2.2.0", - "epidemic-broadcast-trees": "6.3.5", - "lossy-store": "1.2.3", - "pull-stream": "3.6.9", - "push-stream-to-pull-stream": "1.0.3", - "ssb-ref": "2.13.9" + "base64-url": "^2.2.0", + "epidemic-broadcast-trees": "^6.3.5", + "lossy-store": "^1.2.3", + "pull-stream": "^3.5.0", + "push-stream-to-pull-stream": "^1.0.0", + "ssb-ref": "^2.9.1" } }, "ssb-friends": { @@ -6378,13 +6908,13 @@ "integrity": "sha512-Pam4O9vAVdD0ewfcWsL6lohvR04DaQStAO3IqzfSWv59lAitVbtNFIdvwIpJNwphZ/xp53/10ndYTzHZBpjUdg==", "dev": true, "requires": { - "flumeview-reduce": "1.3.14", - "layered-graph": "1.1.2", - "pull-cont": "0.1.1", + "flumeview-reduce": "^1.3.0", + "layered-graph": "^1.1.1", + "pull-cont": "^0.1.1", "pull-flatmap": "0.0.1", - "pull-notify": "0.1.1", - "pull-stream": "3.6.9", - "ssb-ref": "2.13.9" + "pull-notify": "^0.1.1", + "pull-stream": "^3.6.0", + "ssb-ref": "^2.7.1" } }, "ssb-invite-schema": { @@ -6392,12 +6922,12 @@ "resolved": "https://registry.npmjs.org/ssb-invite-schema/-/ssb-invite-schema-0.0.10.tgz", "integrity": "sha512-ofofSlTmC9CPdK7Vc4DkTc5hD3OCYZcb2XgiPUGf+8YZ0NhJJ+qKwTIAf29DAhTzXaZfQ2d4/Tjcpp5P38USFg==", "requires": { - "depject": "4.1.1", - "depnest": "1.3.0", - "is-my-json-valid": "2.19.0", - "ssb-msg-content": "1.0.1", - "ssb-ref": "2.13.9", - "ssb-schema-definitions": "1.1.5" + "depject": "^4.1.1", + "depnest": "^1.3.0", + "is-my-json-valid": "^2.17.2", + "ssb-msg-content": "^1.0.1", + "ssb-ref": "^2.11.1", + "ssb-schema-definitions": "^1.0.8" } }, "ssb-keys": { @@ -6405,9 +6935,9 @@ "resolved": "https://registry.npmjs.org/ssb-keys/-/ssb-keys-7.1.3.tgz", "integrity": "sha512-f66vIZ3LkeMx73enLTkPC9ecTUcUrjtVHvRt45nDmubGMom21Z82JQLWYbQ++09v3JG3B4XEir8inhv6AAISSQ==", "requires": { - "chloride": "2.2.10", - "mkdirp": "0.5.1", - "private-box": "0.3.0" + "chloride": "^2.2.8", + "mkdirp": "~0.5.0", + "private-box": "^0.3.0" } }, "ssb-links": { @@ -6416,10 +6946,10 @@ "integrity": "sha512-x09ShIMjwvdZI7aDZm8kc1v5YCGZa9ulCOoxrf/RYJ98s5gbTfO9CBCzeMBAeQ5kRwSuKjiOxJHdeEBkj4Y6hw==", "dev": true, "requires": { - "flumeview-query": "6.3.0", - "map-filter-reduce": "2.2.1", - "pull-stream": "3.6.9", - "ssb-msgs": "5.2.0" + "flumeview-query": "^6.0.0", + "map-filter-reduce": "^2.0.0", + "pull-stream": "^3.1.0", + "ssb-msgs": "^5.2.0" }, "dependencies": { "map-filter-reduce": { @@ -6428,10 +6958,10 @@ "integrity": "sha1-YysSfDrl1q2eIc/dlpG2O4lE/NI=", "dev": true, "requires": { - "binary-search": "1.3.4", + "binary-search": "^1.2.0", "pull-sink-through": "0.0.0", - "pull-stream": "3.6.9", - "typewiselite": "1.0.0" + "pull-stream": "^3.3.0", + "typewiselite": "^1.0.0" } } } @@ -6447,7 +6977,7 @@ "integrity": "sha1-xoHaXNcMV0ySLcpPA8UhU4E1wkM=", "dev": true, "requires": { - "ssb-ref": "2.13.9" + "ssb-ref": "^2.0.0" } }, "ssb-private": { @@ -6456,11 +6986,11 @@ "integrity": "sha512-SiLBKOB1hxkrohzOrRWURlzj6HvPFvr9LLd5P5I5C5KU/RtaWe79nYuFgjUFJFnjWw7X4szCy32/EZMihV1l/Q==", "dev": true, "requires": { - "base64-url": "2.2.0", - "explain-error": "1.0.4", - "flumeview-query": "6.3.0", - "pull-stream": "3.6.9", - "ssb-keys": "7.1.3" + "base64-url": "^2.2.0", + "explain-error": "^1.0.4", + "flumeview-query": "^6.1.0", + "pull-stream": "^3.6.7", + "ssb-keys": "^7.0.14" } }, "ssb-query": { @@ -6469,9 +6999,9 @@ "integrity": "sha512-y4OA2MvGl1jU7bUTYsTmMNSqlPt4eh9401THUW1DO4aFyBFEWvpa3eKJHc8aTmaph2hutPPbdKgEFsWDzw26uw==", "dev": true, "requires": { - "explain-error": "1.0.4", - "flumeview-query": "7.1.1", - "pull-stream": "3.6.9" + "explain-error": "^1.0.1", + "flumeview-query": "^7.0.0", + "pull-stream": "^3.6.2" }, "dependencies": { "flumeview-query": { @@ -6480,13 +7010,13 @@ "integrity": "sha512-3HkgA4u5aIrUIFJ+uRfEpRy/xFwTresz05wf/Sg3NigWrw8JWaGMmHToJpoL8ec9EvYKgP3JNj5wHLw9WEocsA==", "dev": true, "requires": { - "deep-equal": "1.0.1", - "flumeview-level": "3.0.6", - "map-filter-reduce": "3.2.2", + "deep-equal": "^1.0.1", + "flumeview-level": "^3.0.0", + "map-filter-reduce": "^3.2.0", "pull-flatmap": "0.0.1", - "pull-paramap": "1.2.2", + "pull-paramap": "^1.1.3", "pull-sink-through": "0.0.0", - "pull-stream": "3.6.9" + "pull-stream": "^3.4.0" } } } @@ -6496,10 +7026,10 @@ "resolved": "https://registry.npmjs.org/ssb-ref/-/ssb-ref-2.13.9.tgz", "integrity": "sha512-TfatNqLvoP+eW/pMIbCmNcaoDq4R2k8jCtWkwDKx4AtluN/LwtyP931d5Mh+2gmzA04W7kxkr6f5ENGgdadMYg==", "requires": { - "ip": "1.1.5", - "is-canonical-base64": "1.1.1", - "is-valid-domain": "0.0.6", - "multiserver-address": "1.0.1" + "ip": "^1.1.3", + "is-canonical-base64": "^1.1.1", + "is-valid-domain": "~0.0.1", + "multiserver-address": "^1.0.1" } }, "ssb-schema-definitions": { @@ -6507,8 +7037,8 @@ "resolved": "https://registry.npmjs.org/ssb-schema-definitions/-/ssb-schema-definitions-1.1.5.tgz", "integrity": "sha512-lNQHYXs3C4tS64rDdTZOnxbv28q/ghYvGnUG+SivbpKN8kyZXSrCUaXXOF0pkEwrKM+ZzTbUDwcH2Qg+QOhnqA==", "requires": { - "is-my-json-valid": "2.19.0", - "ssb-ref": "2.13.9" + "is-my-json-valid": "^2.17.2", + "ssb-ref": "^2.13.6" } }, "ssb-schema-validation": { @@ -6516,8 +7046,8 @@ "resolved": "https://registry.npmjs.org/ssb-schema-validation/-/ssb-schema-validation-1.1.0.tgz", "integrity": "sha512-hl407bREd9y8+dx+y2FtIMht3LZH6/XhSzumEL2E+z7qEqKFcyKEg5vVBd5A1IRhPPzVb9OZgkh/fPwZEKD1rg==", "requires": { - "is-my-json-valid": "2.19.0", - "ssb-msg-content": "1.0.1" + "is-my-json-valid": "^2.19.0", + "ssb-msg-content": "^1.0.1" } }, "ssb-sort": { @@ -6525,7 +7055,7 @@ "resolved": "https://registry.npmjs.org/ssb-sort/-/ssb-sort-1.1.3.tgz", "integrity": "sha512-oPsF8lGgcHcIb4F1GddV3CbZTJZ0OzxI9fHXH0Zc7ZjqjFlYdqMDxFSuvqJnmtDydJcswyGANiziP1ghd69jOw==", "requires": { - "ssb-ref": "2.13.9" + "ssb-ref": "^2.3.0" } }, "ssb-validate": { @@ -6534,9 +7064,9 @@ "integrity": "sha512-MojZCR1qgZHdO4pnh4Loiqxj7fxP3w+MrA/4smXoKD46ReEnOjt/8Vm2sq3qpqPmUBU2GbEoDlgw7OKy0mWJBw==", "dev": true, "requires": { - "is-canonical-base64": "1.1.1", + "is-canonical-base64": "^1.1.1", "monotonic-timestamp": "0.0.9", - "ssb-ref": "2.13.9" + "ssb-ref": "^2.6.2" } }, "ssb-ws": { @@ -6545,13 +7075,13 @@ "integrity": "sha512-1fK/jXI6lKZadRJDr49t+6yMmWynp6PFrADs3Whmy8IslnYGl83ujhlpRIBvCn1EuVHjV7yLsIiJ8a0X2Kg0DQ==", "dev": true, "requires": { - "emoji-server": "1.0.0", - "multiblob-http": "0.4.2", - "multiserver": "1.13.7", - "muxrpc": "6.4.2", - "pull-box-stream": "1.0.13", - "ssb-ref": "2.13.9", - "stack": "0.1.0" + "emoji-server": "^1.0.0", + "multiblob-http": "^0.4.1", + "multiserver": "^1.2.0", + "muxrpc": "^6.3.3", + "pull-box-stream": "^1.0.13", + "ssb-ref": "^2.3.0", + "stack": "^0.1.0" } }, "stack": { @@ -6566,15 +7096,15 @@ "integrity": "sha512-UqdHjh87OG2gUrNCSM4QRLF5n9h3TFPwrCNyVlkqu31Hej0L/rc8hzKqVvkb2W3x0WMq7PzZdkLfEcBhVOR6lg==", "dev": true, "requires": { - "eslint": "5.4.0", + "eslint": "~5.4.0", "eslint-config-standard": "12.0.0", "eslint-config-standard-jsx": "6.0.2", - "eslint-plugin-import": "2.14.0", - "eslint-plugin-node": "7.0.1", - "eslint-plugin-promise": "4.0.1", - "eslint-plugin-react": "7.11.1", - "eslint-plugin-standard": "4.0.0", - "standard-engine": "9.0.0" + "eslint-plugin-import": "~2.14.0", + "eslint-plugin-node": "~7.0.1", + "eslint-plugin-promise": "~4.0.0", + "eslint-plugin-react": "~7.11.1", + "eslint-plugin-standard": "~4.0.0", + "standard-engine": "~9.0.0" } }, "standard-engine": { @@ -6583,10 +7113,10 @@ "integrity": "sha512-ZfNfCWZ2Xq67VNvKMPiVMKHnMdvxYzvZkf1AH8/cw2NLDBm5LRsxMqvEJpsjLI/dUosZ3Z1d6JlHDp5rAvvk2w==", "dev": true, "requires": { - "deglob": "2.1.1", - "get-stdin": "6.0.0", - "minimist": "1.2.0", - "pkg-conf": "2.1.0" + "deglob": "^2.1.0", + "get-stdin": "^6.0.0", + "minimist": "^1.1.0", + "pkg-conf": "^2.0.0" } }, "static-extend": { @@ -6595,8 +7125,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -6605,7 +7135,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -6621,8 +7151,8 @@ "resolved": "https://registry.npmjs.org/stream-to-pull-stream/-/stream-to-pull-stream-1.7.2.tgz", "integrity": "sha1-dXYJrhzr0zx0MtSvvjH/eGULnd4=", "requires": { - "looper": "3.0.0", - "pull-stream": "3.6.9" + "looper": "^3.0.0", + "pull-stream": "^3.2.3" }, "dependencies": { "looper": { @@ -6632,22 +7162,14 @@ } } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "5.1.2" - } - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string.prototype.trim": { @@ -6655,9 +7177,17 @@ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.12.0", - "function-bind": "1.1.1" + "define-properties": "^1.1.2", + "es-abstract": "^1.5.0", + "function-bind": "^1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" } }, "stringify-entities": { @@ -6666,10 +7196,10 @@ "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==", "dev": true, "requires": { - "character-entities-html4": "1.1.2", - "character-entities-legacy": "1.1.2", - "is-alphanumerical": "1.0.2", - "is-hexadecimal": "1.0.2" + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-hexadecimal": "^1.0.0" } }, "strip-ansi": { @@ -6677,7 +7207,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -6713,12 +7243,12 @@ "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", "dev": true, "requires": { - "ajv": "6.6.2", - "ajv-keywords": "3.2.0", - "chalk": "2.4.1", - "lodash": "4.17.11", + "ajv": "^6.0.1", + "ajv-keywords": "^3.0.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", "slice-ansi": "1.0.0", - "string-width": "2.1.1" + "string-width": "^2.1.1" }, "dependencies": { "ansi-regex": { @@ -6733,7 +7263,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "chalk": { @@ -6742,9 +7272,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "is-fullwidth-code-point": { @@ -6759,8 +7289,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -6769,7 +7299,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "supports-color": { @@ -6778,7 +7308,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -6807,13 +7337,13 @@ "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", "dev": true, "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -6822,7 +7352,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } } } @@ -6833,14 +7363,14 @@ "integrity": "sha512-zMDVJiE5I6Y4XGjlueGXJIX2YIkbDN44broZlnypT38Hj/czfOXrszHNNJBF/DXR8n+x6gbfSx68x04kIEHdrw==", "dev": true, "requires": { - "chalk": "1.1.3", - "duplexer": "0.1.1", - "figures": "1.7.0", - "lodash": "4.17.11", - "pretty-ms": "2.1.0", - "repeat-string": "1.6.1", - "tap-out": "2.1.0", - "through2": "2.0.5" + "chalk": "^1.0.0", + "duplexer": "^0.1.1", + "figures": "^1.4.0", + "lodash": "^4.17.10", + "pretty-ms": "^2.1.0", + "repeat-string": "^1.5.2", + "tap-out": "^2.1.0", + "through2": "^2.0.0" }, "dependencies": { "figures": { @@ -6849,8 +7379,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } } } @@ -6860,19 +7390,19 @@ "resolved": "https://registry.npmjs.org/tape/-/tape-4.9.2.tgz", "integrity": "sha512-lPXKRKILZ1kZaUy5ynWKs8ATGSUO7HAFHCFnBam6FaGSqPdOwMWbxXHq4EXFLE8WRTleo/YOMXkaUTRmTB1Fiw==", "requires": { - "deep-equal": "1.0.1", - "defined": "1.0.0", - "for-each": "0.3.3", - "function-bind": "1.1.1", - "glob": "7.1.3", - "has": "1.0.3", - "inherits": "2.0.3", - "minimist": "1.2.0", - "object-inspect": "1.6.0", - "resolve": "1.7.1", - "resumer": "0.0.0", - "string.prototype.trim": "1.1.2", - "through": "2.3.8" + "deep-equal": "~1.0.1", + "defined": "~1.0.0", + "for-each": "~0.3.3", + "function-bind": "~1.1.1", + "glob": "~7.1.2", + "has": "~1.0.3", + "inherits": "~2.0.3", + "minimist": "~1.2.0", + "object-inspect": "~1.6.0", + "resolve": "~1.7.1", + "resumer": "~0.0.0", + "string.prototype.trim": "~1.1.2", + "through": "~2.3.8" } }, "tape-plus": { @@ -6897,10 +7427,10 @@ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", "requires": { - "chownr": "1.1.1", - "mkdirp": "0.5.1", - "pump": "1.0.3", - "tar-stream": "1.6.2" + "chownr": "^1.0.1", + "mkdirp": "^0.5.1", + "pump": "^1.0.0", + "tar-stream": "^1.1.2" }, "dependencies": { "pump": { @@ -6908,8 +7438,8 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } } } @@ -6919,13 +7449,13 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", "requires": { - "bl": "1.2.2", - "buffer-alloc": "1.2.0", - "end-of-stream": "1.4.1", - "fs-constants": "1.0.0", - "readable-stream": "2.3.6", - "to-buffer": "1.1.1", - "xtend": "4.0.1" + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" } }, "text-table": { @@ -6944,8 +7474,8 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, "tmp": { @@ -6954,7 +7484,7 @@ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "to-buffer": { @@ -6973,7 +7503,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "to-regex": { @@ -6982,10 +7512,10 @@ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -6994,8 +7524,8 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" }, "dependencies": { "is-number": { @@ -7004,7 +7534,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } } } @@ -7015,7 +7545,7 @@ "integrity": "sha1-iN7+zUOtsu9ZhiXw49WffzQpQbo=", "dev": true, "requires": { - "vfile": "1.4.0" + "vfile": "^1.0.0" } }, "trim": { @@ -7046,7 +7576,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -7059,7 +7589,7 @@ "resolved": "https://registry.npmjs.org/tweetnacl-auth/-/tweetnacl-auth-0.3.1.tgz", "integrity": "sha1-t1vC3xVkm7hOi5qjwGacbEvODSU=", "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "0.x.x" } }, "type-check": { @@ -7068,7 +7598,7 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "typedarray": { @@ -7083,7 +7613,7 @@ "integrity": "sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE=", "dev": true, "requires": { - "typewise-core": "1.2.0" + "typewise-core": "^1.2.0" } }, "typewise-core": { @@ -7114,8 +7644,8 @@ "integrity": "sha512-+XZuV691Cn4zHsK0vkKYwBEwB74T3IZIcxrgn2E4rKwTfFyI1zCh7X7grwh9Re08fdPlarIdyWgI8aVB3F5A5g==", "dev": true, "requires": { - "inherits": "2.0.3", - "xtend": "4.0.1" + "inherits": "^2.0.1", + "xtend": "^4.0.1" } }, "unified": { @@ -7124,12 +7654,12 @@ "integrity": "sha1-FLxs1A2Y//91tAVQa62HPsu6w7o=", "dev": true, "requires": { - "attach-ware": "1.1.1", - "bail": "1.0.3", - "extend": "3.0.2", - "unherit": "1.1.1", - "vfile": "1.4.0", - "ware": "1.3.0" + "attach-ware": "^1.0.0", + "bail": "^1.0.0", + "extend": "^3.0.0", + "unherit": "^1.0.4", + "vfile": "^1.0.0", + "ware": "^1.3.0" } }, "union-value": { @@ -7138,10 +7668,10 @@ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { @@ -7150,7 +7680,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { @@ -7159,10 +7689,10 @@ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } @@ -7185,7 +7715,7 @@ "integrity": "sha512-FiGu34ziNsZA3ZUteZxSFaczIjGmksfSgdKqBfOejrrfzyUy5b7YrlzT1Bcvi+djkYDituJDy2XB7tGTeBieKw==", "dev": true, "requires": { - "unist-util-visit-parents": "2.0.1" + "unist-util-visit-parents": "^2.0.0" } }, "unist-util-visit-parents": { @@ -7194,7 +7724,7 @@ "integrity": "sha512-6B0UTiMfdWql4cQ03gDTCSns+64Zkfo2OCbK31Ov0uMizEz+CJeAp0cgZVb5Fhmcd7Bct2iRNywejT0orpbqUA==", "dev": true, "requires": { - "unist-util-is": "2.1.2" + "unist-util-is": "^2.1.2" } }, "unset-value": { @@ -7203,8 +7733,8 @@ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -7213,9 +7743,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -7249,7 +7779,7 @@ "integrity": "sha1-F+soB5h/dpUunASF/DEdBqgmouA=", "dev": true, "requires": { - "os-homedir": "1.0.2" + "os-homedir": "^1.0.0" } }, "uri-js": { @@ -7258,7 +7788,7 @@ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "punycode": "2.1.1" + "punycode": "^2.1.0" } }, "urix": { @@ -7279,7 +7809,7 @@ "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", "dev": true, "requires": { - "os-homedir": "1.0.2" + "os-homedir": "^1.0.0" } }, "util-deprecate": { @@ -7293,8 +7823,8 @@ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { - "spdx-correct": "3.1.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "vfile": { @@ -7309,7 +7839,7 @@ "integrity": "sha1-hKTWbQNRP2FAqE4Hdu8ISNTwrZU=", "dev": true, "requires": { - "to-vfile": "1.0.0" + "to-vfile": "^1.0.0" } }, "vfile-find-up": { @@ -7318,7 +7848,7 @@ "integrity": "sha1-VgTab+RTs0NQY3mE61/kkJ4oA5A=", "dev": true, "requires": { - "to-vfile": "1.0.0" + "to-vfile": "^1.0.0" } }, "vfile-reporter": { @@ -7327,13 +7857,13 @@ "integrity": "sha1-IacAm/5V4k34/0Mqpb9vbvp05Bg=", "dev": true, "requires": { - "chalk": "1.1.3", - "log-symbols": "1.0.2", - "plur": "2.1.2", - "repeat-string": "1.6.1", - "string-width": "1.0.2", - "text-table": "0.2.0", - "vfile-sort": "1.0.0" + "chalk": "^1.1.0", + "log-symbols": "^1.0.2", + "plur": "^2.0.0", + "repeat-string": "^1.5.0", + "string-width": "^1.0.0", + "text-table": "^0.2.0", + "vfile-sort": "^1.0.0" } }, "vfile-sort": { @@ -7348,7 +7878,7 @@ "integrity": "sha1-0bFPOdLiy0q4xAmPdW/ksWTkc9Q=", "dev": true, "requires": { - "wrap-fn": "0.1.5" + "wrap-fn": "^0.1.0" } }, "which": { @@ -7356,7 +7886,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -7374,7 +7904,7 @@ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2 || 2" } }, "word-wrap": { @@ -7394,8 +7924,8 @@ "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" } }, "wrap-fn": { @@ -7418,7 +7948,7 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" } }, "ws": { @@ -7426,8 +7956,8 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", "requires": { - "options": "0.0.6", - "ultron": "1.0.2" + "options": ">=0.0.5", + "ultron": "1.0.x" } }, "xtend": { @@ -7451,18 +7981,18 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "3.0.0", - "get-caller-file": "1.0.3", - "os-locale": "3.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "4.0.0", - "yargs-parser": "11.1.1" + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" }, "dependencies": { "ansi-regex": { @@ -7480,8 +8010,8 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -7489,7 +8019,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -7499,8 +8029,8 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "requires": { - "camelcase": "5.0.0", - "decamelize": "1.2.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } }, "zerr": { diff --git a/recover/async/reply.js b/recover/async/reply.js index e3a0224..5680cab 100644 --- a/recover/async/reply.js +++ b/recover/async/reply.js @@ -1,5 +1,6 @@ const ScuttleInvite = require('scuttle-invite') const pull = require('pull-stream') +const ephemeralKeys = require('ephemeral-keys') const PullShardsByRoot = require('../../shard/pull/by-root') @@ -15,7 +16,8 @@ module.exports = function (server) { value: { author: inviteAuthor, content: { - root: rootId + root: rootId, + ephPublicKey } } } = invite @@ -54,11 +56,21 @@ module.exports = function (server) { server.private.unbox(shard, (err, theDecryptedShard) => { if (err) return callback(err) + let shardToSend + if (ephPublicKey) { + // TODO: validate ephPublicKey looks as it should + // TODO: contextMessage could also include server.id? + const contextMessage = rootId + shardToSend = ephemeralKeys.boxMessage(theDecryptedShard, ephPublicKey, contextMessage) + } else { + shardToSend = theDecryptedShard + } + const reply = { root: rootId, branch: inviteId, accept: true, - body: theDecryptedShard, + body: shardToSend, recps: [author, server.id], shareVersion: version } diff --git a/recover/async/request.js b/recover/async/request.js index d40bc3b..dfab637 100644 --- a/recover/async/request.js +++ b/recover/async/request.js @@ -40,7 +40,8 @@ module.exports = function (server) { version: '1', // ditto root: rootId, recps, - body: ephPublicKey + body: 'Hi, you are holding a shard for me, can I please have it back?', + ephPublicKey }) }) }), diff --git a/test/recover/async/request.test.js b/test/recover/async/request.test.js index 478f408..0d82a9a 100644 --- a/test/recover/async/request.test.js +++ b/test/recover/async/request.test.js @@ -36,6 +36,7 @@ describe('recover.async.request', context => { if (err) console.error(err) var rootId = data.root.key request(rootId, (err, msgs) => { +console.log(JSON.stringify(msgs,null,4)) assert.notOk(err, 'null errors') assert.ok(msgs, 'request messages') assert.equal(msgs.length, recps.length, 'publishes a request for each shard') From 69fced9f2e1e6875fb1b6bde14d0bc3889713db6 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Thu, 10 Jan 2019 18:31:31 +0100 Subject: [PATCH 03/60] temporarily disable validating shards, and encrypted ones wont pass --- isReply.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/isReply.js b/isReply.js index 00c8021..284cd38 100644 --- a/isReply.js +++ b/isReply.js @@ -11,7 +11,7 @@ module.exports = function isReply (msg) { const errors = [] if (!_isReply(msg)) errors.push(new Error('invalid reply')) - if (!validateShard(shard, shareVersion)) errors.push(new Error('invalid shard')) + // if (!validateShard(shard, shareVersion)) errors.push(new Error('invalid shard')) if (!errors.length) return true From 74653aec61abd7004da43307f2434a38e54414a9 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Thu, 10 Jan 2019 18:31:59 +0100 Subject: [PATCH 04/60] reply test --- test/recover/async/reply/v2.test.js | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/test/recover/async/reply/v2.test.js b/test/recover/async/reply/v2.test.js index 4131e49..93e99d0 100644 --- a/test/recover/async/reply/v2.test.js +++ b/test/recover/async/reply/v2.test.js @@ -6,10 +6,12 @@ const Reply = require('../../../../recover/async/reply') const isShard = require('../../../../isShard') const isReply = require('../../../../isReply') const { share } = require('../../../../lib/secrets-wrapper/v2') +const ephemeralKeys = require('ephemeral-keys') describe('recover.async.reply (v2)', context => { let server, reply, katie let rootId, katiesInvite, katiesShard + let ephPublicKey, dbKey context.beforeEach(c => { server = Server() @@ -18,6 +20,8 @@ describe('recover.async.reply (v2)', context => { rootId = '%g1gbRKarJT4au9De2r4aJ+MghFSAyQzjfVnnxtJNBBw=.sha256' + dbKey = { rootId, recp: server.id } + katiesInvite = { type: 'invite', root: rootId, @@ -47,21 +51,25 @@ describe('recover.async.reply (v2)', context => { katie.publish(katiesShard, (err, shardMsg) => { if (err) throw err - katie.publish(katiesInvite, (err, inviteMsg) => { + ephemeralKeys.generateAndStore(dbKey, (err, ephPublicKey) => { if (err) throw err - reply(inviteMsg.key, (err, replyMsg) => { - assert.notOk(err, 'null errors') - assert.ok(replyMsg, 'returns a reply message') - assert.ok(isReply(replyMsg), 'message are valid replies') - assert.equal(replyMsg.value.content.shareVersion, - '2.0.0', - 'reply contains correct shareVersion') - next() + katiesInvite.ephPublicKey = ephPublicKey + katie.publish(katiesInvite, (err, inviteMsg) => { + if (err) throw err + reply(inviteMsg.key, (err, replyMsg) => { + assert.notOk(err, 'null errors') + assert.ok(replyMsg, 'returns a reply message') + assert.ok(isReply(replyMsg), 'message are valid replies') + assert.equal(replyMsg.value.content.shareVersion, + '2.0.0', + 'reply contains correct shareVersion') + next() + }) }) }) }) }) - + // TODO: add generateAndStore to remaining tests context('Throws error if associated shard does not exist', (assert, next) => { katie.publish(katiesInvite, (err, inviteMsg) => { if (err) throw err From 1336ef2d932b4d1fec945ec34514924d7856d1da Mon Sep 17 00:00:00 2001 From: ameba23 Date: Thu, 10 Jan 2019 18:32:35 +0100 Subject: [PATCH 05/60] recombinetest --- test/recover/async/recombine/request/v2.test.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/recover/async/recombine/request/v2.test.js b/test/recover/async/recombine/request/v2.test.js index 3b2680e..33c2c85 100644 --- a/test/recover/async/recombine/request/v2.test.js +++ b/test/recover/async/recombine/request/v2.test.js @@ -1,6 +1,7 @@ const { describe } = require('tape-plus') const { unbox } = require('ssb-keys') const getContent = require('ssb-msg-content') +const ephemeralKeys = require('ephemeral-keys') const Server = require('../../../../testbot') const Share = require('../../../../../share/async/share') @@ -224,6 +225,9 @@ describe('recover.async.recombine (request v2 shards)', context => { .find(shard => shard.recps.find(recp => recp === custodianId)) .shard + const unboxedShard = unbox(shard, findCustodian(custodianId).keys) + const contextMessage = rootId // TODO: better contextMessage + const boxedShard = ephemeralKeys.boxMessage(unboxedShard, content.ephPublicKey, contextMessage) collection[custodianId] = { type: 'invite-reply', root: rootId, @@ -231,7 +235,7 @@ describe('recover.async.recombine (request v2 shards)', context => { accept: true, version: '1', shareVersion: '2.0.0', - body: unbox(shard, findCustodian(custodianId).keys), + body: boxedShard, recps: content.recps } From 8728bf3e8817c7a1ca06642047a710a0786b629f Mon Sep 17 00:00:00 2001 From: ameba23 Date: Mon, 14 Jan 2019 11:13:45 +0100 Subject: [PATCH 06/60] use sbot plugin for tests --- test/testbot.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/testbot.js b/test/testbot.js index 2f44bef..e04bead 100644 --- a/test/testbot.js +++ b/test/testbot.js @@ -3,6 +3,7 @@ module.exports = function Testbot (opts) { .use(require('ssb-private')) .use(require('ssb-query')) .use(require('ssb-backlinks')) + .use(require('ephemeral-keys')) .call(opts) return server From 95e3cdce7d15bde5186126a5fb75c79fad6e478e Mon Sep 17 00:00:00 2001 From: ameba23 Date: Mon, 14 Jan 2019 14:06:40 +0100 Subject: [PATCH 07/60] use plugin, begin decryption in recover.async.mend (not yet working) --- recover/async/mend.js | 29 ++++++++++++------- recover/async/reply.js | 3 +- recover/async/request.js | 3 +- .../async/recombine/request/v2.test.js | 3 +- test/recover/async/reply/v2.test.js | 3 +- 5 files changed, 23 insertions(+), 18 deletions(-) diff --git a/recover/async/mend.js b/recover/async/mend.js index 8f60e94..bcec499 100644 --- a/recover/async/mend.js +++ b/recover/async/mend.js @@ -1,6 +1,7 @@ const getContent = require('ssb-msg-content') const get = require('lodash.get') const { combine, unpack, validateShard } = require('../../lib/secrets-wrapper') +const pull = require('pull-stream') // see recover/async/fetch.js for shape of data @@ -48,24 +49,32 @@ function mode (array) { function getShards ({ root, shardsData }, shareVersion) { return root - ? getRequestedShards(shardsData, shareVersion) + ? getRequestedShards(shardsData, shareVersion, root.key) : getForwardedShards(shardsData, shareVersion) } -function getRequestedShards (shardsData, shareVersion) { - return shardsData - .reduce((acc, { feedId, shard, requestsData }) => { - // mix: This needs to change for ephemeral returns - // - need to check replyVersion (what mode of reply is this?) - // - can't take any successfull request - +function getRequestedShards (shardsData, shareVersion, rootId) { + pull( + pull.values(shardsData.reduce((acc, { feedId, shard, requestsData }) => { const reply = get(requestsData.find(request => request.reply), 'reply') if (!reply) return acc acc.push(getShare(reply)) return acc - }, []) - .filter(shard => validateShard(shard, shareVersion)) + }, [])), + pull.asyncMap((shard, cb) => { + const dbKey = { rootId, recp: feedId } + const contextMessage = rootId + server.ephemeral.unBoxMessage(dbKey, shard, contextMessage, (err, rawShard) => { + if (err) cb(err) + cb(null, rawShard) + }) + }), + pull.filter(shard => validateShard(shard, shareVersion)), + pull.collect((err, shards) => { + return shards + }) + ) } function getForwardedShards (shardsData, shareVersion) { diff --git a/recover/async/reply.js b/recover/async/reply.js index 5680cab..7967ab8 100644 --- a/recover/async/reply.js +++ b/recover/async/reply.js @@ -1,6 +1,5 @@ const ScuttleInvite = require('scuttle-invite') const pull = require('pull-stream') -const ephemeralKeys = require('ephemeral-keys') const PullShardsByRoot = require('../../shard/pull/by-root') @@ -61,7 +60,7 @@ module.exports = function (server) { // TODO: validate ephPublicKey looks as it should // TODO: contextMessage could also include server.id? const contextMessage = rootId - shardToSend = ephemeralKeys.boxMessage(theDecryptedShard, ephPublicKey, contextMessage) + shardToSend = server.ephemeral.boxMessage(theDecryptedShard, ephPublicKey, contextMessage) } else { shardToSend = theDecryptedShard } diff --git a/recover/async/request.js b/recover/async/request.js index dfab637..ade3614 100644 --- a/recover/async/request.js +++ b/recover/async/request.js @@ -3,7 +3,6 @@ const pull = require('pull-stream') const getContent = require('ssb-msg-content') const { isMsgId, isFeed } = require('ssb-ref') const { isRequest } = require('ssb-dark-crystal-schema') -const ephemeralKeys = require('ephemeral-keys') const PullShardsByRoot = require('../../shard/pull/by-root') @@ -33,7 +32,7 @@ module.exports = function (server) { // TODO: not sure if we need to tell level that dbkey is an object const dbKey = { rootId, recp: recps.find(notMe) } - ephemeralKeys.generateAndStore(dbKey, (err, ephPublicKey) => { + server.ephemeral.generateAndStore(dbKey, (err, ephPublicKey) => { if (err) cb(err) cb(null, { type: 'invite', // is over-written by invites.async.private.publish diff --git a/test/recover/async/recombine/request/v2.test.js b/test/recover/async/recombine/request/v2.test.js index 33c2c85..edad4ad 100644 --- a/test/recover/async/recombine/request/v2.test.js +++ b/test/recover/async/recombine/request/v2.test.js @@ -1,7 +1,6 @@ const { describe } = require('tape-plus') const { unbox } = require('ssb-keys') const getContent = require('ssb-msg-content') -const ephemeralKeys = require('ephemeral-keys') const Server = require('../../../../testbot') const Share = require('../../../../../share/async/share') @@ -227,7 +226,7 @@ describe('recover.async.recombine (request v2 shards)', context => { const unboxedShard = unbox(shard, findCustodian(custodianId).keys) const contextMessage = rootId // TODO: better contextMessage - const boxedShard = ephemeralKeys.boxMessage(unboxedShard, content.ephPublicKey, contextMessage) + const boxedShard = server.ephemeral.boxMessage(unboxedShard, content.ephPublicKey, contextMessage) collection[custodianId] = { type: 'invite-reply', root: rootId, diff --git a/test/recover/async/reply/v2.test.js b/test/recover/async/reply/v2.test.js index 93e99d0..92f9ef0 100644 --- a/test/recover/async/reply/v2.test.js +++ b/test/recover/async/reply/v2.test.js @@ -6,7 +6,6 @@ const Reply = require('../../../../recover/async/reply') const isShard = require('../../../../isShard') const isReply = require('../../../../isReply') const { share } = require('../../../../lib/secrets-wrapper/v2') -const ephemeralKeys = require('ephemeral-keys') describe('recover.async.reply (v2)', context => { let server, reply, katie @@ -51,7 +50,7 @@ describe('recover.async.reply (v2)', context => { katie.publish(katiesShard, (err, shardMsg) => { if (err) throw err - ephemeralKeys.generateAndStore(dbKey, (err, ephPublicKey) => { + server.ephemeral.generateAndStore(dbKey, (err, ephPublicKey) => { if (err) throw err katiesInvite.ephPublicKey = ephPublicKey katie.publish(katiesInvite, (err, inviteMsg) => { From caa56c3fa4c2798b5713f2edc362db8023f7aa95 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Mon, 14 Jan 2019 17:12:28 +0100 Subject: [PATCH 08/60] mend takes server --- recover/async/mend.js | 36 +++++++++++++++++++----------------- recover/async/recombine.js | 2 +- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/recover/async/mend.js b/recover/async/mend.js index bcec499..8fde305 100644 --- a/recover/async/mend.js +++ b/recover/async/mend.js @@ -5,27 +5,29 @@ const pull = require('pull-stream') // see recover/async/fetch.js for shape of data -module.exports = function mend (data, cb) { - if (data.shardsData.length === 0) return cb(new Error('cannot find any shards')) +module.exports = function mend (server) { + return function (data, cb) { + if (data.shardsData.length === 0) return cb(new Error('cannot find any shards')) - const shareVersion = getShareVersion(data) - if (!shareVersion) return cb(null, new Error('unknown share version, unable to mend shards')) + const shareVersion = getShareVersion(data) + if (!shareVersion) return cb(null, new Error('unknown share version, unable to mend shards')) - const shards = getShards(data, shareVersion) - if (!shards.length) return cb(new Error('no valid shards provided to mend')) + const shards = getShards(data, shareVersion) + if (!shards.length) return cb(new Error('no valid shards provided to mend')) - var secret - try { - secret = combine(shards, shareVersion) - } catch (err) { - return cb(err) - } - if (!secret) return cb(new Error('unable to successfully mend shards')) + var secret + try { + secret = combine(shards, shareVersion) + } catch (err) { + return cb(err) + } + if (!secret) return cb(new Error('unable to successfully mend shards')) - const unpackedSecret = unpack(secret, shareVersion) - if (!unpackedSecret) return cb(new Error('Badly formed secret')) + const unpackedSecret = unpack(secret, shareVersion) + if (!unpackedSecret) return cb(new Error('Badly formed secret')) - cb(null, unpackedSecret) + cb(null, unpackedSecret) + } } // helpers @@ -63,7 +65,7 @@ function getRequestedShards (shardsData, shareVersion, rootId) { return acc }, [])), pull.asyncMap((shard, cb) => { - const dbKey = { rootId, recp: feedId } + const dbKey = { rootId, recp: shard.feedId } const contextMessage = rootId server.ephemeral.unBoxMessage(dbKey, shard, contextMessage, (err, rawShard) => { if (err) cb(err) diff --git a/recover/async/recombine.js b/recover/async/recombine.js index f7e4882..50b727f 100644 --- a/recover/async/recombine.js +++ b/recover/async/recombine.js @@ -8,7 +8,7 @@ module.exports = function (server) { fetch(server)(root, (err, data) => { if (err) return cb(err) - mend(data, cb) + mend(server)(data, cb) }) } } From 32c9cdbb2476a1bf4d7f2e6d193c3d1434c324a9 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Thu, 24 Jan 2019 22:23:44 +0100 Subject: [PATCH 09/60] stringify dbKey --- recover/async/request.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/recover/async/request.js b/recover/async/request.js index ade3614..a2937b6 100644 --- a/recover/async/request.js +++ b/recover/async/request.js @@ -30,8 +30,7 @@ module.exports = function (server) { const { recps } = getContent(shard) // TODO: not sure if we need to tell level that dbkey is an object - const dbKey = { rootId, recp: recps.find(notMe) } - + const dbKey = JSON.stringify({ rootId, recp: recps.find(notMe) }) server.ephemeral.generateAndStore(dbKey, (err, ephPublicKey) => { if (err) cb(err) cb(null, { From 5c85d7f2cf830de3e14b749fb808c3558f105382 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Thu, 24 Jan 2019 22:24:31 +0100 Subject: [PATCH 10/60] fix bug and improve method --- recover/async/mend.js | 157 +++++++++--------- .../async/recombine/request/v2.test.js | 1 - 2 files changed, 83 insertions(+), 75 deletions(-) diff --git a/recover/async/mend.js b/recover/async/mend.js index 8fde305..f902355 100644 --- a/recover/async/mend.js +++ b/recover/async/mend.js @@ -8,95 +8,104 @@ const pull = require('pull-stream') module.exports = function mend (server) { return function (data, cb) { if (data.shardsData.length === 0) return cb(new Error('cannot find any shards')) - +console.log('here') const shareVersion = getShareVersion(data) if (!shareVersion) return cb(null, new Error('unknown share version, unable to mend shards')) - const shards = getShards(data, shareVersion) - if (!shards.length) return cb(new Error('no valid shards provided to mend')) + // const shards = getShards(data, shareVersion) + getShards(data, shareVersion, (err, shards) => { + if (err) return cb(err) + if (!shards.length) return cb(new Error('no valid shards provided to mend')) - var secret - try { - secret = combine(shards, shareVersion) - } catch (err) { - return cb(err) - } - if (!secret) return cb(new Error('unable to successfully mend shards')) + var secret + try { + secret = combine(shards, shareVersion) + } catch (err) { + return cb(err) + } + if (!secret) return cb(new Error('unable to successfully mend shards')) - const unpackedSecret = unpack(secret, shareVersion) - if (!unpackedSecret) return cb(new Error('Badly formed secret')) + const unpackedSecret = unpack(secret, shareVersion) + if (!unpackedSecret) return cb(new Error('Badly formed secret')) - cb(null, unpackedSecret) + cb(null, unpackedSecret) + }) } -} -// helpers + // helpers -function getShareVersion ({ ritual, shardsData }) { - // if we have the ritual, that's the best record of the shareVersion (I think?!) - if (ritual) return getContent(ritual).version - // otherwise we've been forwarded shards, and can check version on them - const versions = shardsData - .map(data => get(data, 'forwardsData[0].forward.value.content.shareVersion')) - .filter(Boolean) + function getShareVersion ({ ritual, shardsData }) { + // if we have the ritual, that's the best record of the shareVersion (I think?!) + if (ritual) return getContent(ritual).version + // otherwise we've been forwarded shards, and can check version on them + const versions = shardsData + .map(data => get(data, 'forwardsData[0].forward.value.content.shareVersion')) + .filter(Boolean) - return mode(versions) -} -function mode (array) { - return array.sort((a, b) => ( - array.filter(v => v === a).length - - array.filter(v => v === b).length - )).pop() -} + return mode(versions) + } + function mode (array) { + return array.sort((a, b) => ( + array.filter(v => v === a).length - + array.filter(v => v === b).length + )).pop() + } -function getShards ({ root, shardsData }, shareVersion) { - return root - ? getRequestedShards(shardsData, shareVersion, root.key) - : getForwardedShards(shardsData, shareVersion) -} + function getShards ({ root, shardsData }, shareVersion, callback) { + if (root) { + getRequestedShards(shardsData, shareVersion, root.key, callback) + } else { + callback(null, getForwardedShards(shardsData, shareVersion)) + } + } -function getRequestedShards (shardsData, shareVersion, rootId) { - pull( - pull.values(shardsData.reduce((acc, { feedId, shard, requestsData }) => { - const reply = get(requestsData.find(request => request.reply), 'reply') - if (!reply) return acc - - acc.push(getShare(reply)) - return acc - }, [])), - pull.asyncMap((shard, cb) => { - const dbKey = { rootId, recp: shard.feedId } - const contextMessage = rootId - server.ephemeral.unBoxMessage(dbKey, shard, contextMessage, (err, rawShard) => { - if (err) cb(err) - cb(null, rawShard) + function getRequestedShards (shardsData, shareVersion, rootId, callback) { + pull( + pull.values(shardsData.reduce((acc, { feedId, shard, requestsData }) => { + const reply = get(requestsData.find(request => request.reply), 'reply') + if (!reply) return acc + + acc.push({ feedId, share: getShare(reply) }) + return acc + }, [])), + pull.asyncMap((shard, cb) => { + const dbKey = JSON.stringify({ rootId, recp: shard.feedId }) + + const contextMessage = rootId + server.ephemeral.unBoxMessage(dbKey, shard.share, contextMessage, (err, rawShard) => { + if (err) cb(err) + cb(null, rawShard) + }) + }, 10), + pull.filter(shard => validateShard(shard, shareVersion)), + pull.collect((err, shards) => { + if (err) callback(err) + // return shards + callback(null, shards) }) - }), - pull.filter(shard => validateShard(shard, shareVersion)), - pull.collect((err, shards) => { - return shards - }) - ) -} + ) + } -function getForwardedShards (shardsData, shareVersion) { - return shardsData - .reduce((acc, { feedId, shard, forwardsData }) => { - const forward = get(forwardsData, '[0].forward') // just get the first fwd - if (!forward) return acc - if (getContent(forward).shareVersion !== shareVersion) return acc - - acc.push(getShare(forward)) - return acc - }, []) - .filter(shard => validateShard(shard, shareVersion)) -} + function getForwardedShards (shardsData, shareVersion) { + return shardsData + .reduce((acc, { feedId, shard, forwardsData }) => { + const forward = get(forwardsData, '[0].forward') // just get the first fwd + if (!forward) return acc + if (getContent(forward).shareVersion !== shareVersion) return acc + + acc.push(getShare(forward)) + return acc + }, []) + .filter(shard => validateShard(shard, shareVersion)) + } -function getShare (msg) { - const { type, body, shard } = getContent(msg) + function getShare (msg) { + const { type, body, shard } = getContent(msg) - switch (type) { - case 'invite-reply': return body - case 'dark-crystal/forward': return shard + switch (type) { + case 'invite-reply': return body + case 'dark-crystal/forward': return shard + } } + } diff --git a/test/recover/async/recombine/request/v2.test.js b/test/recover/async/recombine/request/v2.test.js index edad4ad..feb2e28 100644 --- a/test/recover/async/recombine/request/v2.test.js +++ b/test/recover/async/recombine/request/v2.test.js @@ -52,7 +52,6 @@ describe('recover.async.recombine (request v2 shards)', context => { bob.publish(replies[bob.id], (err, bobReply) => { if (err) console.error(err) - recombine(rootId, (err, returnedSecret) => { assert.notOk(err, 'error is null') assert.equal(secret, returnedSecret.secret, 'returns the correct secret') From 90fd9a904a84b45c5d4a0cb521c3841b93f8c750 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 25 Jan 2019 10:08:49 +0100 Subject: [PATCH 11/60] pass server to v1 forward test --- test/recover/async/mend/forward/v1.test.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/recover/async/mend/forward/v1.test.js b/test/recover/async/mend/forward/v1.test.js index 5a84a66..e99b3c5 100644 --- a/test/recover/async/mend/forward/v1.test.js +++ b/test/recover/async/mend/forward/v1.test.js @@ -17,8 +17,7 @@ describe('recover.async.mend (v1 forward)', context => { context('works!', (assert, next) => { getFetchData(server, (err, data) => { if (err) throw err - - Mend(data, (err, secret) => { + Mend(server)(data, (err, secret) => { assert.equal(err, null, 'no error') assert.equal(secret.secret, 'my treasure location', 'secret is revealed') From 4c2ead0aead8393c2627bc8908f045ff204b9cdc Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 25 Jan 2019 10:09:04 +0100 Subject: [PATCH 12/60] pass server to v2 forward test --- test/recover/async/mend/forward/v2.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/recover/async/mend/forward/v2.test.js b/test/recover/async/mend/forward/v2.test.js index 9dde72c..475224c 100644 --- a/test/recover/async/mend/forward/v2.test.js +++ b/test/recover/async/mend/forward/v2.test.js @@ -18,7 +18,7 @@ describe('recover.async.mend (v2 forward)', context => { getFetchData(server, (err, data) => { if (err) throw err - Mend(data, (err, secret) => { + Mend(server)(data, (err, secret) => { assert.equal(err, null, 'no error') assert.equal(secret.secret, 'under the cabbage tree', 'secret is revealed') assert.equal(secret.label, 'location of the treasure', 'label is revealed') From 0855974f8799b2af96a30410237c6fcae80c4969 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 25 Jan 2019 10:09:49 +0100 Subject: [PATCH 13/60] pass server to v1 request test --- test/recover/async/mend/request/v1.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/recover/async/mend/request/v1.test.js b/test/recover/async/mend/request/v1.test.js index 9c16c86..434eed8 100644 --- a/test/recover/async/mend/request/v1.test.js +++ b/test/recover/async/mend/request/v1.test.js @@ -18,7 +18,7 @@ describe('recover.async.mend (v1)', context => { getFetchData(server, (err, data) => { if (err) throw err - Mend(data, (err, secret) => { + Mend(server)(data, (err, secret) => { assert.equal(err, null, 'no error') assert.equal(secret.secret, 'my treasure location', 'secret is revealed') From 3bd7f315061e9c02eb89f11dc1db9d68dee60270 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 25 Jan 2019 10:09:58 +0100 Subject: [PATCH 14/60] pass server to v2 request test --- test/recover/async/mend/request/v2.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/recover/async/mend/request/v2.test.js b/test/recover/async/mend/request/v2.test.js index 1c75458..ba55af8 100644 --- a/test/recover/async/mend/request/v2.test.js +++ b/test/recover/async/mend/request/v2.test.js @@ -18,7 +18,7 @@ describe('recover.async.mend (v2)', context => { getFetchData(server, (err, data) => { if (err) throw err - Mend(data, (err, secret) => { + Mend(server)(data, (err, secret) => { assert.equal(err, null, 'no error') assert.equal(secret.secret, 'under the cabbage tree', 'secret is revealed') assert.equal(secret.label, 'location of the treasure', 'label is revealed') From 07ad245c9f4245c9e64e3647448f31dad95d0c95 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 25 Jan 2019 10:11:12 +0100 Subject: [PATCH 15/60] include ephemeral keys generation and encryption in fetch/mend v2 test --- test/recover/async/fetch/data-request.v2.js | 31 +++++++++++++++------ 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/test/recover/async/fetch/data-request.v2.js b/test/recover/async/fetch/data-request.v2.js index 94f0de1..7d77869 100644 --- a/test/recover/async/fetch/data-request.v2.js +++ b/test/recover/async/fetch/data-request.v2.js @@ -14,7 +14,7 @@ const isReply = require('../../../../isReply') const secret = 'under the cabbage tree' const label = 'location of the treasure' -module.exports = function publishV1Data (server) { +module.exports = function publishV2Data (server) { return function (cb) { const custodians = [ server.createFeed(), // piet @@ -129,15 +129,26 @@ function publishAll (server) { pull( pull.values(requestPairs), pull.asyncMap(({ feed, request, reply }, cb) => { - server.publish(request, (err, request) => { - if (err) return cb(err) + const dbKey = JSON.stringify({ + rootId: request.root, + recp: request.recps.find(notMe) + }) + server.ephemeral.generateAndStore(dbKey, (err, ephPublicKey) => { + if (err) throw err + request.ephPublicKey = ephPublicKey + server.publish(request, (err, request) => { + if (err) return cb(err) - if (!reply) return cb(null, { request: unbox(request) }) + if (!reply) return cb(null, { request: unbox(request) }) - reply.branch = [ request.key ] // how invites point to what they're replying to - feed.publish(reply, (err, reply) => { - if (err) return cb(err) - cb(null, { request: unbox(request), reply: unbox(reply) }) + reply.branch = [ request.key ] // how invites point to what they're replying to + const contextMessage = root.key // TODO: better contextMessage + reply.body = server.ephemeral.boxMessage(reply.body, ephPublicKey, contextMessage) + console.log(reply.body) + feed.publish(reply, (err, reply) => { + if (err) return cb(err) + cb(null, { request: unbox(request), reply: unbox(reply) }) + }) }) }) }), @@ -164,4 +175,8 @@ function publishAll (server) { ) }) } + + function notMe (recp) { + return recp !== server.id + } } From fdb4f3093ed10d0df43a562f9043de40c806959d Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 25 Jan 2019 10:12:18 +0100 Subject: [PATCH 16/60] omit ephemeral key decryption from v1 shards --- recover/async/mend.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/recover/async/mend.js b/recover/async/mend.js index f902355..535b82a 100644 --- a/recover/async/mend.js +++ b/recover/async/mend.js @@ -8,7 +8,7 @@ const pull = require('pull-stream') module.exports = function mend (server) { return function (data, cb) { if (data.shardsData.length === 0) return cb(new Error('cannot find any shards')) -console.log('here') + const shareVersion = getShareVersion(data) if (!shareVersion) return cb(null, new Error('unknown share version, unable to mend shards')) @@ -69,14 +69,17 @@ console.log('here') return acc }, [])), pull.asyncMap((shard, cb) => { - const dbKey = JSON.stringify({ rootId, recp: shard.feedId }) - - const contextMessage = rootId - server.ephemeral.unBoxMessage(dbKey, shard.share, contextMessage, (err, rawShard) => { - if (err) cb(err) - cb(null, rawShard) - }) - }, 10), + if (shareVersion === '1.0.0') { + cb(null, shard.share) + } else { + const dbKey = JSON.stringify({ rootId, recp: shard.feedId }) + + const contextMessage = rootId + server.ephemeral.unBoxMessage(dbKey, shard.share, contextMessage, (err, rawShard) => { + err ? cb(err) : cb(null, rawShard) + }) + } + }), pull.filter(shard => validateShard(shard, shareVersion)), pull.collect((err, shards) => { if (err) callback(err) @@ -107,5 +110,4 @@ console.log('here') case 'dark-crystal/forward': return shard } } - } From f2a8f22fae2e4230e62645fc19698f937772a19d Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 25 Jan 2019 14:40:48 +0100 Subject: [PATCH 17/60] isReply checks for boxed message --- isReply.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/isReply.js b/isReply.js index 284cd38..8353449 100644 --- a/isReply.js +++ b/isReply.js @@ -1,6 +1,7 @@ const { isReply: _isReply } = require('ssb-dark-crystal-schema') const getContent = require('ssb-msg-content') const { validateShard } = require('./lib/secrets-wrapper') +const isString = require('./lib/isString') module.exports = function isReply (msg) { const { @@ -10,11 +11,23 @@ module.exports = function isReply (msg) { const errors = [] + // TODO this is a mess if (!_isReply(msg)) errors.push(new Error('invalid reply')) - // if (!validateShard(shard, shareVersion)) errors.push(new Error('invalid shard')) + if (!isString(shard)) { + errors.push(new Error('body must contain a string')) + } else { + if (!isBoxedMessage(shard) || shareVersion === '1.0.0') { + if (!validateShard(shard, shareVersion)) errors.push(new Error('invalid shard')) + } + } if (!errors.length) return true isReply.errors = errors return false } + +// temporary - TODO use ssb-ref +function isBoxedMessage (message) { + return message.slice(-4) === '.box' +} From 84036084b42bef03033b52a3d92e4bc6e7fca06a Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 25 Jan 2019 14:45:36 +0100 Subject: [PATCH 18/60] add generateAndStore to additional v2 reply test --- test/recover/async/reply/v2.test.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/test/recover/async/reply/v2.test.js b/test/recover/async/reply/v2.test.js index 92f9ef0..d0743d6 100644 --- a/test/recover/async/reply/v2.test.js +++ b/test/recover/async/reply/v2.test.js @@ -10,7 +10,7 @@ const { share } = require('../../../../lib/secrets-wrapper/v2') describe('recover.async.reply (v2)', context => { let server, reply, katie let rootId, katiesInvite, katiesShard - let ephPublicKey, dbKey + let dbKey context.beforeEach(c => { server = Server() @@ -68,14 +68,18 @@ describe('recover.async.reply (v2)', context => { }) }) }) - // TODO: add generateAndStore to remaining tests + context('Throws error if associated shard does not exist', (assert, next) => { - katie.publish(katiesInvite, (err, inviteMsg) => { + server.ephemeral.generateAndStore(dbKey, (err, ephPublicKey) => { if (err) throw err - reply(inviteMsg.key, (err, replyMsg) => { - assert.ok(err, 'Throws error') - assert.notOk(replyMsg, 'Does not return a reply message') - next() + katiesInvite.ephPublicKey = ephPublicKey + katie.publish(katiesInvite, (err, inviteMsg) => { + if (err) throw err + reply(inviteMsg.key, (err, replyMsg) => { + assert.ok(err, 'Throws error') + assert.notOk(replyMsg, 'Does not return a reply message') + next() + }) }) }) }) From 3b91518bb1ae79adc48df68ffb69af00a45ef65f Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 25 Jan 2019 14:46:45 +0100 Subject: [PATCH 19/60] remove debug logging --- test/recover/async/request.test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/recover/async/request.test.js b/test/recover/async/request.test.js index 0d82a9a..478f408 100644 --- a/test/recover/async/request.test.js +++ b/test/recover/async/request.test.js @@ -36,7 +36,6 @@ describe('recover.async.request', context => { if (err) console.error(err) var rootId = data.root.key request(rootId, (err, msgs) => { -console.log(JSON.stringify(msgs,null,4)) assert.notOk(err, 'null errors') assert.ok(msgs, 'request messages') assert.equal(msgs.length, recps.length, 'publishes a request for each shard') From 24833a23fea921087b35c845c3ea4368bbf13e97 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 25 Jan 2019 14:48:50 +0100 Subject: [PATCH 20/60] lint --- recover/async/request.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/recover/async/request.js b/recover/async/request.js index a2937b6..6a6388a 100644 --- a/recover/async/request.js +++ b/recover/async/request.js @@ -29,7 +29,6 @@ module.exports = function (server) { pull.asyncMap((shard, cb) => { const { recps } = getContent(shard) - // TODO: not sure if we need to tell level that dbkey is an object const dbKey = JSON.stringify({ rootId, recp: recps.find(notMe) }) server.ephemeral.generateAndStore(dbKey, (err, ephPublicKey) => { if (err) cb(err) @@ -78,4 +77,3 @@ function recpsValid (recipients) { return feedIds.length === recipients.length } - From 8a127b9b29f8b6d45f610682f8ca29d6fa15a055 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 25 Jan 2019 15:06:10 +0100 Subject: [PATCH 21/60] use regex for testing .box suffix --- isReply.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/isReply.js b/isReply.js index 8353449..d25362f 100644 --- a/isReply.js +++ b/isReply.js @@ -29,5 +29,5 @@ module.exports = function isReply (msg) { // temporary - TODO use ssb-ref function isBoxedMessage (message) { - return message.slice(-4) === '.box' + return /\.box$/.test(message) } From 653e27d530ca009d2fb7fe4706a31fed8314c752 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Sun, 27 Jan 2019 17:05:25 +0100 Subject: [PATCH 22/60] method for deleting an ephemeral keypair --- recover/async/deleteKeyPair.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 recover/async/deleteKeyPair.js diff --git a/recover/async/deleteKeyPair.js b/recover/async/deleteKeyPair.js new file mode 100644 index 0000000..45b1213 --- /dev/null +++ b/recover/async/deleteKeyPair.js @@ -0,0 +1,14 @@ +const { isMsgId, isFeed } = require('ssb-ref') + +module.exports = function (server) { + return function deleteKeyPair (rootId, recipient, callback) { + if (!isMsgId(rootId)) return callback(new Error('Invalid root')) + if (!isFeed(recipient)) return callback(new Error('Invalid recipient')) + + const dbKey = JSON.stringify({ rootId, recp: recipient }) + server.ephemeral.deleteKeyPair(dbKey, (err) => { + if (err) return callback(err) + callback() + }) + } +} From d8d2c0936650fd6d586902ae4fef8ac83ba1c308 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Sun, 27 Jan 2019 17:05:45 +0100 Subject: [PATCH 23/60] test for method for deleting an ephemeral keypair --- test/recover/async/deleteKeyPair.test.js | 38 ++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 test/recover/async/deleteKeyPair.test.js diff --git a/test/recover/async/deleteKeyPair.test.js b/test/recover/async/deleteKeyPair.test.js new file mode 100644 index 0000000..d841aa4 --- /dev/null +++ b/test/recover/async/deleteKeyPair.test.js @@ -0,0 +1,38 @@ +const { describe } = require('tape-plus') +const Server = require('../../testbot') +const DeleteKeyPair = require('../../../recover/async/deleteKeyPair') + +describe('recover.async.deleteKeyPair', context => { + let server, deleteKeyPair, recp + + context.beforeEach(c => { + server = Server() + deleteKeyPair = DeleteKeyPair(server) + + recp = server.createFeed().id + }) + + context.afterEach(c => { + server.close() + }) + + context('Successfully deletes a keypair', (assert, next) => { + server.publish({ type: 'post', content: 'some message' }, (err, { key: rootId }) => { + if (err) console.log(err) + const dbKey = JSON.stringify({ rootId, recp }) + server.ephemeral.generateAndStore(dbKey, (err, ephPublicKey) => { + if (err) console.log(err) + deleteKeyPair(rootId, recp, (err) => { + assert.notOk(err, 'null errors') + const cipherText = server.ephemeral.boxMessage('something', ephPublicKey) + server.ephemeral.unBoxMessage(dbKey, cipherText, null, (err, message) => { + assert.ok(err, 'throws an error when attempting to use the key') + assert.notOk(message, 'returns no message') + next() + }) + }) + }) + }) + }) + // TODO: tests for errors on invalid rootId or recp +}) From 2e8f7acc59332ca834dbba7e9a73666e74da2d53 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Sun, 27 Jan 2019 17:11:58 +0100 Subject: [PATCH 24/60] readme --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 954028e..c34fdde 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,9 @@ This will attempt to recombine the decrypted shards included in reply messages a This also works for forwarded shards, you just need to provide the root from on of the fwds. +#### `darkCrystal.recover.async.deleteKeyPair(rootId, recipient, callback)` + +Deletes the ephemeral keypair for a particular returned shard (effectively deleting the shard). Takes the associated rootId and the feedId of the recipient of the associated request (the person returning the shard to be 'deleted'). If successful, no errors will be returned in the callback. ### Root methods From 37dab8387702a26c0e28934f62aa883b2d4256b4 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Mon, 28 Jan 2019 21:28:06 +0100 Subject: [PATCH 25/60] improve recover.pull.replies --- recover/pull/replies.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/recover/pull/replies.js b/recover/pull/replies.js index e0092d2..49b8b49 100644 --- a/recover/pull/replies.js +++ b/recover/pull/replies.js @@ -1,6 +1,6 @@ const pull = require('pull-stream') const next = require('pull-next-query') -const { isReply } = require('ssb-dark-crystal-schema') +const isReply = require('../../isReply') module.exports = function (server) { return function replies (rootId, opts = {}) { @@ -16,7 +16,6 @@ module.exports = function (server) { }] const _opts = Object.assign({ limit: 100 }, opts, { query }) - return pull( next(server.query.read, _opts), pull.filter(isReply) From 92ba4419f0e766fb60824f6487323f304db3aa67 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Mon, 28 Jan 2019 21:29:44 +0100 Subject: [PATCH 26/60] method to delete all ephemeral keypairs associated with a given rootid --- recover/async/deleteKeyPairs.js | 23 +++++++ test/recover/async/deleteKeyPairs.test.js | 73 +++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 recover/async/deleteKeyPairs.js create mode 100644 test/recover/async/deleteKeyPairs.test.js diff --git a/recover/async/deleteKeyPairs.js b/recover/async/deleteKeyPairs.js new file mode 100644 index 0000000..69c8590 --- /dev/null +++ b/recover/async/deleteKeyPairs.js @@ -0,0 +1,23 @@ +const { isMsgId } = require('ssb-ref') +const GetReplies = require('../pull/replies') +const pull = require('pull-stream') +const DeleteKeyPair = require('./deleteKeyPair') + +module.exports = function (server) { + const deleteKeyPair = DeleteKeyPair(server) + const getReplies = GetReplies(server) + return function deleteKeyPairs (rootId, callback) { + if (!isMsgId(rootId)) return callback(new Error('Invalid root')) + pull( + getReplies(rootId, { live: false }), + // pull.filter body contains boxed msg? + pull.asyncMap((reply, cb) => { + deleteKeyPair(rootId, reply.value.author, (err) => { + if (err) cb(err) + cb(null, reply) + }) + }), + pull.collect(callback) + ) + } +} diff --git a/test/recover/async/deleteKeyPairs.test.js b/test/recover/async/deleteKeyPairs.test.js new file mode 100644 index 0000000..fee88b3 --- /dev/null +++ b/test/recover/async/deleteKeyPairs.test.js @@ -0,0 +1,73 @@ +const { describe } = require('tape-plus') +const Server = require('../../testbot') +const DeleteKeyPairs = require('../../../recover/async/deleteKeyPairs') +const pull = require('pull-stream') + +describe('recover.async.deleteKeyPair', context => { + let server, deleteKeyPairs, custodians, replies + let rootId, custodianKeys + + context.beforeEach(c => { + server = Server() + deleteKeyPairs = DeleteKeyPairs(server) + + custodians = [ + server.createFeed(), + server.createFeed(), + server.createFeed() + ] + + custodianKeys = [] + replies = {} + rootId = '%H3Uv1nZyVV1h1YmbNJT5fmU469gO5p6YWmXGnRPbSww=.sha256' + + custodians.forEach(({ id }) => { + replies[id] = { + type: 'invite-reply', + root: rootId, + branch: '%7jarG2MhBcJ6WOcSpPARoraJ2oOezcEs+3zQG7ShVR0=.sha256', + accept: true, + version: '1', + shareVersion: '2.0.0', + body: server.ephemeral.boxMessage('something', 'qDPnOmAo6LP0Tpx/uBHLZBq0UPcAUDcuK74tyoahEQE=.curve25519'), + recps: [ server.id, id ] + } + }) + }) + + context.afterEach(c => { + server.close() + }) + + context('Successfully all keypairs associated with a given rootId', (assert, next) => { + pull( + pull.values(custodians), + pull.asyncMap((custodian, cb) => { + custodian.publish(replies[custodian.id], (err, reply) => { + if (err) cb(err) + const dbKey = JSON.stringify({ rootId, recp: custodian.id }) + server.ephemeral.generateAndStore(dbKey, (err, ephPublicKey) => { + if (err) cb(err) + custodianKeys.push({ dbKey, ephPublicKey }) + cb(null, custodian) + }) + }) + }), + pull.collect((err, output) => { + if (err) throw err + deleteKeyPairs(rootId, (err) => { + assert.notOk(err, 'null errors') + custodianKeys.forEach(custodianKey => { + const cipherText = server.ephemeral.boxMessage('something', custodianKey.ephPublicKey) + server.ephemeral.unBoxMessage(custodianKey.dbKey, cipherText, null, (err, message) => { + assert.ok(err, 'throws an error when attempting to use a key') + assert.notOk(message, 'returns no message') + }) + }) + next() + }) + }) + ) + }) + // TODO: tests for errors on invalid rootId or recp +}) From f1c7dd413a6ed4fee0769ad29161bfb203e2fa0c Mon Sep 17 00:00:00 2001 From: ameba23 Date: Thu, 31 Jan 2019 13:19:23 +0100 Subject: [PATCH 27/60] include deleteKeyPairs method in readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c34fdde..4c34742 100644 --- a/README.md +++ b/README.md @@ -46,9 +46,9 @@ This will attempt to recombine the decrypted shards included in reply messages a This also works for forwarded shards, you just need to provide the root from on of the fwds. -#### `darkCrystal.recover.async.deleteKeyPair(rootId, recipient, callback)` +#### `darkCrystal.recover.async.deleteKeyPairs(rootId, callback)` -Deletes the ephemeral keypair for a particular returned shard (effectively deleting the shard). Takes the associated rootId and the feedId of the recipient of the associated request (the person returning the shard to be 'deleted'). If successful, no errors will be returned in the callback. +Deletes the ephemeral keypairs for all returned shards associated with the given rootId (effectively deleting the shards). If successful, no errors will be returned in the callback. ### Root methods From f052e61a66616d05e6caccf8857de6c086dbfb30 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Thu, 31 Jan 2019 13:19:37 +0100 Subject: [PATCH 28/60] expose deleteKeyPairs method --- methods.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/methods.js b/methods.js index 13c180e..b191c49 100644 --- a/methods.js +++ b/methods.js @@ -7,7 +7,8 @@ module.exports = { async: { recombine: require('./recover/async/recombine'), reply: require('./recover/async/reply'), - request: require('./recover/async/request') + request: require('./recover/async/request'), + deleteKeyPairs: require('./recover/async/deleteKeyPairs') }, pull: { requests: require('./recover/pull/requests'), From 6c75134145e8d80d0c0a80314fefca2bbe44431a Mon Sep 17 00:00:00 2001 From: ameba23 Date: Thu, 31 Jan 2019 13:35:24 +0100 Subject: [PATCH 29/60] improve contextMessage in recover.async.mend --- recover/async/mend.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recover/async/mend.js b/recover/async/mend.js index 535b82a..82e5d56 100644 --- a/recover/async/mend.js +++ b/recover/async/mend.js @@ -74,7 +74,7 @@ module.exports = function mend (server) { } else { const dbKey = JSON.stringify({ rootId, recp: shard.feedId }) - const contextMessage = rootId + const contextMessage = dbKey server.ephemeral.unBoxMessage(dbKey, shard.share, contextMessage, (err, rawShard) => { err ? cb(err) : cb(null, rawShard) }) From 17334fee09bc0c45c11ba035bb0898dc1843f022 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Thu, 31 Jan 2019 13:35:39 +0100 Subject: [PATCH 30/60] improve contextMessage in recover.async.reply --- recover/async/reply.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/recover/async/reply.js b/recover/async/reply.js index 7967ab8..7336695 100644 --- a/recover/async/reply.js +++ b/recover/async/reply.js @@ -57,9 +57,7 @@ module.exports = function (server) { let shardToSend if (ephPublicKey) { - // TODO: validate ephPublicKey looks as it should - // TODO: contextMessage could also include server.id? - const contextMessage = rootId + const contextMessage = JSON.stringify({ rootId, recp: server.id }) shardToSend = server.ephemeral.boxMessage(theDecryptedShard, ephPublicKey, contextMessage) } else { shardToSend = theDecryptedShard From a6b2d2142ea75f6505c398c085289886177af907 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Thu, 31 Jan 2019 13:35:56 +0100 Subject: [PATCH 31/60] update contextMessage in tests --- test/recover/async/fetch/data-request.v2.js | 2 +- test/recover/async/recombine/request/v2.test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/recover/async/fetch/data-request.v2.js b/test/recover/async/fetch/data-request.v2.js index 7d77869..4e5a26a 100644 --- a/test/recover/async/fetch/data-request.v2.js +++ b/test/recover/async/fetch/data-request.v2.js @@ -142,7 +142,7 @@ function publishAll (server) { if (!reply) return cb(null, { request: unbox(request) }) reply.branch = [ request.key ] // how invites point to what they're replying to - const contextMessage = root.key // TODO: better contextMessage + const contextMessage = dbKey reply.body = server.ephemeral.boxMessage(reply.body, ephPublicKey, contextMessage) console.log(reply.body) feed.publish(reply, (err, reply) => { diff --git a/test/recover/async/recombine/request/v2.test.js b/test/recover/async/recombine/request/v2.test.js index feb2e28..7b74459 100644 --- a/test/recover/async/recombine/request/v2.test.js +++ b/test/recover/async/recombine/request/v2.test.js @@ -224,7 +224,7 @@ describe('recover.async.recombine (request v2 shards)', context => { .shard const unboxedShard = unbox(shard, findCustodian(custodianId).keys) - const contextMessage = rootId // TODO: better contextMessage + const contextMessage = JSON.stringify({ rootId, recp: custodianId }) const boxedShard = server.ephemeral.boxMessage(unboxedShard, content.ephPublicKey, contextMessage) collection[custodianId] = { type: 'invite-reply', From f9c6ff0c666ed0d95b55bb5dd59697b4ece1624e Mon Sep 17 00:00:00 2001 From: ameba23 Date: Sat, 2 Feb 2019 14:37:52 +0100 Subject: [PATCH 32/60] remove additional logging --- test/recover/async/fetch/data-request.v2.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/recover/async/fetch/data-request.v2.js b/test/recover/async/fetch/data-request.v2.js index 4e5a26a..df62509 100644 --- a/test/recover/async/fetch/data-request.v2.js +++ b/test/recover/async/fetch/data-request.v2.js @@ -144,7 +144,6 @@ function publishAll (server) { reply.branch = [ request.key ] // how invites point to what they're replying to const contextMessage = dbKey reply.body = server.ephemeral.boxMessage(reply.body, ephPublicKey, contextMessage) - console.log(reply.body) feed.publish(reply, (err, reply) => { if (err) return cb(err) cb(null, { request: unbox(request), reply: unbox(reply) }) From b3961b95bdff692e81e50700cefc96ab8128089a Mon Sep 17 00:00:00 2001 From: ameba23 Date: Sat, 2 Feb 2019 14:44:33 +0100 Subject: [PATCH 33/60] handle non-boxed shards --- recover/async/mend.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/recover/async/mend.js b/recover/async/mend.js index 82e5d56..eae9c45 100644 --- a/recover/async/mend.js +++ b/recover/async/mend.js @@ -69,7 +69,7 @@ module.exports = function mend (server) { return acc }, [])), pull.asyncMap((shard, cb) => { - if (shareVersion === '1.0.0') { + if (shareVersion === '1.0.0' || !isBoxedMessage(shard.share)) { cb(null, shard.share) } else { const dbKey = JSON.stringify({ rootId, recp: shard.feedId }) @@ -111,3 +111,7 @@ module.exports = function mend (server) { } } } + +function isBoxedMessage (message) { + return /\.box$/.test(message) +} From fae55cb92c54660dae75dad5ace4c6c548b79304 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Tue, 5 Feb 2019 22:31:55 +0100 Subject: [PATCH 34/60] remove fn from mend --- recover/async/mend.js | 1 + 1 file changed, 1 insertion(+) diff --git a/recover/async/mend.js b/recover/async/mend.js index 8fde305..abe5ae4 100644 --- a/recover/async/mend.js +++ b/recover/async/mend.js @@ -100,3 +100,4 @@ function getShare (msg) { case 'dark-crystal/forward': return shard } } + From 3bb58da562618fc79a106d9d799341231722fcef Mon Sep 17 00:00:00 2001 From: ameba23 Date: Tue, 5 Feb 2019 22:41:15 +0100 Subject: [PATCH 35/60] comments, additional test for deleteKeyPairs --- isReply.js | 3 +-- recover/async/mend.js | 2 +- test/recover/async/deleteKeyPair.test.js | 1 - test/recover/async/deleteKeyPairs.test.js | 7 ++++++- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/isReply.js b/isReply.js index d25362f..e0c0be6 100644 --- a/isReply.js +++ b/isReply.js @@ -11,7 +11,6 @@ module.exports = function isReply (msg) { const errors = [] - // TODO this is a mess if (!_isReply(msg)) errors.push(new Error('invalid reply')) if (!isString(shard)) { errors.push(new Error('body must contain a string')) @@ -27,7 +26,7 @@ module.exports = function isReply (msg) { return false } -// temporary - TODO use ssb-ref +// TODO: should we use isCanonicalBase64 ? function isBoxedMessage (message) { return /\.box$/.test(message) } diff --git a/recover/async/mend.js b/recover/async/mend.js index eae9c45..9e359cd 100644 --- a/recover/async/mend.js +++ b/recover/async/mend.js @@ -111,7 +111,7 @@ module.exports = function mend (server) { } } } - +// TODO: should we use isCanonicalBase64 ? function isBoxedMessage (message) { return /\.box$/.test(message) } diff --git a/test/recover/async/deleteKeyPair.test.js b/test/recover/async/deleteKeyPair.test.js index d841aa4..3492eb6 100644 --- a/test/recover/async/deleteKeyPair.test.js +++ b/test/recover/async/deleteKeyPair.test.js @@ -34,5 +34,4 @@ describe('recover.async.deleteKeyPair', context => { }) }) }) - // TODO: tests for errors on invalid rootId or recp }) diff --git a/test/recover/async/deleteKeyPairs.test.js b/test/recover/async/deleteKeyPairs.test.js index fee88b3..6b456b9 100644 --- a/test/recover/async/deleteKeyPairs.test.js +++ b/test/recover/async/deleteKeyPairs.test.js @@ -69,5 +69,10 @@ describe('recover.async.deleteKeyPair', context => { }) ) }) - // TODO: tests for errors on invalid rootId or recp + context('Throws an error if given an invalid rootId', (assert, next) => { + deleteKeyPairs('foo', (err) => { + assert.ok(err, 'throws an error') + next() + }) + }) }) From a2cf5eebfbeea6b54ebe451bbd8d651dc984ec5a Mon Sep 17 00:00:00 2001 From: ameba23 Date: Wed, 6 Feb 2019 10:21:50 +0100 Subject: [PATCH 36/60] update testbot for renamed module --- test/testbot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testbot.js b/test/testbot.js index e04bead..2afb172 100644 --- a/test/testbot.js +++ b/test/testbot.js @@ -3,7 +3,7 @@ module.exports = function Testbot (opts) { .use(require('ssb-private')) .use(require('ssb-query')) .use(require('ssb-backlinks')) - .use(require('ephemeral-keys')) + .use(require('ssb-ephemeral-keys')) .call(opts) return server From ee1e357d73882024d7bae61f26ca4ad65f628046 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Wed, 6 Feb 2019 10:24:16 +0100 Subject: [PATCH 37/60] update PLUGIN_DEPS for ephemeral keys plugin --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 507ce63..81cd3ce 100644 --- a/index.js +++ b/index.js @@ -1,7 +1,7 @@ const inject = require('scuttle-inject') const raw = require('./methods') -const PLUGIN_DEPS = ['private', 'query', 'backlinks'] +const PLUGIN_DEPS = ['private', 'query', 'backlinks', 'ephemeral'] const niceMappings = {} From a326b31e05e4bd2e8dc17f51f3809bb1826335c0 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Wed, 6 Feb 2019 12:49:11 +0100 Subject: [PATCH 38/60] add ssb-ephemeral-keys as a dev dependency --- package-lock.json | 118 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 1 + 2 files changed, 118 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index b5d63bd..759e0ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4047,7 +4047,7 @@ "integrity": "sha1-s8pAUwbggvnUUoKIkzutsrZWNls=", "dev": true, "requires": { - "pull-utf8-decoder": "1.0.2" + "pull-utf8-decoder": "^1.0.2" } }, "rimraf": { @@ -6902,6 +6902,122 @@ "ssb-ref": "^2.9.1" } }, + "ssb-ephemeral-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ssb-ephemeral-keys/-/ssb-ephemeral-keys-1.0.0.tgz", + "integrity": "sha512-hkDPtE4GUNCRLf4NX/8USQ/wwa1ZyYZBQcOM0CRio0AURaT08CVBCJYz4mARwfI9h7bZAzigdrOfPfvfxX3lCw==", + "dev": true, + "requires": { + "level": "^4.0.0", + "sodium-native": "^2.2.3" + }, + "dependencies": { + "abstract-leveldown": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz", + "integrity": "sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==", + "dev": true, + "requires": { + "xtend": "~4.0.0" + } + }, + "deferred-leveldown": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz", + "integrity": "sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==", + "dev": true, + "requires": { + "abstract-leveldown": "~5.0.0", + "inherits": "^2.0.3" + } + }, + "encoding-down": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-5.0.4.tgz", + "integrity": "sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw==", + "dev": true, + "requires": { + "abstract-leveldown": "^5.0.0", + "inherits": "^2.0.3", + "level-codec": "^9.0.0", + "level-errors": "^2.0.0", + "xtend": "^4.0.1" + } + }, + "level": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-4.0.0.tgz", + "integrity": "sha512-4epzCOlEcJ529NOdlAYiuiakS/kZTDdiKSBNJmE1B8bsmA+zEVwcpxyH86qJSQTpOu7SODrlaD9WgPRHLkGutA==", + "dev": true, + "requires": { + "level-packager": "^3.0.0", + "leveldown": "^4.0.0", + "opencollective-postinstall": "^2.0.0" + } + }, + "level-codec": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.0.tgz", + "integrity": "sha512-OIpVvjCcZNP5SdhcNupnsI1zo5Y9Vpm+k/F1gfG5kXrtctlrwanisakweJtE0uA0OpLukRfOQae+Fg0M5Debhg==", + "dev": true + }, + "level-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.0.tgz", + "integrity": "sha512-AmY4HCp9h3OiU19uG+3YWkdELgy05OTP/r23aNHaQKWv8DO787yZgsEuGVkoph40uwN+YdUKnANlrxSsoOaaxg==", + "dev": true, + "requires": { + "errno": "~0.1.1" + } + }, + "level-iterator-stream": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz", + "integrity": "sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "xtend": "^4.0.0" + } + }, + "level-packager": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-3.1.0.tgz", + "integrity": "sha512-UxVEfK5WH0u0InR3WxTCSAroiorAGKzXWZT6i+nBjambmvINuXFUsFx2Ai3UIjUUtnyWhluv42jMlzUZCsAk9A==", + "dev": true, + "requires": { + "encoding-down": "~5.0.0", + "levelup": "^3.0.0" + } + }, + "leveldown": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-4.0.1.tgz", + "integrity": "sha512-ZlBKVSsglPIPJnz4ggB8o2R0bxDxbsMzuQohbfgoFMVApyTE118DK5LNRG0cRju6rt3OkGxe0V6UYACGlq/byg==", + "dev": true, + "requires": { + "abstract-leveldown": "~5.0.0", + "bindings": "~1.3.0", + "fast-future": "~1.0.2", + "nan": "~2.10.0", + "prebuild-install": "^4.0.0" + } + }, + "levelup": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-3.1.1.tgz", + "integrity": "sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==", + "dev": true, + "requires": { + "deferred-leveldown": "~4.0.0", + "level-errors": "~2.0.0", + "level-iterator-stream": "~3.0.0", + "xtend": "~4.0.0" + } + } + } + }, "ssb-friends": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ssb-friends/-/ssb-friends-3.1.10.tgz", diff --git a/package.json b/package.json index b6a1904..9cf8edb 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "devDependencies": { "scuttle-testbot": "^1.1.6", "ssb-backlinks": "^0.7.3", + "ssb-ephemeral-keys": "^1.0.0", "ssb-private": "^0.2.3", "ssb-query": "^2.3.0", "standard": "^12.0.1", From 4c9334113cdbfc1faff19bf81dc33d0f4e3b4dd6 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 8 Feb 2019 16:58:53 +0100 Subject: [PATCH 39/60] deleteKeyPair returns true if successful --- recover/async/deleteKeyPair.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recover/async/deleteKeyPair.js b/recover/async/deleteKeyPair.js index 45b1213..73d2581 100644 --- a/recover/async/deleteKeyPair.js +++ b/recover/async/deleteKeyPair.js @@ -8,7 +8,7 @@ module.exports = function (server) { const dbKey = JSON.stringify({ rootId, recp: recipient }) server.ephemeral.deleteKeyPair(dbKey, (err) => { if (err) return callback(err) - callback() + callback(null, true) }) } } From dae66242bc6405bcff69eaecaac06a4b8e07eb58 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Thu, 14 Mar 2019 20:08:27 +0100 Subject: [PATCH 40/60] tidy comments --- recover/async/mend.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/recover/async/mend.js b/recover/async/mend.js index 9e359cd..4b05da7 100644 --- a/recover/async/mend.js +++ b/recover/async/mend.js @@ -12,7 +12,6 @@ module.exports = function mend (server) { const shareVersion = getShareVersion(data) if (!shareVersion) return cb(null, new Error('unknown share version, unable to mend shards')) - // const shards = getShards(data, shareVersion) getShards(data, shareVersion, (err, shards) => { if (err) return cb(err) if (!shards.length) return cb(new Error('no valid shards provided to mend')) @@ -72,10 +71,8 @@ module.exports = function mend (server) { if (shareVersion === '1.0.0' || !isBoxedMessage(shard.share)) { cb(null, shard.share) } else { - const dbKey = JSON.stringify({ rootId, recp: shard.feedId }) - - const contextMessage = dbKey - server.ephemeral.unBoxMessage(dbKey, shard.share, contextMessage, (err, rawShard) => { + const dbKey = { rootId, recp: shard.feedId } + server.ephemeral.unBoxMessage(dbKey, shard.share, dbKey, (err, rawShard) => { err ? cb(err) : cb(null, rawShard) }) } From 1f22c814dd985e8754690c4867f2438bfb30fa65 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 15 Mar 2019 15:14:37 +0100 Subject: [PATCH 41/60] change to using async boxmessage --- recover/async/deleteKeyPair.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/recover/async/deleteKeyPair.js b/recover/async/deleteKeyPair.js index 73d2581..5599b7a 100644 --- a/recover/async/deleteKeyPair.js +++ b/recover/async/deleteKeyPair.js @@ -5,8 +5,7 @@ module.exports = function (server) { if (!isMsgId(rootId)) return callback(new Error('Invalid root')) if (!isFeed(recipient)) return callback(new Error('Invalid recipient')) - const dbKey = JSON.stringify({ rootId, recp: recipient }) - server.ephemeral.deleteKeyPair(dbKey, (err) => { + server.ephemeral.deleteKeyPair({ rootId, recp: recipient }, (err) => { if (err) return callback(err) callback(null, true) }) From ba838dd079c399a573f17cfbe41af1806033f713 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 15 Mar 2019 15:15:20 +0100 Subject: [PATCH 42/60] remove stringify from dbkeys as it is done in the plugin --- recover/async/request.js | 3 +-- test/recover/async/deleteKeyPair.test.js | 5 ++--- test/recover/async/deleteKeyPairs.test.js | 2 +- test/recover/async/fetch/data-request.v2.js | 5 +---- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/recover/async/request.js b/recover/async/request.js index 6a6388a..c27ccf3 100644 --- a/recover/async/request.js +++ b/recover/async/request.js @@ -29,8 +29,7 @@ module.exports = function (server) { pull.asyncMap((shard, cb) => { const { recps } = getContent(shard) - const dbKey = JSON.stringify({ rootId, recp: recps.find(notMe) }) - server.ephemeral.generateAndStore(dbKey, (err, ephPublicKey) => { + server.ephemeral.generateAndStore({ rootId, recp: recps.find(notMe) }, (err, ephPublicKey) => { if (err) cb(err) cb(null, { type: 'invite', // is over-written by invites.async.private.publish diff --git a/test/recover/async/deleteKeyPair.test.js b/test/recover/async/deleteKeyPair.test.js index 3492eb6..56960ff 100644 --- a/test/recover/async/deleteKeyPair.test.js +++ b/test/recover/async/deleteKeyPair.test.js @@ -19,13 +19,12 @@ describe('recover.async.deleteKeyPair', context => { context('Successfully deletes a keypair', (assert, next) => { server.publish({ type: 'post', content: 'some message' }, (err, { key: rootId }) => { if (err) console.log(err) - const dbKey = JSON.stringify({ rootId, recp }) - server.ephemeral.generateAndStore(dbKey, (err, ephPublicKey) => { + server.ephemeral.generateAndStore({ rootId, recp }, (err, ephPublicKey) => { if (err) console.log(err) deleteKeyPair(rootId, recp, (err) => { assert.notOk(err, 'null errors') const cipherText = server.ephemeral.boxMessage('something', ephPublicKey) - server.ephemeral.unBoxMessage(dbKey, cipherText, null, (err, message) => { + server.ephemeral.unBoxMessage({ rootId, recp }, cipherText, null, (err, message) => { assert.ok(err, 'throws an error when attempting to use the key') assert.notOk(message, 'returns no message') next() diff --git a/test/recover/async/deleteKeyPairs.test.js b/test/recover/async/deleteKeyPairs.test.js index 6b456b9..99c1eee 100644 --- a/test/recover/async/deleteKeyPairs.test.js +++ b/test/recover/async/deleteKeyPairs.test.js @@ -45,7 +45,7 @@ describe('recover.async.deleteKeyPair', context => { pull.asyncMap((custodian, cb) => { custodian.publish(replies[custodian.id], (err, reply) => { if (err) cb(err) - const dbKey = JSON.stringify({ rootId, recp: custodian.id }) + const dbKey = { rootId, recp: custodian.id } server.ephemeral.generateAndStore(dbKey, (err, ephPublicKey) => { if (err) cb(err) custodianKeys.push({ dbKey, ephPublicKey }) diff --git a/test/recover/async/fetch/data-request.v2.js b/test/recover/async/fetch/data-request.v2.js index df62509..e80f2a7 100644 --- a/test/recover/async/fetch/data-request.v2.js +++ b/test/recover/async/fetch/data-request.v2.js @@ -129,10 +129,7 @@ function publishAll (server) { pull( pull.values(requestPairs), pull.asyncMap(({ feed, request, reply }, cb) => { - const dbKey = JSON.stringify({ - rootId: request.root, - recp: request.recps.find(notMe) - }) + const dbKey = { rootId: request.root, recp: request.recps.find(notMe) } server.ephemeral.generateAndStore(dbKey, (err, ephPublicKey) => { if (err) throw err request.ephPublicKey = ephPublicKey From 26ba6bde9527be5e2693a30f91b46ba380ee8ffd Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 15 Mar 2019 15:18:03 +0100 Subject: [PATCH 43/60] rename isBoxedMessage --- isReply.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/isReply.js b/isReply.js index e0c0be6..d1aaeb1 100644 --- a/isReply.js +++ b/isReply.js @@ -15,7 +15,7 @@ module.exports = function isReply (msg) { if (!isString(shard)) { errors.push(new Error('body must contain a string')) } else { - if (!isBoxedMessage(shard) || shareVersion === '1.0.0') { + if (!isBoxedShare(shard) || shareVersion === '1.0.0') { if (!validateShard(shard, shareVersion)) errors.push(new Error('invalid shard')) } } @@ -27,6 +27,6 @@ module.exports = function isReply (msg) { } // TODO: should we use isCanonicalBase64 ? -function isBoxedMessage (message) { +function isBoxedShare (message) { return /\.box$/.test(message) } From 86d0b219254a5d2951d5d85c374f73c129808483 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 15 Mar 2019 15:22:47 +0100 Subject: [PATCH 44/60] rename deleteEphemeralKeypairs --- recover/async/{deleteKeyPair.js => deleteEphemeralKeyPair.js} | 0 recover/async/{deleteKeyPairs.js => deleteEphemeralKeyPairs.js} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename recover/async/{deleteKeyPair.js => deleteEphemeralKeyPair.js} (100%) rename recover/async/{deleteKeyPairs.js => deleteEphemeralKeyPairs.js} (100%) diff --git a/recover/async/deleteKeyPair.js b/recover/async/deleteEphemeralKeyPair.js similarity index 100% rename from recover/async/deleteKeyPair.js rename to recover/async/deleteEphemeralKeyPair.js diff --git a/recover/async/deleteKeyPairs.js b/recover/async/deleteEphemeralKeyPairs.js similarity index 100% rename from recover/async/deleteKeyPairs.js rename to recover/async/deleteEphemeralKeyPairs.js From e3ab3ab18add5cc6a101c7f4b1e5a1941116f20e Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 15 Mar 2019 15:23:55 +0100 Subject: [PATCH 45/60] rename variable in test --- test/recover/async/recombine/request/v2.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/recover/async/recombine/request/v2.test.js b/test/recover/async/recombine/request/v2.test.js index 7b74459..0703843 100644 --- a/test/recover/async/recombine/request/v2.test.js +++ b/test/recover/async/recombine/request/v2.test.js @@ -223,9 +223,9 @@ describe('recover.async.recombine (request v2 shards)', context => { .find(shard => shard.recps.find(recp => recp === custodianId)) .shard - const unboxedShard = unbox(shard, findCustodian(custodianId).keys) + const unboxedShare = unbox(shard, findCustodian(custodianId).keys) const contextMessage = JSON.stringify({ rootId, recp: custodianId }) - const boxedShard = server.ephemeral.boxMessage(unboxedShard, content.ephPublicKey, contextMessage) + const boxedShare = server.ephemeral.boxMessage(unboxedShare, content.ephPublicKey, contextMessage) collection[custodianId] = { type: 'invite-reply', root: rootId, @@ -233,7 +233,7 @@ describe('recover.async.recombine (request v2 shards)', context => { accept: true, version: '1', shareVersion: '2.0.0', - body: boxedShard, + body: boxedShare, recps: content.recps } From 98d17edc322a45831e492bd80175667d0c30eebf Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 15 Mar 2019 15:37:17 +0100 Subject: [PATCH 46/60] rename tests, fix test for async boxMessage --- ...test.js => deleteEphemeralKeyPair.test.js} | 20 ++++++++------- ...est.js => deleteEphemeralKeyPairs.test.js} | 25 +++++++++++-------- 2 files changed, 26 insertions(+), 19 deletions(-) rename test/recover/async/{deleteKeyPair.test.js => deleteEphemeralKeyPair.test.js} (52%) rename test/recover/async/{deleteKeyPairs.test.js => deleteEphemeralKeyPairs.test.js} (69%) diff --git a/test/recover/async/deleteKeyPair.test.js b/test/recover/async/deleteEphemeralKeyPair.test.js similarity index 52% rename from test/recover/async/deleteKeyPair.test.js rename to test/recover/async/deleteEphemeralKeyPair.test.js index 56960ff..b9c8735 100644 --- a/test/recover/async/deleteKeyPair.test.js +++ b/test/recover/async/deleteEphemeralKeyPair.test.js @@ -1,6 +1,6 @@ const { describe } = require('tape-plus') const Server = require('../../testbot') -const DeleteKeyPair = require('../../../recover/async/deleteKeyPair') +const DeleteKeyPair = require('../../../recover/async/deleteEphemeralKeyPair') describe('recover.async.deleteKeyPair', context => { let server, deleteKeyPair, recp @@ -16,18 +16,20 @@ describe('recover.async.deleteKeyPair', context => { server.close() }) - context('Successfully deletes a keypair', (assert, next) => { + context('Successfully deletes an ephemeral keypair', (assert, next) => { server.publish({ type: 'post', content: 'some message' }, (err, { key: rootId }) => { - if (err) console.log(err) + if (err) throw err server.ephemeral.generateAndStore({ rootId, recp }, (err, ephPublicKey) => { - if (err) console.log(err) + if (err) throw err deleteKeyPair(rootId, recp, (err) => { assert.notOk(err, 'null errors') - const cipherText = server.ephemeral.boxMessage('something', ephPublicKey) - server.ephemeral.unBoxMessage({ rootId, recp }, cipherText, null, (err, message) => { - assert.ok(err, 'throws an error when attempting to use the key') - assert.notOk(message, 'returns no message') - next() + server.ephemeral.boxMessage('something', ephPublicKey, (err, cipherText) => { + if (err) throw err + server.ephemeral.unBoxMessage({ rootId, recp }, cipherText, null, (err, message) => { + assert.ok(err, 'throws an error when attempting to use the key') + assert.notOk(message, 'returns no message') + next() + }) }) }) }) diff --git a/test/recover/async/deleteKeyPairs.test.js b/test/recover/async/deleteEphemeralKeyPairs.test.js similarity index 69% rename from test/recover/async/deleteKeyPairs.test.js rename to test/recover/async/deleteEphemeralKeyPairs.test.js index 99c1eee..ff4e46d 100644 --- a/test/recover/async/deleteKeyPairs.test.js +++ b/test/recover/async/deleteEphemeralKeyPairs.test.js @@ -1,11 +1,11 @@ const { describe } = require('tape-plus') const Server = require('../../testbot') -const DeleteKeyPairs = require('../../../recover/async/deleteKeyPairs') +const DeleteKeyPairs = require('../../../recover/async/deleteEphemeralKeyPairs') const pull = require('pull-stream') describe('recover.async.deleteKeyPair', context => { let server, deleteKeyPairs, custodians, replies - let rootId, custodianKeys + let rootId, custodianKeys, ephPubKey context.beforeEach(c => { server = Server() @@ -21,6 +21,8 @@ describe('recover.async.deleteKeyPair', context => { replies = {} rootId = '%H3Uv1nZyVV1h1YmbNJT5fmU469gO5p6YWmXGnRPbSww=.sha256' + ephPubKey = 'qDPnOmAo6LP0Tpx/uBHLZBq0UPcAUDcuK74tyoahEQE=.curve25519' + custodians.forEach(({ id }) => { replies[id] = { type: 'invite-reply', @@ -29,7 +31,6 @@ describe('recover.async.deleteKeyPair', context => { accept: true, version: '1', shareVersion: '2.0.0', - body: server.ephemeral.boxMessage('something', 'qDPnOmAo6LP0Tpx/uBHLZBq0UPcAUDcuK74tyoahEQE=.curve25519'), recps: [ server.id, id ] } }) @@ -39,17 +40,21 @@ describe('recover.async.deleteKeyPair', context => { server.close() }) - context('Successfully all keypairs associated with a given rootId', (assert, next) => { + context('Successfully delete all ephemeral keypairs associated with a given rootId', (assert, next) => { pull( pull.values(custodians), pull.asyncMap((custodian, cb) => { - custodian.publish(replies[custodian.id], (err, reply) => { - if (err) cb(err) - const dbKey = { rootId, recp: custodian.id } - server.ephemeral.generateAndStore(dbKey, (err, ephPublicKey) => { + server.ephemeral.boxMessage('something', ephPubKey, (err, cipherText) => { + if (err) console.error(err) + replies[custodian.id].body = cipherText + custodian.publish(replies[custodian.id], (err, reply) => { if (err) cb(err) - custodianKeys.push({ dbKey, ephPublicKey }) - cb(null, custodian) + const dbKey = { rootId, recp: custodian.id } + server.ephemeral.generateAndStore(dbKey, (err, ephPublicKey) => { + if (err) cb(err) + custodianKeys.push({ dbKey, ephPublicKey }) + cb(null, custodian) + }) }) }) }), From 4af79ed52d887d7f86f26f0b9176cf9e7d39a5f2 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 15 Mar 2019 15:39:43 +0100 Subject: [PATCH 47/60] rename deleteEphemeralKeypairs --- methods.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/methods.js b/methods.js index b191c49..8c97787 100644 --- a/methods.js +++ b/methods.js @@ -8,7 +8,7 @@ module.exports = { recombine: require('./recover/async/recombine'), reply: require('./recover/async/reply'), request: require('./recover/async/request'), - deleteKeyPairs: require('./recover/async/deleteKeyPairs') + deleteEphemeralKeyPairs: require('./recover/async/deleteEphemeralKeyPairs') }, pull: { requests: require('./recover/pull/requests'), From f702f77e6733028c5f691038bc4b8332500e3f16 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 15 Mar 2019 15:39:54 +0100 Subject: [PATCH 48/60] more renaming --- test/recover/async/deleteEphemeralKeyPair.test.js | 2 +- test/recover/async/deleteEphemeralKeyPairs.test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/recover/async/deleteEphemeralKeyPair.test.js b/test/recover/async/deleteEphemeralKeyPair.test.js index b9c8735..ce776c7 100644 --- a/test/recover/async/deleteEphemeralKeyPair.test.js +++ b/test/recover/async/deleteEphemeralKeyPair.test.js @@ -2,7 +2,7 @@ const { describe } = require('tape-plus') const Server = require('../../testbot') const DeleteKeyPair = require('../../../recover/async/deleteEphemeralKeyPair') -describe('recover.async.deleteKeyPair', context => { +describe('recover.async.deleteEphemeralKeyPair', context => { let server, deleteKeyPair, recp context.beforeEach(c => { diff --git a/test/recover/async/deleteEphemeralKeyPairs.test.js b/test/recover/async/deleteEphemeralKeyPairs.test.js index ff4e46d..b7ddd01 100644 --- a/test/recover/async/deleteEphemeralKeyPairs.test.js +++ b/test/recover/async/deleteEphemeralKeyPairs.test.js @@ -3,7 +3,7 @@ const Server = require('../../testbot') const DeleteKeyPairs = require('../../../recover/async/deleteEphemeralKeyPairs') const pull = require('pull-stream') -describe('recover.async.deleteKeyPair', context => { +describe('recover.async.deleteEphemeralKeyPair', context => { let server, deleteKeyPairs, custodians, replies let rootId, custodianKeys, ephPubKey From e3a68f8ba1aadc7b4c00b0ef018363eb36504ce9 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 15 Mar 2019 15:42:35 +0100 Subject: [PATCH 49/60] yet more renaming --- recover/async/deleteEphemeralKeyPair.js | 2 +- recover/async/deleteEphemeralKeyPairs.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/recover/async/deleteEphemeralKeyPair.js b/recover/async/deleteEphemeralKeyPair.js index 5599b7a..cb9ad4e 100644 --- a/recover/async/deleteEphemeralKeyPair.js +++ b/recover/async/deleteEphemeralKeyPair.js @@ -1,7 +1,7 @@ const { isMsgId, isFeed } = require('ssb-ref') module.exports = function (server) { - return function deleteKeyPair (rootId, recipient, callback) { + return function deleteEphemeralKeyPair (rootId, recipient, callback) { if (!isMsgId(rootId)) return callback(new Error('Invalid root')) if (!isFeed(recipient)) return callback(new Error('Invalid recipient')) diff --git a/recover/async/deleteEphemeralKeyPairs.js b/recover/async/deleteEphemeralKeyPairs.js index 69c8590..feb050d 100644 --- a/recover/async/deleteEphemeralKeyPairs.js +++ b/recover/async/deleteEphemeralKeyPairs.js @@ -1,18 +1,18 @@ const { isMsgId } = require('ssb-ref') const GetReplies = require('../pull/replies') const pull = require('pull-stream') -const DeleteKeyPair = require('./deleteKeyPair') +const DeleteEphemeralKeyPair = require('./deleteEphemeralKeyPair') module.exports = function (server) { - const deleteKeyPair = DeleteKeyPair(server) + const deleteEphemeralKeyPair = DeleteEphemeralKeyPair(server) const getReplies = GetReplies(server) - return function deleteKeyPairs (rootId, callback) { + return function deleteEphemeralKeyPairs (rootId, callback) { if (!isMsgId(rootId)) return callback(new Error('Invalid root')) pull( getReplies(rootId, { live: false }), // pull.filter body contains boxed msg? pull.asyncMap((reply, cb) => { - deleteKeyPair(rootId, reply.value.author, (err) => { + deleteEphemeralKeyPair(rootId, reply.value.author, (err) => { if (err) cb(err) cb(null, reply) }) From 634771e4315a97ab014811437fd561cd71d47e3f Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 15 Mar 2019 15:43:18 +0100 Subject: [PATCH 50/60] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4c34742..2cc9bb6 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ This will attempt to recombine the decrypted shards included in reply messages a This also works for forwarded shards, you just need to provide the root from on of the fwds. -#### `darkCrystal.recover.async.deleteKeyPairs(rootId, callback)` +#### `darkCrystal.recover.async.deleteEphemeralKeyPairs(rootId, callback)` Deletes the ephemeral keypairs for all returned shards associated with the given rootId (effectively deleting the shards). If successful, no errors will be returned in the callback. From 60ff58d3683784c08defd8ed2fbb574f98588c91 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 15 Mar 2019 16:03:24 +0100 Subject: [PATCH 51/60] fix test for async boxmessage --- .../async/deleteEphemeralKeyPairs.test.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/test/recover/async/deleteEphemeralKeyPairs.test.js b/test/recover/async/deleteEphemeralKeyPairs.test.js index b7ddd01..11d926e 100644 --- a/test/recover/async/deleteEphemeralKeyPairs.test.js +++ b/test/recover/async/deleteEphemeralKeyPairs.test.js @@ -3,9 +3,9 @@ const Server = require('../../testbot') const DeleteKeyPairs = require('../../../recover/async/deleteEphemeralKeyPairs') const pull = require('pull-stream') -describe('recover.async.deleteEphemeralKeyPair', context => { +describe('recover.async.deleteEphemeralKeyPairs', context => { let server, deleteKeyPairs, custodians, replies - let rootId, custodianKeys, ephPubKey + let rootId, custodianKeys, testPubKey context.beforeEach(c => { server = Server() @@ -21,7 +21,7 @@ describe('recover.async.deleteEphemeralKeyPair', context => { replies = {} rootId = '%H3Uv1nZyVV1h1YmbNJT5fmU469gO5p6YWmXGnRPbSww=.sha256' - ephPubKey = 'qDPnOmAo6LP0Tpx/uBHLZBq0UPcAUDcuK74tyoahEQE=.curve25519' + testPubKey = 'qDPnOmAo6LP0Tpx/uBHLZBq0UPcAUDcuK74tyoahEQE=.curve25519' custodians.forEach(({ id }) => { replies[id] = { @@ -44,7 +44,7 @@ describe('recover.async.deleteEphemeralKeyPair', context => { pull( pull.values(custodians), pull.asyncMap((custodian, cb) => { - server.ephemeral.boxMessage('something', ephPubKey, (err, cipherText) => { + server.ephemeral.boxMessage('something', testPubKey, (err, cipherText) => { if (err) console.error(err) replies[custodian.id].body = cipherText custodian.publish(replies[custodian.id], (err, reply) => { @@ -63,10 +63,12 @@ describe('recover.async.deleteEphemeralKeyPair', context => { deleteKeyPairs(rootId, (err) => { assert.notOk(err, 'null errors') custodianKeys.forEach(custodianKey => { - const cipherText = server.ephemeral.boxMessage('something', custodianKey.ephPublicKey) - server.ephemeral.unBoxMessage(custodianKey.dbKey, cipherText, null, (err, message) => { - assert.ok(err, 'throws an error when attempting to use a key') - assert.notOk(message, 'returns no message') + server.ephemeral.boxMessage('something', custodianKey.ephPublicKey, (err, cipherText) => { + if (err) console.error(err) + server.ephemeral.unBoxMessage(custodianKey.dbKey, cipherText, (err, message) => { + assert.ok(err, 'throws an error when attempting to use a key') + assert.notOk(message, 'returns no message') + }) }) }) next() From 81fbb4a587d1ab3f0f652821fe11f5f25e71955c Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 15 Mar 2019 16:09:14 +0100 Subject: [PATCH 52/60] fix fetch test for async boxmessage --- test/recover/async/fetch/data-request.v2.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/recover/async/fetch/data-request.v2.js b/test/recover/async/fetch/data-request.v2.js index e80f2a7..4edffe6 100644 --- a/test/recover/async/fetch/data-request.v2.js +++ b/test/recover/async/fetch/data-request.v2.js @@ -140,10 +140,13 @@ function publishAll (server) { reply.branch = [ request.key ] // how invites point to what they're replying to const contextMessage = dbKey - reply.body = server.ephemeral.boxMessage(reply.body, ephPublicKey, contextMessage) - feed.publish(reply, (err, reply) => { + server.ephemeral.boxMessage(reply.body, ephPublicKey, contextMessage, (err, cipherText) => { if (err) return cb(err) - cb(null, { request: unbox(request), reply: unbox(reply) }) + reply.body = cipherText + feed.publish(reply, (err, reply) => { + if (err) return cb(err) + cb(null, { request: unbox(request), reply: unbox(reply) }) + }) }) }) }) From a770eac77a9454d8b627dba6bfc8eaa770227700 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 15 Mar 2019 16:29:01 +0100 Subject: [PATCH 53/60] fix boxMessage in reply.js --- recover/async/reply.js | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/recover/async/reply.js b/recover/async/reply.js index 7336695..93c3f60 100644 --- a/recover/async/reply.js +++ b/recover/async/reply.js @@ -55,24 +55,25 @@ module.exports = function (server) { server.private.unbox(shard, (err, theDecryptedShard) => { if (err) return callback(err) - let shardToSend - if (ephPublicKey) { - const contextMessage = JSON.stringify({ rootId, recp: server.id }) - shardToSend = server.ephemeral.boxMessage(theDecryptedShard, ephPublicKey, contextMessage) - } else { - shardToSend = theDecryptedShard - } - const reply = { root: rootId, branch: inviteId, accept: true, - body: shardToSend, recps: [author, server.id], shareVersion: version } - invites.async.private.reply(inviteId, reply, callback) + if (ephPublicKey) { + const contextMessage = { rootId, recp: server.id } + server.ephemeral.boxMessage(theDecryptedShard, ephPublicKey, contextMessage, (err, shareToSend) => { + if (err) throw err + reply.body = shareToSend + invites.async.private.reply(inviteId, reply, callback) + }) + } else { + reply.body = theDecryptedShard + invites.async.private.reply(inviteId, reply, callback) + } }) }) ) From 0c9cf96bfaaae75548d9e21145c6df62208f49ef Mon Sep 17 00:00:00 2001 From: ameba23 Date: Fri, 15 Mar 2019 16:40:39 +0100 Subject: [PATCH 54/60] change variable name --- test/recover/async/fetch/data-request.v2.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/recover/async/fetch/data-request.v2.js b/test/recover/async/fetch/data-request.v2.js index 4edffe6..1a92bac 100644 --- a/test/recover/async/fetch/data-request.v2.js +++ b/test/recover/async/fetch/data-request.v2.js @@ -139,8 +139,7 @@ function publishAll (server) { if (!reply) return cb(null, { request: unbox(request) }) reply.branch = [ request.key ] // how invites point to what they're replying to - const contextMessage = dbKey - server.ephemeral.boxMessage(reply.body, ephPublicKey, contextMessage, (err, cipherText) => { + server.ephemeral.boxMessage(reply.body, ephPublicKey, dbKey, (err, cipherText) => { if (err) return cb(err) reply.body = cipherText feed.publish(reply, (err, reply) => { From e61efc60638845f31cf497723aa7be32b96f726d Mon Sep 17 00:00:00 2001 From: ameba23 Date: Thu, 21 Mar 2019 15:09:57 +0100 Subject: [PATCH 55/60] fixed request v2 test to work with async box method --- .../async/recombine/request/v2.test.js | 201 ++++++++++-------- 1 file changed, 109 insertions(+), 92 deletions(-) diff --git a/test/recover/async/recombine/request/v2.test.js b/test/recover/async/recombine/request/v2.test.js index 0703843..81c75f9 100644 --- a/test/recover/async/recombine/request/v2.test.js +++ b/test/recover/async/recombine/request/v2.test.js @@ -1,6 +1,7 @@ const { describe } = require('tape-plus') const { unbox } = require('ssb-keys') const getContent = require('ssb-msg-content') +const pull = require('pull-stream') const Server = require('../../../../testbot') const Share = require('../../../../../share/async/share') @@ -42,21 +43,18 @@ describe('recover.async.recombine (request v2 shards)', context => { request(rootId, (err, invites) => { if (err) console.error(err) - - var replies = invites.reduce((collection, invite) => { - return buildReplies(collection, invite, data, rootId) - }, {}) - - alice.publish(replies[alice.id], (err, aliceReply) => { + buildReplies(invites, data, rootId, (err, replies) => { if (err) console.error(err) - - bob.publish(replies[bob.id], (err, bobReply) => { + alice.publish(replies[alice.id], (err, aliceReply) => { if (err) console.error(err) - recombine(rootId, (err, returnedSecret) => { - assert.notOk(err, 'error is null') - assert.equal(secret, returnedSecret.secret, 'returns the correct secret') - assert.equal(label, returnedSecret.label, 'returns the correct label') - next() + bob.publish(replies[bob.id], (err, bobReply) => { + if (err) console.error(err) + recombine(rootId, (err, returnedSecret) => { + assert.notOk(err, 'error is null') + assert.equal(secret, returnedSecret.secret, 'returns the correct secret') + assert.equal(label, returnedSecret.label, 'returns the correct label') + next() + }) }) }) }) @@ -71,18 +69,16 @@ describe('recover.async.recombine (request v2 shards)', context => { var rootId = data.root.key request(rootId, (err, invites) => { if (err) console.error(err) - - var replies = invites.reduce((collection, invite) => { - return buildReplies(collection, invite, data, rootId) - }, {}) - - alice.publish(replies[alice.id], (err, aliceReply) => { + buildReplies(invites, data, rootId, (err, replies) => { if (err) console.error(err) + alice.publish(replies[alice.id], (err, aliceReply) => { + if (err) console.error(err) - recombine(rootId, (err, returnedSecret) => { - assert.ok(err, 'an error') - assert.notOk(returnedSecret, 'Does not return a secret') - next() + recombine(rootId, (err, returnedSecret) => { + assert.ok(err, 'an error') + assert.notOk(returnedSecret, 'Does not return a secret') + next() + }) }) }) }) @@ -97,33 +93,37 @@ describe('recover.async.recombine (request v2 shards)', context => { request(rootId, (err, invites) => { if (err) console.error(err) - var replies = invites.reduce((collection, invite) => { - var content = getContent(invite) - var custodianId = content.recps.find(notMe) - - collection[custodianId] = { - type: 'invite-reply', - root: rootId, - branch: invite.key, - accept: true, - version: '1', - body: 'This is not a valid shard', - recps: content.recps - } - - return collection - }, {}) - - alice.publish(replies[alice.id], (err, aliceReply) => { + // var replies = invites.reduce((collection, invite) => { + // var content = getContent(invite) + // var custodianId = content.recps.find(notMe) + // + // collection[custodianId] = { + // type: 'invite-reply', + // root: rootId, + // branch: invite.key, + // accept: true, + // version: '1', + // body: 'This is not a valid shard', + // recps: content.recps + // } + // + // return collection + // }, {}) + + buildReplies(invites, data, rootId, (err, replies) => { if (err) console.error(err) - - bob.publish(replies[bob.id], (err, bobReply) => { + replies[alice.id].body = 'This is not a valid share' + alice.publish(replies[alice.id], (err, aliceReply) => { if (err) console.error(err) - recombine(rootId, (err, returnedSecret) => { - assert.ok(err, 'an error') - assert.notOk(returnedSecret, 'Does not return a secret') - next() + bob.publish(replies[bob.id], (err, bobReply) => { + if (err) console.error(err) + + recombine(rootId, (err, returnedSecret) => { + assert.ok(err, 'an error') + assert.notOk(returnedSecret, 'Does not return a secret') + next() + }) }) }) }) @@ -143,20 +143,19 @@ describe('recover.async.recombine (request v2 shards)', context => { request(rootId, (err, invites) => { if (err) console.error(err) - var replies = invites.reduce((collection, invite) => { - return buildReplies(collection, invite, data, otherRootId) - }, {}) - - alice.publish(replies[alice.keys.id], (err, aliceReply) => { + buildReplies(invites, data, otherRootId, (err, replies) => { if (err) console.error(err) - - bob.publish(replies[bob.keys.id], (err, bobReply) => { + alice.publish(replies[alice.keys.id], (err, aliceReply) => { if (err) console.error(err) - recombine(rootId, (err, returnedSecret) => { - assert.ok(err, 'an error') - assert.notOk(returnedSecret, 'Does not return a secret') - next() + bob.publish(replies[bob.keys.id], (err, bobReply) => { + if (err) console.error(err) + + recombine(rootId, (err, returnedSecret) => { + assert.ok(err, 'an error') + assert.notOk(returnedSecret, 'Does not return a secret') + next() + }) }) }) }) @@ -173,28 +172,29 @@ describe('recover.async.recombine (request v2 shards)', context => { request(rootId, (err, invites) => { if (err) console.error(err) - var replies = invites.reduce((collection, invite) => ( - buildReplies(collection, invite, data, rootId) - ), {}) - - replies[alice.id].shareVersion = '1111.0.0' - - alice.publish(replies[alice.id], (err, aliceReply) => { + buildReplies(invites, data, rootId, (err, replies) => { if (err) console.error(err) - bob.publish(replies[bob.id], (err, bobReply) => { + replies[alice.id].shareVersion = '1111.0.0' + + alice.publish(replies[alice.id], (err, aliceReply) => { if (err) console.error(err) - recombine(rootId, (err, returnedSecret) => { - assert.ok(err, 'an error') - assert.notOk(returnedSecret, 'Does not return a secret') - next() + bob.publish(replies[bob.id], (err, bobReply) => { + if (err) console.error(err) + + recombine(rootId, (err, returnedSecret) => { + assert.ok(err, 'an error') + assert.notOk(returnedSecret, 'Does not return a secret') + next() + }) }) }) }) }) }) }) + context('calls back with an error when given a rootId for which there is no root message', (assert, next) => { const rootId = '%g1gbRKarJT4au9De2r4aJ+MghFSAyQzjfVnnxtJNBBw=.sha256' recombine(rootId, (err, returnedSecret) => { @@ -216,27 +216,44 @@ describe('recover.async.recombine (request v2 shards)', context => { return custodians.find(c => c.id === custodianId) } - function buildReplies (collection, invite, data, rootId) { - var content = getContent(invite) - var custodianId = content.recps.find(notMe) - var shard = data.shards.map(getContent) - .find(shard => shard.recps.find(recp => recp === custodianId)) - .shard - - const unboxedShare = unbox(shard, findCustodian(custodianId).keys) - const contextMessage = JSON.stringify({ rootId, recp: custodianId }) - const boxedShare = server.ephemeral.boxMessage(unboxedShare, content.ephPublicKey, contextMessage) - collection[custodianId] = { - type: 'invite-reply', - root: rootId, - branch: invite.key, - accept: true, - version: '1', - shareVersion: '2.0.0', - body: boxedShare, - recps: content.recps - } - - return collection + function buildReplies (invites, data, rootId, cb) { + pull( + pull.values(invites), + pull.asyncMap((invite, callback) => { + var content = getContent(invite) + var custodianId = content.recps.find(notMe) + var shard = data.shards.map(getContent) + .find(shard => shard.recps.find(recp => recp === custodianId)) + .shard + + const unboxedShare = unbox(shard, findCustodian(custodianId).keys) + const contextMessage = { rootId, recp: custodianId } + server.ephemeral.boxMessage(unboxedShare, content.ephPublicKey, contextMessage, (err, boxedShare) => { + if (err) cb(err) + callback(null, + { custodianId, + reply: { + type: 'invite-reply', + root: rootId, + branch: invite.key, + accept: true, + version: '1', + shareVersion: '2.0.0', + body: boxedShare, + recps: content.recps + } + } + ) + }) + }), + pull.collect((err, repliesArray) => { + if (err) cb(err) + var replies = {} + repliesArray.forEach(reply => { + replies[reply.custodianId] = reply.reply + }) + cb(null, replies) + }) + ) } }) From a1fe05bb130a29d552e45fc499ed5eb104b29381 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Thu, 21 Mar 2019 15:22:09 +0100 Subject: [PATCH 56/60] bump ssb-ephemeral-keys --- package-lock.json | 67 +++++++++++++++++++++++++++++++++++++++++------ package.json | 2 +- 2 files changed, 60 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 759e0ac..25445d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4245,6 +4245,12 @@ } } }, + "napi-build-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.1.tgz", + "integrity": "sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==", + "dev": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6903,9 +6909,9 @@ } }, "ssb-ephemeral-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ssb-ephemeral-keys/-/ssb-ephemeral-keys-1.0.0.tgz", - "integrity": "sha512-hkDPtE4GUNCRLf4NX/8USQ/wwa1ZyYZBQcOM0CRio0AURaT08CVBCJYz4mARwfI9h7bZAzigdrOfPfvfxX3lCw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ssb-ephemeral-keys/-/ssb-ephemeral-keys-1.0.1.tgz", + "integrity": "sha512-zAvJzbn2SidE2YRewa93QiqruLePKbCplC5uNc5d4dMYgD5X/EwWAeUbU3SU2+5ijgdbtKNZ8omqZgvXeFsJNg==", "dev": true, "requires": { "level": "^4.0.0", @@ -6944,6 +6950,12 @@ "xtend": "^4.0.1" } }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true + }, "level": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/level/-/level-4.0.0.tgz", @@ -6992,16 +7004,16 @@ } }, "leveldown": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-4.0.1.tgz", - "integrity": "sha512-ZlBKVSsglPIPJnz4ggB8o2R0bxDxbsMzuQohbfgoFMVApyTE118DK5LNRG0cRju6rt3OkGxe0V6UYACGlq/byg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-4.0.2.tgz", + "integrity": "sha512-SUgSRTWFh3eeiTdIt2a4Fi9TZO5oWzE9uC/Iw8+fVr1sk8x1S2l151UWwSmrMFZB3GxJhZIf4bQ0n+051Cctpw==", "dev": true, "requires": { "abstract-leveldown": "~5.0.0", "bindings": "~1.3.0", "fast-future": "~1.0.2", - "nan": "~2.10.0", - "prebuild-install": "^4.0.0" + "nan": "~2.12.1", + "prebuild-install": "~5.2.4" } }, "levelup": { @@ -7015,6 +7027,45 @@ "level-iterator-stream": "~3.0.0", "xtend": "~4.0.0" } + }, + "nan": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", + "dev": true + }, + "node-abi": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.7.1.tgz", + "integrity": "sha512-OV8Bq1OrPh6z+Y4dqwo05HqrRL9YNF7QVMRfq1/pguwKLG+q9UB/Lk0x5qXjO23JjJg+/jqCHSTaG1P3tfKfuw==", + "dev": true, + "requires": { + "semver": "^5.4.1" + } + }, + "prebuild-install": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.2.5.tgz", + "integrity": "sha512-6uZgMVg7yDfqlP5CPurVhtq3hUKBFNufiar4J5hZrlHTo59DDBEtyxw01xCdFss9j0Zb9+qzFVf/s4niayba3w==", + "dev": true, + "requires": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.7.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "os-homedir": "^1.0.1", + "pump": "^2.0.1", + "rc": "^1.2.7", + "simple-get": "^2.7.0", + "tar-fs": "^1.13.0", + "tunnel-agent": "^0.6.0", + "which-pm-runs": "^1.0.0" + } } } }, diff --git a/package.json b/package.json index 9cf8edb..250e35a 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "devDependencies": { "scuttle-testbot": "^1.1.6", "ssb-backlinks": "^0.7.3", - "ssb-ephemeral-keys": "^1.0.0", + "ssb-ephemeral-keys": "^1.0.1", "ssb-private": "^0.2.3", "ssb-query": "^2.3.0", "standard": "^12.0.1", From 035bd9848d006004d3647eb2b8d3f4e7a7a99951 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Sat, 15 Jun 2019 20:38:21 +0200 Subject: [PATCH 57/60] modify test for deleting a single ephemeral keypair for obligatory contextMessage --- test/recover/async/deleteEphemeralKeyPair.test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/recover/async/deleteEphemeralKeyPair.test.js b/test/recover/async/deleteEphemeralKeyPair.test.js index ce776c7..5135f61 100644 --- a/test/recover/async/deleteEphemeralKeyPair.test.js +++ b/test/recover/async/deleteEphemeralKeyPair.test.js @@ -1,6 +1,7 @@ const { describe } = require('tape-plus') const Server = require('../../testbot') const DeleteKeyPair = require('../../../recover/async/deleteEphemeralKeyPair') +const contextMessage = 'only for testing deletion of an ephemeral keypair' describe('recover.async.deleteEphemeralKeyPair', context => { let server, deleteKeyPair, recp @@ -23,7 +24,7 @@ describe('recover.async.deleteEphemeralKeyPair', context => { if (err) throw err deleteKeyPair(rootId, recp, (err) => { assert.notOk(err, 'null errors') - server.ephemeral.boxMessage('something', ephPublicKey, (err, cipherText) => { + server.ephemeral.boxMessage('something', ephPublicKey, contextMessage, (err, cipherText) => { if (err) throw err server.ephemeral.unBoxMessage({ rootId, recp }, cipherText, null, (err, message) => { assert.ok(err, 'throws an error when attempting to use the key') From 7ee8c37c370a118b385076b0e5796bb333124241 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Sat, 15 Jun 2019 20:41:49 +0200 Subject: [PATCH 58/60] modify test for deleting all ephemeral keypairs for obligatory contextMessage --- test/recover/async/deleteEphemeralKeyPairs.test.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/recover/async/deleteEphemeralKeyPairs.test.js b/test/recover/async/deleteEphemeralKeyPairs.test.js index 11d926e..5949dda 100644 --- a/test/recover/async/deleteEphemeralKeyPairs.test.js +++ b/test/recover/async/deleteEphemeralKeyPairs.test.js @@ -2,6 +2,7 @@ const { describe } = require('tape-plus') const Server = require('../../testbot') const DeleteKeyPairs = require('../../../recover/async/deleteEphemeralKeyPairs') const pull = require('pull-stream') +const contextMessage = 'only for testing deletion of ephemeral keypairs' describe('recover.async.deleteEphemeralKeyPairs', context => { let server, deleteKeyPairs, custodians, replies @@ -44,7 +45,7 @@ describe('recover.async.deleteEphemeralKeyPairs', context => { pull( pull.values(custodians), pull.asyncMap((custodian, cb) => { - server.ephemeral.boxMessage('something', testPubKey, (err, cipherText) => { + server.ephemeral.boxMessage('something', testPubKey, contextMessage, (err, cipherText) => { if (err) console.error(err) replies[custodian.id].body = cipherText custodian.publish(replies[custodian.id], (err, reply) => { @@ -63,7 +64,7 @@ describe('recover.async.deleteEphemeralKeyPairs', context => { deleteKeyPairs(rootId, (err) => { assert.notOk(err, 'null errors') custodianKeys.forEach(custodianKey => { - server.ephemeral.boxMessage('something', custodianKey.ephPublicKey, (err, cipherText) => { + server.ephemeral.boxMessage('something', custodianKey.ephPublicKey, contextMessage, (err, cipherText) => { if (err) console.error(err) server.ephemeral.unBoxMessage(custodianKey.dbKey, cipherText, (err, message) => { assert.ok(err, 'throws an error when attempting to use a key') From d6883adab9cbbc8ddf589e62edca32eda700ccb0 Mon Sep 17 00:00:00 2001 From: ameba23 Date: Sat, 15 Jun 2019 20:42:32 +0200 Subject: [PATCH 59/60] likewise for unboxing --- test/recover/async/deleteEphemeralKeyPairs.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/recover/async/deleteEphemeralKeyPairs.test.js b/test/recover/async/deleteEphemeralKeyPairs.test.js index 5949dda..0e25390 100644 --- a/test/recover/async/deleteEphemeralKeyPairs.test.js +++ b/test/recover/async/deleteEphemeralKeyPairs.test.js @@ -66,7 +66,7 @@ describe('recover.async.deleteEphemeralKeyPairs', context => { custodianKeys.forEach(custodianKey => { server.ephemeral.boxMessage('something', custodianKey.ephPublicKey, contextMessage, (err, cipherText) => { if (err) console.error(err) - server.ephemeral.unBoxMessage(custodianKey.dbKey, cipherText, (err, message) => { + server.ephemeral.unBoxMessage(custodianKey.dbKey, cipherText, contextMessage, (err, message) => { assert.ok(err, 'throws an error when attempting to use a key') assert.notOk(message, 'returns no message') }) From dc90ec92e13ea03a9b913d94ab9ec9659204eb9a Mon Sep 17 00:00:00 2001 From: ameba23 Date: Mon, 24 Jun 2019 18:49:51 +0200 Subject: [PATCH 60/60] bump ssb-ephemeral-keys --- package-lock.json | 68 ++++++++++++++++++++++++++++++++++++++--------- package.json | 2 +- 2 files changed, 57 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index b88df54..ea02a02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -652,6 +652,12 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, + "buffer-safe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-safe/-/buffer-safe-1.0.0.tgz", + "integrity": "sha1-jWcDxAyixv6wAtvtcupqZbNlDi4=", + "dev": true + }, "buffer-shims": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", @@ -1893,6 +1899,15 @@ "escape-string-regexp": "^1.0.5" } }, + "file-bytes": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/file-bytes/-/file-bytes-2.0.3.tgz", + "integrity": "sha1-v/3yvwQzH+n208fUQZLpg3WeoCc=", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, "file-entry-cache": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", @@ -6454,6 +6469,34 @@ "simple-concat": "^1.0.0" } }, + "skrub": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/skrub/-/skrub-1.4.0.tgz", + "integrity": "sha1-si6SkAnW96K6b2xStznbohHMyLc=", + "dev": true, + "requires": { + "buffer-safe": "^1.0.0", + "file-bytes": "^2.0.1", + "globby": "^6.1.0", + "pify": "^2.3.0", + "rimraf": "^2.5.2" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + } + } + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -6930,12 +6973,13 @@ } }, "ssb-ephemeral-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ssb-ephemeral-keys/-/ssb-ephemeral-keys-1.0.1.tgz", - "integrity": "sha512-zAvJzbn2SidE2YRewa93QiqruLePKbCplC5uNc5d4dMYgD5X/EwWAeUbU3SU2+5ijgdbtKNZ8omqZgvXeFsJNg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ssb-ephemeral-keys/-/ssb-ephemeral-keys-1.0.2.tgz", + "integrity": "sha512-FjQM4sOuESPcvNjrKNBhe0NE9aJTU4faO9bIwM6fF3xVX+qJ3RhsTlK0ZtI5wfcQyRqdgbuVp5+CggRhQbiD3g==", "dev": true, "requires": { "level": "^4.0.0", + "skrub": "^1.4.0", "sodium-native": "^2.2.3" }, "dependencies": { @@ -6989,15 +7033,15 @@ } }, "level-codec": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.0.tgz", - "integrity": "sha512-OIpVvjCcZNP5SdhcNupnsI1zo5Y9Vpm+k/F1gfG5kXrtctlrwanisakweJtE0uA0OpLukRfOQae+Fg0M5Debhg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.1.tgz", + "integrity": "sha512-ajFP0kJ+nyq4i6kptSM+mAvJKLOg1X5FiFPtLG9M5gCEZyBmgDi3FkDrvlMkEzrUn1cWxtvVmrvoS4ASyO/q+Q==", "dev": true }, "level-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.0.tgz", - "integrity": "sha512-AmY4HCp9h3OiU19uG+3YWkdELgy05OTP/r23aNHaQKWv8DO787yZgsEuGVkoph40uwN+YdUKnANlrxSsoOaaxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", + "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", "dev": true, "requires": { "errno": "~0.1.1" @@ -7056,9 +7100,9 @@ "dev": true }, "node-abi": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.7.1.tgz", - "integrity": "sha512-OV8Bq1OrPh6z+Y4dqwo05HqrRL9YNF7QVMRfq1/pguwKLG+q9UB/Lk0x5qXjO23JjJg+/jqCHSTaG1P3tfKfuw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.9.0.tgz", + "integrity": "sha512-jmEOvv0eanWjhX8dX1pmjb7oJl1U1oR4FOh0b2GnvALwSYoOdU7sj+kLDSAyjo4pfC9aj/IxkloxdLJQhSSQBA==", "dev": true, "requires": { "semver": "^5.4.1" diff --git a/package.json b/package.json index 0f5bea8..a6c7805 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "devDependencies": { "scuttle-testbot": "^1.1.6", "ssb-backlinks": "^0.7.3", - "ssb-ephemeral-keys": "^1.0.1", + "ssb-ephemeral-keys": "^1.0.2", "ssb-private": "^0.2.3", "ssb-query": "^2.3.0", "standard": "^12.0.1",