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 +}());