From 29ed57e955b8beaf36b1047bdfcbfcaee257d48b Mon Sep 17 00:00:00 2001 From: sirpy Date: Sun, 8 Dec 2019 17:41:26 +0200 Subject: [PATCH 01/14] react native support (#5) * WIP: use isomorphic-webcrypto for RN * WIP: expo friendly exports * WIP: buffer for RN * WIP: textencoder for RN * WIP: aeskey from jwk instead of raw for RN * fix: missing taglength for msrcrypto * add: update isomorphic-webcrypto * add: match isocrypto api * add: failing test for 4e2 as 400 * fix: remove extra atob btoa * add: sea unbuild * refactor: according to mhelander review * refactor: shorter require * fix: make bug test pass, capitlize bug test. * fix: npm ci + sea test * add: restore old browser export and add react-native friendly exports * fix: import buffer into correct global/window * fix: bad comparison * fix: only include buffer if no btoa/atob --- .prettierignore | 1 + browser.android.js | 2 + browser.ios.js | 2 + browser.js | 1 + package-lock.json | 279 +++++++++++++++++++++++++++++++++++---------- package.json | 17 +-- sea.js | 60 ++++++---- sea/aeskey.js | 5 +- sea/base64.js | 10 +- sea/buffer.js | 2 +- sea/decrypt.js | 2 +- sea/sea.js | 1 + sea/secret.js | 6 +- sea/settings.js | 9 +- sea/shim.js | 24 ++-- test/sea/sea.js | 54 ++------- 16 files changed, 320 insertions(+), 155 deletions(-) create mode 100644 .prettierignore create mode 100644 browser.android.js create mode 100644 browser.ios.js create mode 100644 browser.js diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..f59ec20a --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +* \ No newline at end of file diff --git a/browser.android.js b/browser.android.js new file mode 100644 index 00000000..d054b7cb --- /dev/null +++ b/browser.android.js @@ -0,0 +1,2 @@ +module.exports.Gun = require('./gun.js') +module.exports.SEA = require('./sea.js') \ No newline at end of file diff --git a/browser.ios.js b/browser.ios.js new file mode 100644 index 00000000..d054b7cb --- /dev/null +++ b/browser.ios.js @@ -0,0 +1,2 @@ +module.exports.Gun = require('./gun.js') +module.exports.SEA = require('./sea.js') \ No newline at end of file diff --git a/browser.js b/browser.js new file mode 100644 index 00000000..2459a30c --- /dev/null +++ b/browser.js @@ -0,0 +1 @@ +module.exports = require('./gun.js') \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c25fcdf0..b3c251cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "gun", - "version": "0.2019.910", + "version": "0.2019.915", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -35,18 +35,6 @@ "pvtsutils": "^1.0.6", "tslib": "^1.10.0", "webcrypto-core": "^1.0.14" - }, - "dependencies": { - "webcrypto-core": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.0.14.tgz", - "integrity": "sha512-iGZQcH/o3Jv6mpvCbzan6uAcUcLTTnUCil6RVYakcNh5/QXIKRRC06EFxHru9lHgVKucZy3gG4OBiup0IsOr0g==", - "optional": true, - "requires": { - "pvtsutils": "^1.0.4", - "tslib": "^1.10.0" - } - } } }, "@types/node": { @@ -54,6 +42,26 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.18.tgz", "integrity": "sha512-ryO3Q3++yZC/+b8j8BdKd/dn9JlzlHBPdm80656xwYUdmPkpTGTjkAdt6BByiNupGPE8w0FhBgvYy/fX9hRNGQ==" }, + "@unimodules/core": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@unimodules/core/-/core-3.0.2.tgz", + "integrity": "sha512-EMZjVp+yrtoPKpDBPvj4+hyDWALl7gvpWeUsDz2Nb9MMBPLnhag1uNk3KC98StJdnjbSXKSdKrCMMidOXnyKcg==", + "optional": true, + "requires": { + "compare-versions": "^3.4.0" + } + }, + "@unimodules/react-native-adapter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@unimodules/react-native-adapter/-/react-native-adapter-3.0.0.tgz", + "integrity": "sha512-zkFFE0HQ2Flfx/aY3hBKDgMvQ1meUm3H6vMIacY1KywexCuKW8ivBobkOsHIet4jf7km0Eklt6WtB3LqQVw5yw==", + "optional": true, + "requires": { + "invariant": "^2.2.4", + "lodash": "^4.5.0", + "prop-types": "^15.6.1" + } + }, "addressparser": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-0.3.2.tgz", @@ -102,6 +110,12 @@ "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", "dev": true }, + "asmcrypto.js": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/asmcrypto.js/-/asmcrypto.js-0.22.0.tgz", + "integrity": "sha512-usgMoyXjMbx/ZPdzTSXExhMPur2FTdz/Vo5PVx2gIaBcdAAJNOFlsdgqveM8Cff7W0v+xrf9BwjOV26JSAF9qA==", + "optional": true + }, "asn1js": { "version": "2.0.26", "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.0.26.tgz", @@ -111,14 +125,14 @@ } }, "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, "aws-sdk": { - "version": "2.238.1", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.238.1.tgz", - "integrity": "sha1-o1/ewSLtkV2kkIQOiCgzbaW+Tn8=", + "version": "2.528.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.528.0.tgz", + "integrity": "sha512-WBgavPqKHvYcIhD7LhmLLYOKtG/SUdNY6hMB0N/Jxaolzx4sOa7xegiZ8sdkAUq/vUEs1frnBF9hNmeIszUWCg==", "dev": true, "requires": { "buffer": "4.9.1", @@ -128,9 +142,38 @@ "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", - "uuid": "3.1.0", - "xml2js": "0.4.17", - "xmlbuilder": "4.2.1" + "uuid": "3.3.2", + "xml2js": "0.4.19" + }, + "dependencies": { + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + } + } + }, + "b64-lite": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/b64-lite/-/b64-lite-1.3.1.tgz", + "integrity": "sha512-A3n/YWszeQeUeKKy+XRfsDW/s/+1cvD110HYA4uXtkNswNLd1MxrNblYt2lgKisUS3UfPPTaXhvFegD+l4YuOA==", + "requires": { + "base-64": "^0.1.0" + } + }, + "b64u-lite": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/b64u-lite/-/b64u-lite-1.0.1.tgz", + "integrity": "sha512-4E6rqyrCnrAdzayWUS8XwFC/vRTBbmR7fgqb/IuHXRM2z63VH/tNxtzDWZhgCXCORTiwy2mIhCtmHyc9TMBj7Q==", + "optional": true, + "requires": { + "b64-lite": "^1.1.1" } }, "backo2": { @@ -145,6 +188,11 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base-64": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz", + "integrity": "sha1-eAqZyE59YAJgNhURxId2E78k9rs=" + }, "base64-arraybuffer": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", @@ -154,8 +202,7 @@ "base64-js": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" }, "base64id": { "version": "1.0.0", @@ -201,14 +248,12 @@ "dev": true }, "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", + "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", "requires": { "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "ieee754": "^1.1.4" } }, "callsite": { @@ -277,6 +322,12 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "compare-versions": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.1.tgz", + "integrity": "sha512-9fGPIB7C6AyM18CJJBHt5EnCZDG3oiTJYy0NjfIAGjKpzv0tkxWko7TNQHF5ymqm7IH03tqmeuBxtvD+Izh6mg==", + "optional": true + }, "component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", @@ -578,6 +629,15 @@ "strip-eof": "^1.0.0" } }, + "expo-random": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/expo-random/-/expo-random-6.0.0.tgz", + "integrity": "sha512-nXWmopErqgwkGGfaKPG8v4BNqTXZH4oA/4aAnn6zkTVFdeWBDpWn+Ena3/jnM3raMR3pMNI39YNLqNrut81HvA==", + "optional": true, + "requires": { + "base64-js": "^1.3.0" + } + }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -696,8 +756,7 @@ "ieee754": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", - "dev": true + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" }, "indexof": { "version": "0.0.1", @@ -721,6 +780,15 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "optional": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", @@ -799,12 +867,36 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "isomorphic-webcrypto": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/isomorphic-webcrypto/-/isomorphic-webcrypto-2.3.2.tgz", + "integrity": "sha512-XbUC6ZwVvJfts2FYfAuNRU99tt89EzTknZcKZjxx6/6hxNeLgF6sIDbA/RdA3spbcNrXYyPOHa90khbUgZWarw==", + "optional": true, + "requires": { + "@peculiar/webcrypto": "^1.0.19", + "@unimodules/core": "*", + "@unimodules/react-native-adapter": "*", + "asmcrypto.js": "^0.22.0", + "b64-lite": "^1.3.1", + "b64u-lite": "^1.0.1", + "expo-random": "*", + "msrcrypto": "^1.5.6", + "react-native-securerandom": "^0.1.1", + "str2buf": "^1.3.0", + "webcrypto-shim": "^0.1.4" + } + }, "jmespath": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", "dev": true }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", @@ -841,10 +933,10 @@ } }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "optional": true }, "log-symbols": { "version": "2.2.0", @@ -855,6 +947,14 @@ "chalk": "^2.0.1" } }, + "loose-envify": { + "version": "1.4.0", + "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.0 || ^4.0.0" + } + }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", @@ -957,6 +1057,12 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, + "msrcrypto": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/msrcrypto/-/msrcrypto-1.5.7.tgz", + "integrity": "sha512-vH/uVdMPgdtLrDCdR2gWps2fB10EYWjXYi67W9RzNSd5Jch3noWGUvNUXSIJA87VTDaE+wvjS7yRSN4gALTslg==", + "optional": true + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -1202,6 +1308,25 @@ "integrity": "sha1-SSIQiSM1vTExwKCN2i2T7DVD5CM=", "dev": true }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "optional": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "optional": true + } + } + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -1244,6 +1369,21 @@ "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==", "optional": true }, + "react-is": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz", + "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", + "optional": true + }, + "react-native-securerandom": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/react-native-securerandom/-/react-native-securerandom-0.1.1.tgz", + "integrity": "sha1-8TBiOkEsM4sK+t7bwgTFy7i/IHA=", + "optional": true, + "requires": { + "base64-js": "*" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -1443,6 +1583,12 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "str2buf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/str2buf/-/str2buf-1.3.0.tgz", + "integrity": "sha512-xIBmHIUHYZDP4HyoXGHYNVmxlXLXDrtFHYT0eV6IOdEj3VO9ccaF1Ejl9Oq8iFjITllpT8FhaXb4KsNmw+3EuA==", + "optional": true + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -1521,19 +1667,19 @@ "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" }, "uglify-js": { - "version": "3.3.24", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.24.tgz", - "integrity": "sha512-hS7+TDiqIqvWScCcKRybCQzmMnEzJ4ryl9ErRmW4GFyG48p0/dKZiy/5mVLbsFzU8CCnCgQdxMiJzZythvLzCg==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", "dev": true, "requires": { - "commander": "~2.15.0", + "commander": "~2.20.0", "source-map": "~0.6.1" }, "dependencies": { "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", "dev": true } } @@ -1549,11 +1695,27 @@ } }, "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, + "webcrypto-core": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.0.14.tgz", + "integrity": "sha512-iGZQcH/o3Jv6mpvCbzan6uAcUcLTTnUCil6RVYakcNh5/QXIKRRC06EFxHru9lHgVKucZy3gG4OBiup0IsOr0g==", + "optional": true, + "requires": { + "pvtsutils": "^1.0.4", + "tslib": "^1.10.0" + } + }, + "webcrypto-shim": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/webcrypto-shim/-/webcrypto-shim-0.1.4.tgz", + "integrity": "sha512-I2lnL+K2oPNE9ryVHwo42oDnt8XQ9E1KKMGCmcT7OXaAKPmUeCi/G0nUgLR6M6Ztj05ZCxLMGf5bXNaSo+wURg==", + "optional": true + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -1632,9 +1794,9 @@ "dev": true }, "ws": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.0.tgz", - "integrity": "sha512-Swie2C4fs7CkwlHu1glMePLYJJsWjzhl1vm3ZaLplD0h7OMkZyZ6kLTB/OagiU923bZrPFXuDTeEqaEN4NWG4g==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.2.tgz", + "integrity": "sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg==", "requires": { "async-limiter": "^1.0.0" } @@ -1646,23 +1808,20 @@ "dev": true }, "xml2js": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", - "integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=", + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "dev": true, "requires": { "sax": ">=0.6.0", - "xmlbuilder": "^4.1.0" + "xmlbuilder": "~9.0.1" } }, "xmlbuilder": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", - "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", - "dev": true, - "requires": { - "lodash": "^4.0.0" - } + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true }, "xmlhttprequest-ssl": { "version": "1.5.3", diff --git a/package.json b/package.json index 84026804..1719dc64 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,9 @@ "version": "0.2019.1120", "description": "A realtime, decentralized, offline-first, graph data synchronization engine.", "main": "index.js", - "browser": "gun.js", + "browser": "browser.js", + "ios": "browser.ios.js", + "android": "browser.android.js", "scripts": { "start": "node examples/http.js", "https": "HTTPS_KEY=test/https/server.key HTTPS_CERT=test/https/server.crt npm start", @@ -52,19 +54,20 @@ "node": ">=0.8.4" }, "dependencies": { - "ws": "~>7.1.0" + "buffer": "^5.4.3", + "ws": "^7.1.2" }, "optionalDependencies": { - "@peculiar/webcrypto": "^1.0.19", - "emailjs": "^2.2.0", - "text-encoding": "^0.7.0" + "text-encoding": "^0.7.0", + "isomorphic-webcrypto": "^2.3.2", + "emailjs": "^2.2.0" }, "devDependencies": { - "aws-sdk": ">=2.153.0", + "aws-sdk": "^2.528.0", "ip": "^1.1.5", "mocha": "^6.2.0", "panic-manager": "^1.2.0", "panic-server": "^1.1.1", - "uglify-js": ">=2.8.22" + "uglify-js": "^3.6.0" } } diff --git a/sea.js b/sea.js index f42db5d0..2a4274ab 100644 --- a/sea.js +++ b/sea.js @@ -3,6 +3,7 @@ /* UNBUILD */ var root; if(typeof window !== "undefined"){ root = window } + if(typeof global !== "undefined"){ root = global } root = root || {}; var console = root.console || {log: function(){}}; @@ -47,10 +48,12 @@ })(USE, './https'); ;USE(function(module){ - if(typeof global !== "undefined"){ - var g = global; - g.btoa = function (data) { return Buffer.from(data, "binary").toString("base64"); }; - g.atob = function (data) { return Buffer.from(data, "base64").toString("binary"); }; + if(typeof btoa === "undefined"){ + if(typeof Buffer === "undefined") { + root.Buffer = require("buffer").Buffer + } + root.btoa = function (data) { return Buffer.from(data, "binary").toString("base64"); }; + root.atob = function (data) { return Buffer.from(data, "base64").toString("binary"); }; } })(USE, './base64'); @@ -96,7 +99,7 @@ Object.assign(SafeBuffer, { // (data, enc) where typeof data === 'string' then enc === 'utf8'|'hex'|'base64' from() { - if (!Object.keys(arguments).length) { + if (!Object.keys(arguments).length || arguments[0]==null) { throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') } const input = arguments[0] @@ -167,28 +170,26 @@ var o = {}; if(SEA.window){ - api.crypto = window.crypto || window.msCrypto; + api.crypto = window.crypto || window.msCrypto || require('isomorphic-webcrypto'); api.subtle = (api.crypto||o).subtle || (api.crypto||o).webkitSubtle; api.TextEncoder = window.TextEncoder; api.TextDecoder = window.TextDecoder; - api.random = (len) => Buffer.from(api.crypto.getRandomValues(new Uint8Array(Buffer.alloc(len)))) + api.random = (len) => Buffer.from(api.crypto.getRandomValues(new Uint8Array(Buffer.alloc(len)))); + } + if(!api.TextDecoder) + { + const { TextEncoder, TextDecoder } = require('text-encoding'); + api.TextDecoder = TextDecoder; + api.TextEncoder = TextEncoder; } if(!api.crypto){try{ var crypto = USE('crypto', 1); - const { TextEncoder, TextDecoder } = USE('text-encoding', 1) Object.assign(api, { crypto, - //subtle, - TextEncoder, - TextDecoder, random: (len) => Buffer.from(crypto.randomBytes(len)) - }); - //try{ - const { Crypto: WebCrypto } = USE('@peculiar/webcrypto', 1); - api.ossl = api.subtle = new WebCrypto({directory: 'ossl'}).subtle // ECDH - //}catch(e){ - //console.log("node-webcrypto-ossl is optionally needed for ECDH, please install if needed."); - //} + }); + const isocrypto = require('isomorphic-webcrypto'); + api.ossl = api.subtle = isocrypto.subtle; }catch(e){ console.log("node-webcrypto-ossl and text-encoding may not be included by default, please add it to your package.json!"); OSSL_WEBCRYPTO_OR_TEXT_ENCODING_NOT_INSTALLED; @@ -201,7 +202,7 @@ var SEA = USE('./root'); var Buffer = USE('./buffer'); var s = {}; - s.pbkdf2 = {hash: 'SHA-256', iter: 100000, ks: 64}; + s.pbkdf2 = {hash: {name : 'SHA-256'}, iter: 100000, ks: 64}; s.ecdsa = { pair: {name: 'ECDSA', namedCurve: 'P-256'}, sign: {name: 'ECDSA', hash: {name: 'SHA-256'}} @@ -217,6 +218,13 @@ if(d){ jwk.d = d } return jwk; }; + + s.keyToJwk = function(keyBytes) { + const keyB64 = keyBytes.toString('base64'); + const k = keyB64.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, ''); + return { kty: 'oct', k: k, ext: false, alg: 'A256GCM' }; + } + s.recall = { validity: 12 * 60 * 60, // internally in seconds : 12 hours hook: function(props){ return props } // { iat, exp, alias, remember } // or return new Promise((resolve, reject) => resolve(props) @@ -492,6 +500,7 @@ ;USE(function(module){ var shim = USE('./shim'); + var S = USE('./settings'); var sha256hash = USE('./sha256'); const importGen = async (key, salt, opt) => { @@ -499,7 +508,9 @@ var opt = opt || {}; const combo = key + (salt || shim.random(8)).toString('utf8'); // new const hash = shim.Buffer.from(await sha256hash(combo), 'binary') - return await shim.subtle.importKey('raw', new Uint8Array(hash), opt.name || 'AES-GCM', false, ['encrypt', 'decrypt']) + + const jwkKey = S.keyToJwk(hash) + return await shim.subtle.importKey('jwk', jwkKey, {name:'AES-GCM'}, false, ['encrypt', 'decrypt']) } module.exports = importGen; })(USE, './aeskey'); @@ -563,7 +574,7 @@ bufiv = shim.Buffer.from(json.iv, opt.encode || 'base64'); bufct = shim.Buffer.from(json.ct, opt.encode || 'base64'); var ct = await aeskey(key, buf, opt).then((aes) => (/*shim.ossl ||*/ shim.subtle).decrypt({ // Keeping aesKey scope as private as possible... - name: opt.name || 'AES-GCM', iv: new Uint8Array(bufiv) + name: opt.name || 'AES-GCM', iv: new Uint8Array(bufiv), tagLength: 128 }, aes, new Uint8Array(bufct))); }catch(e){ if('utf8' === opt.encode){ throw "Could not decrypt" } @@ -603,9 +614,11 @@ var pubKeyData = keysToEcdhJwk(pub); var props = Object.assign({ public: await ecdhSubtle.importKey(...pubKeyData, true, []) },S.ecdh); // Thanks to @sirpy ! var privKeyData = keysToEcdhJwk(epub, epriv); - var derived = await ecdhSubtle.importKey(...privKeyData, false, ['deriveKey']).then(async (privKey) => { + var derived = await ecdhSubtle.importKey(...privKeyData, false, ['deriveBits']).then(async (privKey) => { // privateKey scope doesn't leak out from here! - var derivedKey = await ecdhSubtle.deriveKey(props, privKey, { name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]); + var derivedBits = await ecdhSubtle.deriveBits(props, privKey, 256); + var rawBits = new Uint8Array(derivedBits); + var derivedKey = await ecdhSubtle.importKey('raw', rawBits,{ name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]); return ecdhSubtle.exportKey('jwk', derivedKey).then(({ k }) => k); }) var r = derived; @@ -646,6 +659,7 @@ SEA.verify = USE('./verify'); SEA.encrypt = USE('./encrypt'); SEA.decrypt = USE('./decrypt'); + SEA.aeskey = USE('./aeskey'); SEA.random = SEA.random || shim.random; diff --git a/sea/aeskey.js b/sea/aeskey.js index f003a38e..dcd4d560 100644 --- a/sea/aeskey.js +++ b/sea/aeskey.js @@ -1,5 +1,6 @@ var shim = require('./shim'); + var S = require('./settings'); var sha256hash = require('./sha256'); const importGen = async (key, salt, opt) => { @@ -7,7 +8,9 @@ var opt = opt || {}; const combo = key + (salt || shim.random(8)).toString('utf8'); // new const hash = shim.Buffer.from(await sha256hash(combo), 'binary') - return await shim.subtle.importKey('raw', new Uint8Array(hash), opt.name || 'AES-GCM', false, ['encrypt', 'decrypt']) + + const jwkKey = S.keyToJwk(hash) + return await shim.subtle.importKey('jwk', jwkKey, {name:'AES-GCM'}, false, ['encrypt', 'decrypt']) } module.exports = importGen; \ No newline at end of file diff --git a/sea/base64.js b/sea/base64.js index 5a87f29e..76b589e0 100644 --- a/sea/base64.js +++ b/sea/base64.js @@ -1,7 +1,9 @@ - if(typeof global !== "undefined"){ - var g = global; - g.btoa = function (data) { return Buffer.from(data, "binary").toString("base64"); }; - g.atob = function (data) { return Buffer.from(data, "base64").toString("binary"); }; + if(typeof btoa === "undefined"){ + if(typeof Buffer === "undefined") { + root.Buffer = require("buffer").Buffer + } + root.btoa = function (data) { return Buffer.from(data, "binary").toString("base64"); }; + root.atob = function (data) { return Buffer.from(data, "base64").toString("binary"); }; } \ No newline at end of file diff --git a/sea/buffer.js b/sea/buffer.js index 77915f1e..dd616ef0 100644 --- a/sea/buffer.js +++ b/sea/buffer.js @@ -14,7 +14,7 @@ Object.assign(SafeBuffer, { // (data, enc) where typeof data === 'string' then enc === 'utf8'|'hex'|'base64' from() { - if (!Object.keys(arguments).length) { + if (!Object.keys(arguments).length || arguments[0]==null) { throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') } const input = arguments[0] diff --git a/sea/decrypt.js b/sea/decrypt.js index 736fd4cc..1a68c938 100644 --- a/sea/decrypt.js +++ b/sea/decrypt.js @@ -17,7 +17,7 @@ bufiv = shim.Buffer.from(json.iv, opt.encode || 'base64'); bufct = shim.Buffer.from(json.ct, opt.encode || 'base64'); var ct = await aeskey(key, buf, opt).then((aes) => (/*shim.ossl ||*/ shim.subtle).decrypt({ // Keeping aesKey scope as private as possible... - name: opt.name || 'AES-GCM', iv: new Uint8Array(bufiv) + name: opt.name || 'AES-GCM', iv: new Uint8Array(bufiv), tagLength: 128 }, aes, new Uint8Array(bufct))); }catch(e){ if('utf8' === opt.encode){ throw "Could not decrypt" } diff --git a/sea/sea.js b/sea/sea.js index 57826cde..b7d6db7f 100644 --- a/sea/sea.js +++ b/sea/sea.js @@ -7,6 +7,7 @@ SEA.verify = require('./verify'); SEA.encrypt = require('./encrypt'); SEA.decrypt = require('./decrypt'); + SEA.aeskey = require('./aeskey'); SEA.random = SEA.random || shim.random; diff --git a/sea/secret.js b/sea/secret.js index 4a1c63ac..b53830b6 100644 --- a/sea/secret.js +++ b/sea/secret.js @@ -15,9 +15,11 @@ var pubKeyData = keysToEcdhJwk(pub); var props = Object.assign({ public: await ecdhSubtle.importKey(...pubKeyData, true, []) },S.ecdh); // Thanks to @sirpy ! var privKeyData = keysToEcdhJwk(epub, epriv); - var derived = await ecdhSubtle.importKey(...privKeyData, false, ['deriveKey']).then(async (privKey) => { + var derived = await ecdhSubtle.importKey(...privKeyData, false, ['deriveBits']).then(async (privKey) => { // privateKey scope doesn't leak out from here! - var derivedKey = await ecdhSubtle.deriveKey(props, privKey, { name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]); + var derivedBits = await ecdhSubtle.deriveBits(props, privKey, 256); + var rawBits = new Uint8Array(derivedBits); + var derivedKey = await ecdhSubtle.importKey('raw', rawBits,{ name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]); return ecdhSubtle.exportKey('jwk', derivedKey).then(({ k }) => k); }) var r = derived; diff --git a/sea/settings.js b/sea/settings.js index 8e68e8c5..2843bb0d 100644 --- a/sea/settings.js +++ b/sea/settings.js @@ -2,7 +2,7 @@ var SEA = require('./root'); var Buffer = require('./buffer'); var s = {}; - s.pbkdf2 = {hash: 'SHA-256', iter: 100000, ks: 64}; + s.pbkdf2 = {hash: {name : 'SHA-256'}, iter: 100000, ks: 64}; s.ecdsa = { pair: {name: 'ECDSA', namedCurve: 'P-256'}, sign: {name: 'ECDSA', hash: {name: 'SHA-256'}} @@ -18,6 +18,13 @@ if(d){ jwk.d = d } return jwk; }; + + s.keyToJwk = function(keyBytes) { + const keyB64 = keyBytes.toString('base64'); + const k = keyB64.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, ''); + return { kty: 'oct', k: k, ext: false, alg: 'A256GCM' }; + } + s.recall = { validity: 12 * 60 * 60, // internally in seconds : 12 hours hook: function(props){ return props } // { iat, exp, alias, remember } // or return new Promise((resolve, reject) => resolve(props) diff --git a/sea/shim.js b/sea/shim.js index 22ca351d..42716477 100644 --- a/sea/shim.js +++ b/sea/shim.js @@ -5,28 +5,26 @@ var o = {}; if(SEA.window){ - api.crypto = window.crypto || window.msCrypto; + api.crypto = window.crypto || window.msCrypto || require('isomorphic-webcrypto'); api.subtle = (api.crypto||o).subtle || (api.crypto||o).webkitSubtle; api.TextEncoder = window.TextEncoder; api.TextDecoder = window.TextDecoder; - api.random = (len) => Buffer.from(api.crypto.getRandomValues(new Uint8Array(Buffer.alloc(len)))) + api.random = (len) => Buffer.from(api.crypto.getRandomValues(new Uint8Array(Buffer.alloc(len)))); + } + if(!api.TextDecoder) + { + const { TextEncoder, TextDecoder } = require('text-encoding'); + api.TextDecoder = TextDecoder; + api.TextEncoder = TextEncoder; } if(!api.crypto){try{ var crypto = require('crypto', 1); - const { TextEncoder, TextDecoder } = require('text-encoding', 1) Object.assign(api, { crypto, - //subtle, - TextEncoder, - TextDecoder, random: (len) => Buffer.from(crypto.randomBytes(len)) - }); - //try{ - const { Crypto: WebCrypto } = require('@peculiar/webcrypto', 1); - api.ossl = api.subtle = new WebCrypto({directory: 'ossl'}).subtle // ECDH - //}catch(e){ - //console.log("node-webcrypto-ossl is optionally needed for ECDH, please install if needed."); - //} + }); + const isocrypto = require('isomorphic-webcrypto'); + api.ossl = api.subtle = isocrypto.subtle; }catch(e){ console.log("node-webcrypto-ossl and text-encoding may not be included by default, please add it to your package.json!"); OSSL_WEBCRYPTO_OR_TEXT_ENCODING_NOT_INSTALLED; diff --git a/test/sea/sea.js b/test/sea/sea.js index e4e5f70e..78530618 100644 --- a/test/sea/sea.js +++ b/test/sea/sea.js @@ -37,7 +37,12 @@ describe('SEA', function(){ var gun; var pub; describe('Utility', function(){ - + it('generates aeskey from jwk', function(done) { + SEA.aeskey('x','x').then(k => { + expect(k.data.toString('base64')).to.be('Xd6JaIf2dUybFb/jpEGuSAbfL96UABMR4IvxEGIuC74=') + done() + }) + }) it('quickstart', function(done){ SEA.pair(function(pair){ SEA.encrypt('hello self', pair, function(enc){ @@ -123,50 +128,15 @@ describe('SEA', function(){ });});});});});});});});});});});});});});});});});});});});});});});});});});}); }) - it('atypes', function(done){ + + it('DOESNT DECRYPT SCIENTIFIC NOTATION', function(done){ var pair, s, v; SEA.pair(function(pair){ - SEA.encrypt(null, pair, function(s){ + SEA.encrypt('4e2', pair, function(s){ SEA.decrypt(s, pair, function(v){ - expect(null).to.be(v); - SEA.encrypt(true, pair, function(s){ - SEA.decrypt(s, pair, function(v){ - expect(true).to.be(v); - SEA.encrypt(false, pair, function(s){ - SEA.decrypt(s, pair, function(v){ - expect(false).to.be(v); - SEA.encrypt(0, pair, function(s){ - SEA.decrypt(s, pair, function(v){ - expect(0).to.be(v); - SEA.encrypt(1, pair, function(s){ - SEA.decrypt(s, pair, function(v){ - expect(1).to.be(v); - SEA.encrypt(1.01, pair, function(s){ - SEA.decrypt(s, pair, function(v){ - expect(1.01).to.be(v); - SEA.encrypt('', pair, function(s){ - SEA.decrypt(s, pair, function(v){ - expect('').to.be(v); - SEA.encrypt('a', pair, function(s){ - SEA.decrypt(s, pair, function(v){ - expect('a').to.be(v); - SEA.encrypt([], pair, function(s){ - SEA.decrypt(s, pair, function(v){ - expect([]).to.eql(v); - SEA.encrypt([1], pair, function(s){ - SEA.decrypt(s, pair, function(v){ - expect([1]).to.eql(v); - SEA.encrypt({}, pair, function(s){ - SEA.decrypt(s, pair, function(v){ - expect({}).to.eql(v); - SEA.encrypt({a:1}, pair, function(s){ - SEA.decrypt(s, pair, function(v){ - expect({a:1}).to.eql(v); - SEA.encrypt(JSON.stringify({a:1}), pair, function(s){ - SEA.decrypt(s, pair, function(v){ - expect({a:1}).to.eql(v); + expect(400).to.be(v); done(); - });});});});});});});});});});});});});});});});});});});});});});});});});});}); + });});}); }) it('legacy', function(done){ (async function(){ @@ -364,4 +334,4 @@ describe('SEA', function(){ }) -}()); \ No newline at end of file +}()); From 512d2c8c320de00b3c52497044f48e02876670a8 Mon Sep 17 00:00:00 2001 From: sirpy Date: Sun, 8 Dec 2019 17:49:48 +0200 Subject: [PATCH 02/14] add: wait for once, so data is returned on first get (#6) * add: wait for once, so data is returned on first get * Update then.js --- sea.js | 7 ++++--- sea/then.js | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/sea.js b/sea.js index 2a4274ab..03fe9f34 100644 --- a/sea.js +++ b/sea.js @@ -710,9 +710,10 @@ ;USE(function(module){ var Gun = USE('./sea').Gun; - Gun.chain.then = function(cb){ + Gun.chain.then = function(cb, opt = {}){ + opt = {wait: 200, ...opt} var gun = this, p = (new Promise(function(res, rej){ - gun.once(res); + gun.once(res, opt); })); return cb? p.then(cb) : p; } @@ -1336,4 +1337,4 @@ // TODO: Potential bug? If pub/priv key starts with `-`? IDK how possible. })(USE, './index'); -}()); \ No newline at end of file +}()); diff --git a/sea/then.js b/sea/then.js index a97bcbc6..31facfd1 100644 --- a/sea/then.js +++ b/sea/then.js @@ -1,9 +1,10 @@ var Gun = require('./sea').Gun; - Gun.chain.then = function(cb){ + Gun.chain.then = function(cb, opt = {}){ + opt = {wait: 200, ...opt} var gun = this, p = (new Promise(function(res, rej){ - gun.once(res); + gun.once(res, opt); })); return cb? p.then(cb) : p; } - \ No newline at end of file + From dab91974c1306c55e83600267d7eaf5ec2e8980b Mon Sep 17 00:00:00 2001 From: Hadar Rottenberg Date: Mon, 13 Jan 2020 13:00:51 +0200 Subject: [PATCH 03/14] add: decrypt opposite of secret --- sea.js | 37 +++++++++++++++++++++++++++++++++++ sea/create.js | 54 +++++++++++++++++++++++++++++++++++++++++++++++---- sea/shim.js | 4 ++-- sea/then.js | 2 +- 4 files changed, 90 insertions(+), 7 deletions(-) diff --git a/sea.js b/sea.js index f6a4b45a..02f4ef8e 100644 --- a/sea.js +++ b/sea.js @@ -1087,6 +1087,43 @@ }()); return gun; } + + /** + * returns the decrypted value, encrypted by secret + * @returns {Promise} + */ + User.prototype.decrypt = function(cb) { + let gun = this, + path = '' + gun.back(function(at) { + if (at.is) { + return + } + path += at.get || '' + }) + return gun + .then(async data => { + if (data == null) { + return + } + const user = gun.back(-1).user() + const pair = user.pair() + let sec = await user + .get('trust') + .get(pair.pub) + .get(path) + sec = await SEA.decrypt(sec, pair) + if (!sec) { + return data + } + let decrypted = await SEA.decrypt(data, sec) + return decrypted + }) + .then(res => { + cb && cb(res) + return res + }) + } module.exports = User })(USE, './create'); diff --git a/sea/create.js b/sea/create.js index e0946b40..0b77e5a4 100644 --- a/sea/create.js +++ b/sea/create.js @@ -226,6 +226,7 @@ } // If authenticated user wants to delete his/her account, let's support it! User.prototype.delete = async function(alias, pass, cb){ + console.log("user.delete() IS DEPRECATED AND WILL BE MOVED TO A MODULE!!!"); var gun = this, root = gun.back(-1), user = gun.back('user'); try { user.auth(alias, pass, function(ack){ @@ -267,6 +268,7 @@ return gun; } User.prototype.alive = async function(){ + console.log("user.alive() IS DEPRECATED!!!"); const gunRoot = this.back(-1) try { // All is good. Should we do something more with actual recalled data? @@ -286,25 +288,32 @@ console.log(ctx, ev) }) } + user.get('trust').get(path).put(theirPubkey); + + // do a lookup on this gun chain directly (that gets bob's copy of the data) + // do a lookup on the metadata trust table for this path (that gets all the pubkeys allowed to write on this path) + // do a lookup on each of those pubKeys ON the path (to get the collab data "layers") + // THEN you perform Jachen's mix operation + // and return the result of that to... } User.prototype.grant = function(to, cb){ console.log("`.grant` API MAY BE DELETED OR CHANGED OR RENAMED, DO NOT USE!"); - var gun = this, user = gun.back(-1).user(), pair = user.pair(), path = ''; + var gun = this, user = gun.back(-1).user(), pair = user._.sea, path = ''; gun.back(function(at){ if(at.is){ return } path += (at.get||'') }); (async function(){ - var enc, sec = await user.get('trust').get(pair.pub).get(path).then(); + var enc, sec = await user.get('grant').get(pair.pub).get(path).then(); sec = await SEA.decrypt(sec, pair); if(!sec){ sec = SEA.random(16).toString(); enc = await SEA.encrypt(sec, pair); - user.get('trust').get(pair.pub).get(path).put(enc); + user.get('grant').get(pair.pub).get(path).put(enc); } var pub = to.get('pub').then(); var epub = to.get('epub').then(); pub = await pub; epub = await epub; var dh = await SEA.secret(epub, pair); enc = await SEA.encrypt(sec, dh); - user.get('trust').get(pub).get(path).put(enc, cb); + user.get('grant').get(pub).get(path).put(enc, cb); }()); return gun; } @@ -325,5 +334,42 @@ }()); return gun; } + + /** + * returns the decrypted value, encrypted by secret + * @returns {Promise} + */ + User.prototype.decrypt = function(cb) { + let gun = this, + path = '' + gun.back(function(at) { + if (at.is) { + return + } + path += at.get || '' + }) + return gun + .then(async data => { + if (data == null) { + return + } + const user = gun.back(-1).user() + const pair = user.pair() + let sec = await user + .get('trust') + .get(pair.pub) + .get(path) + sec = await SEA.decrypt(sec, pair) + if (!sec) { + return data + } + let decrypted = await SEA.decrypt(data, sec) + return decrypted + }) + .then(res => { + cb && cb(res) + return res + }) + } module.exports = User \ No newline at end of file diff --git a/sea/shim.js b/sea/shim.js index 42716477..83c4c539 100644 --- a/sea/shim.js +++ b/sea/shim.js @@ -26,8 +26,8 @@ const isocrypto = require('isomorphic-webcrypto'); api.ossl = api.subtle = isocrypto.subtle; }catch(e){ - console.log("node-webcrypto-ossl and text-encoding may not be included by default, please add it to your package.json!"); - OSSL_WEBCRYPTO_OR_TEXT_ENCODING_NOT_INSTALLED; + console.log("text-encoding and @peculiar/webcrypto may not be included by default, please add it to your package.json!"); + TEXT_ENCODING_OR_PECULIAR_WEBCRYPTO_NOT_INSTALLED; }} module.exports = api diff --git a/sea/then.js b/sea/then.js index 31facfd1..6e6ded1e 100644 --- a/sea/then.js +++ b/sea/then.js @@ -7,4 +7,4 @@ })); return cb? p.then(cb) : p; } - + \ No newline at end of file From 1f3b090f81c58cd6046a8ad2c40cd3a822a55351 Mon Sep 17 00:00:00 2001 From: Hadar Rottenberg Date: Tue, 11 Feb 2020 10:28:37 +0200 Subject: [PATCH 04/14] add: update dependencies --- package.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e31efe13..ed02f1ed 100644 --- a/package.json +++ b/package.json @@ -54,14 +54,17 @@ "node": ">=0.8.4" }, "dependencies": { - "buffer": "^5.4.3", "ws": "^7.1.2" }, "optionalDependencies": { "text-encoding": "^0.7.0", - "isomorphic-webcrypto": "^2.3.2", "emailjs": "^2.2.0" }, + "peerDependencies": { + "isomorphic-webcrypto": "^2.*", + "buffer": "^5.*", + "@gooddollar/react-native-webview-crypto": "^0.*" + }, "devDependencies": { "aws-sdk": "^2.528.0", "ip": "^1.1.5", From a72342431f49c383b72431f87f2e17968ec3e857 Mon Sep 17 00:00:00 2001 From: Hadar Rottenberg Date: Wed, 12 Feb 2020 09:54:04 +0200 Subject: [PATCH 05/14] add: update to use webview-crypto --- README.md | 12 ++++++++++++ sea.js | 4 ++-- sea/sea.js | 2 +- sea/shim.js | 4 ++-- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 433ca715..8c4e734c 100644 --- a/README.md +++ b/README.md @@ -199,6 +199,18 @@ var GUN = require('gun/gun'); var SEA = require('gun/sea'); ``` +## React Native +Like nodejs we need to shim webcrypto we do this with a webview bridge +isomorphic-webcrypto can also works but lacks in performance and has issues with encrypting large files +for window.crypto.getRandomValues you can use either react-native-crypto or react-native-get-random-values + +- `npm install buffer text-encoding react-native-webview-bridge react-native-get-random-values --save` +- follow instructions to install [WebviewCrypto](/saulshanabrook/react-native-webview-crypto) +- react might still complain about missing isomorphic-webcrypto although its not needed + so install it `npm i isomorphic-webcrypto` + +see working [example repo](/gooddollar/gun-expo-react-native) + ## Deploy > Note: The default examples that get auto-deployed on `npm start` CDN-ify all GUN files, modules, & storage. diff --git a/sea.js b/sea.js index dcb1b232..570e5faf 100644 --- a/sea.js +++ b/sea.js @@ -170,7 +170,7 @@ var o = {}; if(SEA.window){ - api.crypto = window.crypto || window.msCrypto || require('isomorphic-webcrypto'); + api.crypto = window.crypto || window.msCrypto api.subtle = (api.crypto||o).subtle || (api.crypto||o).webkitSubtle; api.TextEncoder = window.TextEncoder; api.TextDecoder = window.TextDecoder; @@ -191,7 +191,7 @@ const isocrypto = require('isomorphic-webcrypto'); api.ossl = api.subtle = isocrypto.subtle; }catch(e){ - console.log("text-encoding and @peculiar/webcrypto may not be included by default, please add it to your package.json!"); + console.log("text-encoding and isomorphic-webcrypto may not be included by default, please add it to your package.json!"); TEXT_ENCODING_OR_PECULIAR_WEBCRYPTO_NOT_INSTALLED; }} diff --git a/sea/sea.js b/sea/sea.js index b7d6db7f..276662fd 100644 --- a/sea/sea.js +++ b/sea/sea.js @@ -7,7 +7,7 @@ SEA.verify = require('./verify'); SEA.encrypt = require('./encrypt'); SEA.decrypt = require('./decrypt'); - SEA.aeskey = require('./aeskey'); + SEA.opt.aeskey = require('./aeskey'); // not official! SEA.random = SEA.random || shim.random; diff --git a/sea/shim.js b/sea/shim.js index 83c4c539..f15316dc 100644 --- a/sea/shim.js +++ b/sea/shim.js @@ -5,7 +5,7 @@ var o = {}; if(SEA.window){ - api.crypto = window.crypto || window.msCrypto || require('isomorphic-webcrypto'); + api.crypto = window.crypto || window.msCrypto api.subtle = (api.crypto||o).subtle || (api.crypto||o).webkitSubtle; api.TextEncoder = window.TextEncoder; api.TextDecoder = window.TextDecoder; @@ -26,7 +26,7 @@ const isocrypto = require('isomorphic-webcrypto'); api.ossl = api.subtle = isocrypto.subtle; }catch(e){ - console.log("text-encoding and @peculiar/webcrypto may not be included by default, please add it to your package.json!"); + console.log("text-encoding and isomorphic-webcrypto may not be included by default, please add it to your package.json!"); TEXT_ENCODING_OR_PECULIAR_WEBCRYPTO_NOT_INSTALLED; }} From e355d41f60cf3a1424090cc9d9e1fc0e98c9cf4e Mon Sep 17 00:00:00 2001 From: Hadar Rottenberg Date: Wed, 12 Feb 2020 10:22:36 +0200 Subject: [PATCH 06/14] refactor: remove duplicate --- test/sea/sea.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/test/sea/sea.js b/test/sea/sea.js index 36256456..6acbff36 100644 --- a/test/sea/sea.js +++ b/test/sea/sea.js @@ -141,16 +141,6 @@ describe('SEA', function(){ });});}); }) - /*it('DOESNT DECRYPT SCIENTIFIC NOTATION', function(done){ - var pair, s, v; - SEA.pair(function(pair){ - SEA.encrypt('4e2', pair, function(s){ - SEA.decrypt(s, pair, function(v){ - expect(400).to.be(v); - done(); - });});}); - })*/ - it('legacy', function(done){ (async function(){ var pw = 'test123'; // https://cdn.jsdelivr.net/npm/gun@0.9.99999/sea.js ! From 5a1f8350cb2e734193371d5cb1f3d6b7352dfcf7 Mon Sep 17 00:00:00 2001 From: Hadar Rottenberg Date: Wed, 12 Feb 2020 10:27:00 +0200 Subject: [PATCH 07/14] fix: match amark master --- test/sea/sea.js | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/test/sea/sea.js b/test/sea/sea.js index 6acbff36..1a166804 100644 --- a/test/sea/sea.js +++ b/test/sea/sea.js @@ -130,8 +130,53 @@ describe('SEA', function(){ });});});});});});});});});});});});});});});});});});});});});});});});});});}); }) + it('atypes', function(done){ + var pair, s, v; + SEA.pair(function(pair){ + SEA.encrypt(null, pair, function(s){ + SEA.decrypt(s, pair, function(v){ + expect(null).to.be(v); + SEA.encrypt(true, pair, function(s){ + SEA.decrypt(s, pair, function(v){ + expect(true).to.be(v); + SEA.encrypt(false, pair, function(s){ + SEA.decrypt(s, pair, function(v){ + expect(false).to.be(v); + SEA.encrypt(0, pair, function(s){ + SEA.decrypt(s, pair, function(v){ + expect(0).to.be(v); + SEA.encrypt(1, pair, function(s){ + SEA.decrypt(s, pair, function(v){ + expect(1).to.be(v); + SEA.encrypt(1.01, pair, function(s){ + SEA.decrypt(s, pair, function(v){ + expect(1.01).to.be(v); + SEA.encrypt('', pair, function(s){ + SEA.decrypt(s, pair, function(v){ + expect('').to.be(v); + SEA.encrypt('a', pair, function(s){ + SEA.decrypt(s, pair, function(v){ + expect('a').to.be(v); + SEA.encrypt([], pair, function(s){ + SEA.decrypt(s, pair, function(v){ + expect([]).to.eql(v); + SEA.encrypt([1], pair, function(s){ + SEA.decrypt(s, pair, function(v){ + expect([1]).to.eql(v); + SEA.encrypt({}, pair, function(s){ + SEA.decrypt(s, pair, function(v){ + expect({}).to.eql(v); + SEA.encrypt({a:1}, pair, function(s){ + SEA.decrypt(s, pair, function(v){ + expect({a:1}).to.eql(v); + SEA.encrypt(JSON.stringify({a:1}), pair, function(s){ + SEA.decrypt(s, pair, function(v){ + expect({a:1}).to.eql(v); + done(); + });});});});});});});});});});});});});});});});});});});});});});});});});});}); + }) - it('DOESNT DECRYPT SCIENTIFIC NOTATION', function(done){ + /*it('DOESNT DECRYPT SCIENTIFIC NOTATION', function(done){ var pair, s, v; SEA.pair(function(pair){ SEA.encrypt('4e2', pair, function(s){ @@ -139,7 +184,7 @@ describe('SEA', function(){ expect(400).to.be(v); done(); });});}); - }) + })*/ it('legacy', function(done){ (async function(){ var pw = 'test123'; From d15721c46dddfbca0fc92dd7e0165fadee9b92d8 Mon Sep 17 00:00:00 2001 From: sirpy Date: Wed, 12 Feb 2020 10:30:26 +0200 Subject: [PATCH 08/14] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8c4e734c..bba1fae3 100644 --- a/README.md +++ b/README.md @@ -205,11 +205,11 @@ isomorphic-webcrypto can also works but lacks in performance and has issues with for window.crypto.getRandomValues you can use either react-native-crypto or react-native-get-random-values - `npm install buffer text-encoding react-native-webview-bridge react-native-get-random-values --save` -- follow instructions to install [WebviewCrypto](/saulshanabrook/react-native-webview-crypto) +- follow instructions to install [WebviewCrypto](saulshanabrook/react-native-webview-crypto) - react might still complain about missing isomorphic-webcrypto although its not needed so install it `npm i isomorphic-webcrypto` -see working [example repo](/gooddollar/gun-expo-react-native) +see working [example repo](gooddollar/gun-expo-react-native) ## Deploy From 40b47a26216f7e04b7d9ca46913d8074c2f375c9 Mon Sep 17 00:00:00 2001 From: sirpy Date: Wed, 12 Feb 2020 10:32:35 +0200 Subject: [PATCH 09/14] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bba1fae3..8f2b6d60 100644 --- a/README.md +++ b/README.md @@ -205,11 +205,11 @@ isomorphic-webcrypto can also works but lacks in performance and has issues with for window.crypto.getRandomValues you can use either react-native-crypto or react-native-get-random-values - `npm install buffer text-encoding react-native-webview-bridge react-native-get-random-values --save` -- follow instructions to install [WebviewCrypto](saulshanabrook/react-native-webview-crypto) +- follow instructions to install [WebviewCrypto](https://github.com/saulshanabrook/react-native-webview-crypto) - react might still complain about missing isomorphic-webcrypto although its not needed so install it `npm i isomorphic-webcrypto` -see working [example repo](gooddollar/gun-expo-react-native) +see working [example repo](https://github.com/gooddollar/gun-expo-react-native) ## Deploy From 72c699f20bce967efcecc1b37504efa8b2cf3387 Mon Sep 17 00:00:00 2001 From: Hadar Rottenberg Date: Wed, 12 Feb 2020 21:07:24 +0200 Subject: [PATCH 10/14] add: restore old crypto package, isomorphic changes things in react-native --- package-lock.json | 955 ++++++++++++++++++++++++---------------------- package.json | 6 +- sea.js | 12 +- 3 files changed, 508 insertions(+), 465 deletions(-) diff --git a/package-lock.json b/package-lock.json index 35cb6e66..b10fb98b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,73 +4,149 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@peculiar/asn1-schema": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-1.0.3.tgz", + "integrity": "sha512-Tfgj9eNJ6cTKEtEuidKenLHMx/Q5M8KEE9hnohHqvdpqHJXWYr5RlT3GjAHPjGXy5+mr7sSfuXfzE6aAkEGN7A==", + "optional": true, + "requires": { + "asn1js": "^2.0.22", + "tslib": "^1.9.3" + } + }, + "@peculiar/json-schema": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.9.tgz", + "integrity": "sha1-t0bgRreHYHobKAT2RDf9olJ7PmI=", + "optional": true, + "requires": { + "tslib": "^1.10.0" + } + }, + "@peculiar/webcrypto": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.0.22.tgz", + "integrity": "sha1-na5lL85rrNnfFbyRlleXzuM632c=", + "optional": true, + "requires": { + "@peculiar/asn1-schema": "^1.0.3", + "@peculiar/json-schema": "^1.1.6", + "asn1js": "^2.0.26", + "pvtsutils": "^1.0.9", + "tslib": "^1.10.0", + "webcrypto-core": "^1.0.17" + } + }, + "@types/ip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/ip/-/ip-1.1.0.tgz", + "integrity": "sha1-rsT1v9SeSkxTtZDYjDbrB4gnp8A=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.1.tgz", + "integrity": "sha1-XX7Cp4mh93xZt60HG51Qvxq7/J4=", + "dev": true + }, + "@types/node": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.0.tgz", + "integrity": "sha1-tBfe2hjPhADyeHM0ma1VR+0avsQ=", + "dev": true + }, + "@types/uglify-js": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.4.tgz", + "integrity": "sha1-lr6uI99vVhhiqDC0KIpJ6GuqwII=", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "@types/ws": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.1.tgz", + "integrity": "sha1-uADyuK7mlOK1gRE2Q+INed07hVY=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "accepts": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "dev": true, "requires": { - "mime-types": "2.1.26", + "mime-types": "~2.1.11", "negotiator": "0.6.1" } }, "addressparser": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-0.3.2.tgz", - "integrity": "sha1-WYc/Nej89sc2HBAjkmHXbhU0i7I=" + "integrity": "sha1-WYc/Nej89sc2HBAjkmHXbhU0i7I=", + "optional": true }, "after": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true }, "ansi-colors": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha1-V9NbhoboUeLMBMQD8cACA5dqGBM=" + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=" + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", + "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "arraybuffer.slice": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=" - }, - "asmcrypto.js": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/asmcrypto.js/-/asmcrypto.js-0.22.0.tgz", - "integrity": "sha1-OPwUQIhNgCx7030dI8KyalzV0tI=" + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", + "dev": true }, "asn1js": { "version": "2.0.26", "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.0.26.tgz", - "integrity": "sha1-Cm1DUAD1VqlsYBKWnZcE2YG3ElE=", + "integrity": "sha512-yG89F0j9B4B0MKIcFyWWxnpZPLaNTjCj4tkE3fjbAoo0qmpGw0PYYqSbX/4ebnd9Icn8ZgK4K1fvDyEtW1JYtQ==", "requires": { - "pvutils": "1.0.17" + "pvutils": "^1.0.17" } }, "aws-sdk": { "version": "2.611.0", "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.611.0.tgz", "integrity": "sha1-sdo7xidANHIBsfpTtwCbMGsWJ94=", + "dev": true, "requires": { "buffer": "4.9.1", "events": "1.1.1", @@ -87,6 +163,7 @@ "version": "4.9.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, "requires": { "base64-js": "1.3.1", "ieee754": "1.1.13", @@ -96,45 +173,28 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true } } }, - "b64-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/b64-lite/-/b64-lite-1.4.0.tgz", - "integrity": "sha1-5iRC3hHx8hxg44t08RGsAkIoPT0=", - "requires": { - "base-64": "0.1.0" - } - }, - "b64u-lite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/b64u-lite/-/b64u-lite-1.1.0.tgz", - "integrity": "sha1-pYG335TL1L7Xy7Gf6ugWZU8LG/A=", - "requires": { - "b64-lite": "1.4.0" - } - }, "backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base-64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz", - "integrity": "sha1-eAqZyE59YAJgNhURxId2E78k9rs=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "base64-arraybuffer": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true }, "base64-js": { "version": "1.3.1", @@ -144,12 +204,14 @@ "base64id": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, "requires": { "callsite": "1.0.0" } @@ -157,62 +219,71 @@ "blob": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=" + "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=", + "dev": true }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=" + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true }, "buffer": { "version": "5.4.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", - "integrity": "sha1-P7ycaetxPTI+P8Gole7gcQwHIRU=", + "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "optional": true, "requires": { - "base64-js": "1.3.1", - "ieee754": "1.1.13" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, "callsite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=" + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "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" }, "dependencies": { "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -221,16 +292,18 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", + "dev": true, "requires": { - "string-width": "3.1.0", - "strip-ansi": "5.2.0", - "wrap-ansi": "5.1.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -238,47 +311,50 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=" - }, - "compare-versions": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.1.tgz", - "integrity": "sha1-JuH1zw1Ip37O1QRrn2e2thB1o5M=" + "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=", + "dev": true }, "component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true }, "component-inherit": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true }, "debug": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, "requires": { "ms": "0.7.2" } @@ -286,70 +362,79 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, "requires": { - "object-keys": "1.1.1" + "object-keys": "^1.0.12" } }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=" + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true }, "emailjs": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/emailjs/-/emailjs-2.2.0.tgz", "integrity": "sha1-ulsj5KSwpFEPZS6HOxVOlAe2ygM=", + "optional": true, "requires": { - "addressparser": "0.3.2", - "emailjs-mime-codec": "2.0.9" + "addressparser": "^0.3.2", + "emailjs-mime-codec": "^2.0.7" } }, "emailjs-base64": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/emailjs-base64/-/emailjs-base64-1.1.4.tgz", - "integrity": "sha1-OS+jjLaqNdzNOvNjf/wUwcfOlhI=" + "integrity": "sha512-4h0xp1jgVTnIQBHxSJWXWanNnmuc5o+k4aHEpcLXSToN8asjB5qbXAexs7+PEsUKcEyBteNYsSvXUndYT2CGGA==", + "optional": true }, "emailjs-mime-codec": { "version": "2.0.9", "resolved": "https://registry.npmjs.org/emailjs-mime-codec/-/emailjs-mime-codec-2.0.9.tgz", - "integrity": "sha1-0YRFG28uVcWGiw8KgtGP4rgvDJc=", + "integrity": "sha512-7qJo4pFGcKlWh/kCeNjmcgj34YoJWY0ekZXEHYtluWg4MVBnXqGM4CRMtZQkfYwitOhUgaKN5EQktJddi/YIDQ==", + "optional": true, "requires": { - "emailjs-base64": "1.1.4", - "ramda": "0.26.1", - "text-encoding": "0.7.0" + "emailjs-base64": "^1.1.4", + "ramda": "^0.26.1", + "text-encoding": "^0.7.0" } }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=" + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true }, "engine.io": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.5.tgz", - "integrity": "sha1-Tr5edcbcEj3uSv3Obl/c7SHrk/Y=", + "integrity": "sha512-j1DWIcktw4hRwrv6nWx++5nFH2X64x16MAG2P0Lmi5Dvdfi3I+Jhc7JKJIdAmDJa+5aZ/imHV7dWRPy2Cqjh3A==", + "dev": true, "requires": { "accepts": "1.3.3", "base64id": "1.0.0", + "cookie": "0.3.1", "debug": "2.3.3", "engine.io-parser": "1.3.2", - "ws": "1.1.5", - "cookie": "0.3.1" + "ws": "~1.1.5" }, "dependencies": { "ws": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", - "integrity": "sha1-y9nm514J/F0skAFfIfDECHXg3VE=", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "dev": true, "requires": { - "options": "0.0.6", - "ultron": "1.0.2" + "options": ">=0.0.5", + "ultron": "1.0.x" } } } @@ -357,7 +442,8 @@ "engine.io-client": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.5.tgz", - "integrity": "sha1-/n+2DLDc8vooWUiTKctZaN7esR8=", + "integrity": "sha512-AYTgHyeVUPitsseqjoedjhYJapNVoSPShbZ+tEUX9/73jgZ/Z3sUlJf9oYgdEBBdVhupUpUqSxH0kBCXlQnmZg==", + "dev": true, "requires": { "component-emitter": "1.2.1", "component-inherit": "0.0.3", @@ -368,7 +454,7 @@ "parsejson": "0.0.3", "parseqs": "0.0.5", "parseuri": "0.0.5", - "ws": "1.1.5", + "ws": "~1.1.5", "xmlhttprequest-ssl": "1.5.3", "yeast": "0.1.2" }, @@ -376,10 +462,11 @@ "ws": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", - "integrity": "sha1-y9nm514J/F0skAFfIfDECHXg3VE=", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "dev": true, "requires": { - "options": "0.0.6", - "ultron": "1.0.2" + "options": ">=0.0.5", + "ultron": "1.0.x" } } } @@ -388,6 +475,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", + "dev": true, "requires": { "after": "0.8.2", "arraybuffer.slice": "0.0.6", @@ -401,114 +489,120 @@ "version": "1.17.4", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", "integrity": "sha1-467fGXBrIOfCWUw1/A1XYFp54YQ=", + "dev": true, "requires": { - "es-to-primitive": "1.2.1", - "function-bind": "1.1.1", - "has": "1.0.3", - "has-symbols": "1.0.1", - "is-callable": "1.1.5", - "is-regex": "1.0.5", - "object-inspect": "1.7.0", - "object-keys": "1.1.1", - "object.assign": "4.1.0", - "string.prototype.trimleft": "2.1.1", - "string.prototype.trimright": "2.1.1" + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" } }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", + "dev": true, "requires": { - "is-callable": "1.1.5", - "is-date-object": "1.0.2", - "is-symbol": "1.0.3" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=" + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true }, "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "expo-random": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/expo-random/-/expo-random-8.0.0.tgz", - "integrity": "sha1-u8x6GJ0prptwmzamz4QlbCLMFvY=", - "requires": { - "base64-js": "1.3.1" - } + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, "requires": { - "locate-path": "3.0.0" + "locate-path": "^3.0.0" } }, "flat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha1-CQvsiwXjnLowl0fx1YjwTbr5jbI=", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, "requires": { - "is-buffer": "2.0.4" + "is-buffer": "~2.0.3" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=" + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.4", - "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" } }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=" + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.1.1" } }, "has-binary": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "dev": true, "requires": { "isarray": "0.0.1" } @@ -516,22 +610,26 @@ "has-cors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "has-symbols": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=" + "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=", + "dev": true }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=" + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true }, "ieee754": { "version": "1.1.13", @@ -541,163 +639,149 @@ "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=", - "requires": { - "loose-envify": "1.4.0" - } + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true }, "is-buffer": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha1-PlcvI8hBGlz9lVfISeNmXgspBiM=" + "integrity": "sha1-PlcvI8hBGlz9lVfISeNmXgspBiM=", + "dev": true }, "is-callable": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha1-9+RrWWiQRW23Tn9ul2yzJz0G+qs=" + "integrity": "sha1-9+RrWWiQRW23Tn9ul2yzJz0G+qs=", + "dev": true }, "is-date-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=" + "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true }, "is-regex": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", "integrity": "sha1-OdWJo1i/GJZ/cmlnEguPwa7XTq4=", + "dev": true, "requires": { - "has": "1.0.3" + "has": "^1.0.3" } }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc=", + "dev": true, "requires": { - "has-symbols": "1.0.1" + "has-symbols": "^1.0.1" } }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isomorphic-webcrypto": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/isomorphic-webcrypto/-/isomorphic-webcrypto-2.3.4.tgz", - "integrity": "sha1-bRjuf3lasvXp/XpbSJq6+e4uavU=", - "requires": { - "@peculiar/webcrypto": "1.0.22", - "asmcrypto.js": "0.22.0", - "b64-lite": "1.4.0", - "b64u-lite": "1.1.0", - "msrcrypto": "1.5.8", - "str2buf": "1.3.0", - "webcrypto-shim": "0.1.5" - } + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "jmespath": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=" + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", + "dev": true }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "4.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "json3": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=" + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, "requires": { - "chalk": "2.4.2" - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=", - "requires": { - "js-tokens": "4.0.0" + "chalk": "^2.0.1" } }, "mime-db": { "version": "1.43.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha1-ChLgUCZQ5HPXNVNQUOfI9OtPrlg=" + "integrity": "sha1-ChLgUCZQ5HPXNVNQUOfI9OtPrlg=", + "dev": true }, "mime-types": { "version": "2.1.26", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", "integrity": "sha1-nJIfwJt+FJpl39wNpNIJlyALCgY=", + "dev": true, "requires": { "mime-db": "1.43.0" } @@ -705,20 +789,23 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" } @@ -727,6 +814,7 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.2.tgz", "integrity": "sha1-XYmH4olAyviVen12ZLkQ3Fsv6iA=", + "dev": true, "requires": { "ansi-colors": "3.2.3", "browser-stdout": "1.3.1", @@ -757,290 +845,291 @@ "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.1" }, "dependencies": { "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true } } }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=" + "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", + "dev": true } } }, "ms": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" - }, - "msrcrypto": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/msrcrypto/-/msrcrypto-1.5.8.tgz", - "integrity": "sha1-vkGb5JRb8TTYr1Lp1Dvn+iYfShw=" + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true }, "node-environment-flags": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha1-+pMCdfW/Xa4YjWGSsktMi7rD12o=", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "dev": true, "requires": { - "object.getownpropertydescriptors": "2.1.0", - "semver": "5.7.1" + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" } }, "object-assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=" + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "dev": true }, "object-component": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true }, "object-inspect": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha1-9Pa9GBrXfwBrXs5gvQtvOY/3Smc=" + "integrity": "sha1-9Pa9GBrXfwBrXs5gvQtvOY/3Smc=", + "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, "requires": { - "define-properties": "1.1.3", - "function-bind": "1.1.1", - "has-symbols": "1.0.1", - "object-keys": "1.1.1" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, "object.getownpropertydescriptors": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", "integrity": "sha1-Npvx+VktiridcS3O1cuBx8U1Jkk=", + "dev": true, "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.17.4" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "options": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true }, "p-limit": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", "integrity": "sha1-YSebZ3IfUoeqHBOpp/u8SMkpGx4=", + "dev": true, "requires": { - "p-try": "2.2.0" + "p-try": "^2.0.0" } }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, "requires": { - "p-limit": "2.2.2" + "p-limit": "^2.0.0" } }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=" + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true }, "panic-client": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/panic-client/-/panic-client-1.0.2.tgz", "integrity": "sha1-4+yr3DQn6vELowviJZAaehGasXM=", + "dev": true, "requires": { - "bluebird": "3.7.2", - "is-promise": "2.1.0", + "bluebird": "^3.4.6", + "is-promise": "^2.1.0", "platform": "1.3.1", - "socket.io-client": "1.7.4" + "socket.io-client": "^1.4.5" } }, "panic-manager": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/panic-manager/-/panic-manager-1.2.0.tgz", "integrity": "sha1-0tvHdgIAMsWwEw0QW/vqewZnMh4=", + "dev": true, "requires": { - "isarray": "2.0.5", - "panic-client": "1.0.2", - "socket.io": "1.7.4", - "socket.io-client": "1.7.4" + "isarray": "^2.0.0", + "panic-client": "^1.0.0", + "socket.io": "^1.4.8", + "socket.io-client": "^1.4.8" }, "dependencies": { "isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha1-ivHkwSISRMxiRZ+vOJQNTmRKVyM=" + "integrity": "sha1-ivHkwSISRMxiRZ+vOJQNTmRKVyM=", + "dev": true } } }, "panic-server": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/panic-server/-/panic-server-1.1.1.tgz", - "integrity": "sha1-RNCZ04p8R17yekTxsgMmYRCydpY=", + "integrity": "sha512-TcR6M4LaqKjHvAKoAi46w2Y11KPJiMchAEqu00+tlOBxHR8AYvUCBvDLw4+j3MymApVHHWtluOzDaWxEYeGuVw==", + "dev": true, "requires": { - "bluebird": "3.7.2", - "panic-client": "1.0.2", - "socket.io": "1.7.4" + "bluebird": "^3.3.5", + "panic-client": "^1.0.0", + "socket.io": "^1.4.5" } }, "parsejson": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "dev": true, "requires": { - "better-assert": "1.0.2" + "better-assert": "~1.0.0" } }, "parseqs": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, "requires": { - "better-assert": "1.0.2" + "better-assert": "~1.0.0" } }, "parseuri": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, "requires": { - "better-assert": "1.0.2" + "better-assert": "~1.0.0" } }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "platform": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.1.tgz", - "integrity": "sha1-SSIQiSM1vTExwKCN2i2T7DVD5CM=" - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha1-UsQedbjIfnK52TYOAga5ncv/psU=", - "requires": { - "loose-envify": "1.4.0", - "object-assign": "4.1.1", - "react-is": "16.12.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } + "integrity": "sha1-SSIQiSM1vTExwKCN2i2T7DVD5CM=", + "dev": true }, "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true }, "pvtsutils": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.0.9.tgz", "integrity": "sha1-DrYQbyeHjMqlXn379r0sda9GHe4=", "requires": { - "tslib": "1.10.0" + "tslib": "^1.10.0" } }, "pvutils": { "version": "1.0.17", "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.0.17.tgz", - "integrity": "sha1-rePHTf5xeJRP5EgGYmvS4knZlr8=" + "integrity": "sha512-wLHYUQxWaXVQvKnwIDWFVKDJku9XDCvyhhxoq8dc5MFdIlRenyPI9eSfEtcvgHgD7FlvCyGAlWgOzRnZD99GZQ==" }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true }, "ramda": { "version": "0.26.1", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", - "integrity": "sha1-jUE1HrgRHFU1Nhf8O7/62OTTXQY=" - }, - "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha1-LMD+D7p0LZf9UnxCoTvsTusGJBw=" - }, - "react-native-securerandom": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/react-native-securerandom/-/react-native-securerandom-0.1.1.tgz", - "integrity": "sha1-8TBiOkEsM4sK+t7bwgTFy7i/IHA=", - "requires": { - "base64-js": "1.3.1" - } + "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==", + "optional": true }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=" + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true }, "sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", + "dev": true }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=" + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true }, "socket.io": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.4.tgz", "integrity": "sha1-L37O3DORvy1cc+KR/iM+bjTU3QA=", + "dev": true, "requires": { "debug": "2.3.3", - "engine.io": "1.8.5", + "engine.io": "~1.8.4", "has-binary": "0.1.7", "object-assign": "4.1.0", "socket.io-adapter": "0.5.0", @@ -1052,6 +1141,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", + "dev": true, "requires": { "debug": "2.3.3", "socket.io-parser": "2.3.1" @@ -1061,12 +1151,13 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.4.tgz", "integrity": "sha1-7J+CA1btme9tNX8HVtZIcXvdQoE=", + "dev": true, "requires": { "backo2": "1.0.2", "component-bind": "1.0.0", "component-emitter": "1.2.1", "debug": "2.3.3", - "engine.io-client": "1.8.5", + "engine.io-client": "~1.8.4", "has-binary": "0.1.7", "indexof": "0.0.1", "object-component": "0.0.3", @@ -1079,22 +1170,25 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "dev": true, "requires": { - "debug": "2.2.0", - "json3": "3.3.2", "component-emitter": "1.1.2", - "isarray": "0.0.1" + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" }, "dependencies": { "component-emitter": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=" + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", + "dev": true }, "debug": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, "requires": { "ms": "0.7.1" } @@ -1102,126 +1196,138 @@ "ms": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true } } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "str2buf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/str2buf/-/str2buf-1.3.0.tgz", - "integrity": "sha1-pBcq//QxDmcjUXjnOKLbtXOr6tA=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", + "dev": true, "requires": { - "emoji-regex": "7.0.3", - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "5.2.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, "string.prototype.trimleft": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", "integrity": "sha1-m9uKxqvW1gKxek7TIYcNL43O/HQ=", + "dev": true, "requires": { - "define-properties": "1.1.3", - "function-bind": "1.1.1" + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" } }, "string.prototype.trimright": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", "integrity": "sha1-RAMUsVmWyGbOigNBiU1FGGIAxdk=", + "dev": true, "requires": { - "define-properties": "1.1.3", - "function-bind": "1.1.1" + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" } }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true, "requires": { - "ansi-regex": "4.1.0" + "ansi-regex": "^4.1.0" } }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true }, "supports-color": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha1-ds/nQs8fQbubHCmtAwaMBbTA5Ao=", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "text-encoding": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz", - "integrity": "sha1-+JXoNuRZkGJAhmAXmOqY6PNu5kM=" + "integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==", + "optional": true }, "to-array": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true }, "ts-toolbelt": { "version": "6.1.13", "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.1.13.tgz", - "integrity": "sha1-EpNbyLgQUuXiHq3dNTcucTINfuM=" + "integrity": "sha1-EpNbyLgQUuXiHq3dNTcucTINfuM=", + "dev": true }, "ts-type": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/ts-type/-/ts-type-1.2.13.tgz", "integrity": "sha1-668v0DgmNY3uXyDniiLWqW2x95E=", + "dev": true, "requires": { - "ts-toolbelt": "6.1.13", - "typedarray-dts": "1.0.0" + "ts-toolbelt": "^6.1.6", + "typedarray-dts": "^1.0.0" } }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha1-w8GflZc/sKYpc/sJ2Q2WHuQ+XIo=" + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" }, "typedarray-dts": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/typedarray-dts/-/typedarray-dts-1.0.0.tgz", - "integrity": "sha1-neyYEThtv7qWTClcJgbPmmuYLQY=" + "integrity": "sha1-neyYEThtv7qWTClcJgbPmmuYLQY=", + "dev": true }, "uglify-js": { "version": "3.7.7", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.7.tgz", "integrity": "sha1-IeUsfczagKU7983mliin5RGuyck=", + "dev": true, "requires": { - "commander": "2.20.3", - "source-map": "0.6.1" + "commander": "~2.20.3", + "source-map": "~0.6.1" } }, "ultron": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true }, "url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "dev": true, "requires": { "punycode": "1.3.2", "querystring": "0.2.0" @@ -1230,63 +1336,66 @@ "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=" + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true }, "webcrypto-core": { "version": "1.0.17", "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.0.17.tgz", "integrity": "sha1-qTVLwLG6ZzXogvQTft4sQ2bmrZs=", + "optional": true, "requires": { - "pvtsutils": "1.0.9", - "tslib": "1.10.0" + "pvtsutils": "^1.0.9", + "tslib": "^1.10.0" } }, - "webcrypto-shim": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/webcrypto-shim/-/webcrypto-shim-0.1.5.tgz", - "integrity": "sha1-E+NKAQzMVE7ez+iiZCIEUChBvPA=" - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, "requires": { - "string-width": "2.1.1" + "string-width": "^1.0.2 || 2" }, "dependencies": { "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "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": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -1295,16 +1404,18 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=", + "dev": true, "requires": { - "ansi-styles": "3.2.1", - "string-width": "3.1.0", - "strip-ansi": "5.2.0" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "ws": { "version": "7.2.1", @@ -1314,161 +1425,89 @@ "wtf-8": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", - "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=" + "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", + "dev": true }, "xml2js": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha1-aGwg8hMgnpSr8NG88e+qKRx4J6c=", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, "requires": { - "sax": "1.2.4", - "xmlbuilder": "9.0.7" + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" }, "dependencies": { "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=" + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "dev": true } } }, "xmlbuilder": { "version": "9.0.7", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true }, "xmlhttprequest-ssl": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", - "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=" + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", + "dev": true }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=" + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true }, "yargs": { "version": "13.3.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", "integrity": "sha1-TGV6VeB+Xyz5R/ijZlZ8BKDe3IM=", + "dev": true, "requires": { - "cliui": "5.0.0", - "find-up": "3.0.0", - "get-caller-file": "2.0.5", - "require-directory": "2.1.1", - "require-main-filename": "2.0.0", - "set-blocking": "2.0.0", - "string-width": "3.1.0", - "which-module": "2.0.0", - "y18n": "4.0.0", - "yargs-parser": "13.1.1" + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" } }, "yargs-parser": { "version": "13.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", "integrity": "sha1-0mBYUyqgbTZf4JH2ofwGsvfl7KA=", + "dev": true, "requires": { - "camelcase": "5.3.1", - "decamelize": "1.2.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } }, "yargs-unparser": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", "integrity": "sha1-7yXCx2n/a9CeSw+dfGBfsnhG6p8=", + "dev": true, "requires": { - "flat": "4.1.0", - "lodash": "4.17.15", - "yargs": "13.3.0" + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" } }, "yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - }, - "@peculiar/asn1-schema": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-1.0.3.tgz", - "integrity": "sha1-5V/56Yoc8xgyYpqrrPhb4+3xOkg=", - "requires": { - "tslib": "1.10.0", - "asn1js": "2.0.26" - } - }, - "@peculiar/json-schema": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.9.tgz", - "integrity": "sha1-t0bgRreHYHobKAT2RDf9olJ7PmI=", - "requires": { - "tslib": "1.10.0" - } - }, - "@peculiar/webcrypto": { - "version": "1.0.22", - "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.0.22.tgz", - "integrity": "sha1-na5lL85rrNnfFbyRlleXzuM632c=", - "requires": { - "@peculiar/asn1-schema": "1.0.3", - "@peculiar/json-schema": "1.1.9", - "asn1js": "2.0.26", - "pvtsutils": "1.0.9", - "tslib": "1.10.0", - "webcrypto-core": "1.0.17" - } - }, - "@types/ip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@types/ip/-/ip-1.1.0.tgz", - "integrity": "sha1-rsT1v9SeSkxTtZDYjDbrB4gnp8A=", - "requires": { - "@types/node": "13.7.0" - } - }, - "@types/mocha": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.1.tgz", - "integrity": "sha1-XX7Cp4mh93xZt60HG51Qvxq7/J4=" - }, - "@types/node": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.0.tgz", - "integrity": "sha1-tBfe2hjPhADyeHM0ma1VR+0avsQ=" - }, - "@types/uglify-js": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.4.tgz", - "integrity": "sha1-lr6uI99vVhhiqDC0KIpJ6GuqwII=", - "requires": { - "source-map": "0.6.1" - } - }, - "@types/ws": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.1.tgz", - "integrity": "sha1-uADyuK7mlOK1gRE2Q+INed07hVY=", - "requires": { - "@types/node": "13.7.0" - } - }, - "@unimodules/core": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@unimodules/core/-/core-5.0.0.tgz", - "integrity": "sha1-4ePKP5Hz0n28k8buvAOkDHEdp1U=", - "requires": { - "compare-versions": "3.5.1" - } - }, - "@unimodules/react-native-adapter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@unimodules/react-native-adapter/-/react-native-adapter-5.0.0.tgz", - "integrity": "sha1-r5g1ghor84OQufCfMjHAt1Ru5RA=", - "requires": { - "invariant": "2.2.4", - "lodash": "4.17.15", - "prop-types": "15.7.2" - } + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true } } } diff --git a/package.json b/package.json index 2c24d716..bbec6456 100644 --- a/package.json +++ b/package.json @@ -59,11 +59,11 @@ }, "optionalDependencies": { "text-encoding": "^0.7.0", - "emailjs": "^2.2.0" + "emailjs": "^2.2.0", + "@peculiar/webcrypto": "^1.0.22", + "buffer": "^5.4.3" }, "peerDependencies": { - "isomorphic-webcrypto": "^2.*", - "buffer": "^5.*", "@gooddollar/react-native-webview-crypto": "^0.*" }, "devDependencies": { diff --git a/sea.js b/sea.js index 570e5faf..c5a5e03e 100644 --- a/sea.js +++ b/sea.js @@ -182,15 +182,19 @@ api.TextDecoder = TextDecoder; api.TextEncoder = TextEncoder; } - if(!api.crypto){try{ + if(!api.crypto) + { + try + { var crypto = USE('crypto', 1); Object.assign(api, { crypto, random: (len) => Buffer.from(crypto.randomBytes(len)) }); - const isocrypto = require('isomorphic-webcrypto'); - api.ossl = api.subtle = isocrypto.subtle; - }catch(e){ + const { Crypto: WebCrypto } = USE('@peculiar/webcrypto', 1); + api.ossl = api.subtle = new WebCrypto({directory: 'ossl'}).subtle // ECDH + } + catch(e){ console.log("text-encoding and isomorphic-webcrypto may not be included by default, please add it to your package.json!"); TEXT_ENCODING_OR_PECULIAR_WEBCRYPTO_NOT_INSTALLED; }} From 5016298b45186056509994ee686272d0e6ce5b78 Mon Sep 17 00:00:00 2001 From: Hadar Rottenberg Date: Wed, 12 Feb 2020 21:17:15 +0200 Subject: [PATCH 11/14] fix: typo --- sea.js | 2 +- sea/shim.js | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/sea.js b/sea.js index c5a5e03e..007e4de5 100644 --- a/sea.js +++ b/sea.js @@ -195,7 +195,7 @@ api.ossl = api.subtle = new WebCrypto({directory: 'ossl'}).subtle // ECDH } catch(e){ - console.log("text-encoding and isomorphic-webcrypto may not be included by default, please add it to your package.json!"); + console.log("text-encoding and peculiar/nwebcrypto may not be included by default, please add it to your package.json!"); TEXT_ENCODING_OR_PECULIAR_WEBCRYPTO_NOT_INSTALLED; }} diff --git a/sea/shim.js b/sea/shim.js index f15316dc..51626a07 100644 --- a/sea/shim.js +++ b/sea/shim.js @@ -17,16 +17,20 @@ api.TextDecoder = TextDecoder; api.TextEncoder = TextEncoder; } - if(!api.crypto){try{ + if(!api.crypto) + { + try + { var crypto = require('crypto', 1); Object.assign(api, { crypto, random: (len) => Buffer.from(crypto.randomBytes(len)) }); - const isocrypto = require('isomorphic-webcrypto'); - api.ossl = api.subtle = isocrypto.subtle; - }catch(e){ - console.log("text-encoding and isomorphic-webcrypto may not be included by default, please add it to your package.json!"); + const { Crypto: WebCrypto } = require('@peculiar/webcrypto', 1); + api.ossl = api.subtle = new WebCrypto({directory: 'ossl'}).subtle // ECDH + } + catch(e){ + console.log("text-encoding and peculiar/nwebcrypto may not be included by default, please add it to your package.json!"); TEXT_ENCODING_OR_PECULIAR_WEBCRYPTO_NOT_INSTALLED; }} From 947ee8455c862e845c8520df500c75f56892225d Mon Sep 17 00:00:00 2001 From: Hadar Rottenberg Date: Wed, 12 Feb 2020 21:25:58 +0200 Subject: [PATCH 12/14] add: update readme with example --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8f2b6d60..68015f6d 100644 --- a/README.md +++ b/README.md @@ -201,15 +201,16 @@ var SEA = require('gun/sea'); ## React Native Like nodejs we need to shim webcrypto we do this with a webview bridge -isomorphic-webcrypto can also works but lacks in performance and has issues with encrypting large files +isomorphic-webcrypto can also work but lacks in performance and has issues with encrypting large files +some of the performance issues are related to the javascript engine, which can be improved if switching to JIT +enabled versions of v8 or jsc + for window.crypto.getRandomValues you can use either react-native-crypto or react-native-get-random-values - `npm install buffer text-encoding react-native-webview-bridge react-native-get-random-values --save` - follow instructions to install [WebviewCrypto](https://github.com/saulshanabrook/react-native-webview-crypto) -- react might still complain about missing isomorphic-webcrypto although its not needed - so install it `npm i isomorphic-webcrypto` -see working [example repo](https://github.com/gooddollar/gun-expo-react-native) +see working [example repo](https://github.com/gooddollar/gun-webcrypto-react-native) ## Deploy From 6d05150ae8e45020263d1fd7fbd02d3baf27b813 Mon Sep 17 00:00:00 2001 From: sirpy Date: Wed, 18 Mar 2020 09:23:48 +0200 Subject: [PATCH 13/14] fix: remove undefined/unused variable --- sea.js | 1 - 1 file changed, 1 deletion(-) diff --git a/sea.js b/sea.js index 007e4de5..9e08d5f3 100644 --- a/sea.js +++ b/sea.js @@ -196,7 +196,6 @@ } catch(e){ console.log("text-encoding and peculiar/nwebcrypto may not be included by default, please add it to your package.json!"); - TEXT_ENCODING_OR_PECULIAR_WEBCRYPTO_NOT_INSTALLED; }} module.exports = api From 5372279fb298cea20ee37afe46c1a372dfb1c016 Mon Sep 17 00:00:00 2001 From: Hadar Rottenberg Date: Sat, 16 May 2020 23:21:29 +0300 Subject: [PATCH 14/14] add: asyncstorage for rad --- lib/ras.js | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 lib/ras.js diff --git a/lib/ras.js b/lib/ras.js new file mode 100644 index 00000000..d1553a78 --- /dev/null +++ b/lib/ras.js @@ -0,0 +1,40 @@ +;(function(){ + + /** + Radix AsyncStorage adapter + make sure to pass AsyncStorage instance in opt.AsyncStorage + **/ + function Store(opt){ + opt = opt || {}; + const store = () => { + const as = opt.AsyncStorage; + const put = (key, data, cb) => + { + as.setItem(''+key,data) + .then(_ => cb(null,1)) + .catch(_ => { + console.error(`failed saving to asyncstorage`,{key, data}) + cb(null,0) + }) + } + + const get = (key,cb) => { + as.getItem(''+key) + .then(data => cb(null,data)) + .catch(_ => { + console.error(`failed fetching from asyncstorage`,{key}) + cb(null,0) + }) + } + } + + return store; + } + + if(typeof window !== "undefined"){ + (Store.window = window).RasyncStorage = Store; + } else { + try{ module.exports = Store }catch(e){} + } + +}()); \ No newline at end of file