{"_id":"earthstar","_rev":"119-55cced4d973340da1326e32ec8f119ee","name":"earthstar","dist-tags":{"latest":"10.2.2","beta":"10.0.0-beta.8","experimental":"0.0.0-experimental-bxe4cbj6a3fit","alpha":"10.0.0-beta.1"},"versions":{"0.5.1":{"name":"earthstar","version":"0.5.1","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"scripts":{"clean":"rm -rf build/*.{js,ts} .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/*.test.js","test-sqlite":"tap -Rspecy --jobs=1 build/keywingStoreSqlite.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"better-sqlite3":"^7.0.1","chalk":"^3.0.0","tslib":"^2.0.0"},"gitHead":"f45b29241ccf8dfa5f23b1b814700370f0f8cdf9","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@0.5.1","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-OttNPWdzdJ0vMgRTnKUmVTh7e8xTF4SUZJAYSJXe+wtbO4uBmHaCiAV1CujAr0VIrewkKQz4vuVaAenR48UQTg==","shasum":"81cb255a4431a36b63e103227c7facedf9ae1f29","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-0.5.1.tgz","fileCount":33,"unpackedSize":231081,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJezc5aCRA9TVsSAnZWagAAKSEQAKTnJfTWzpswku5o1pED\nSwZUVtWrW8zyx9XQ8EjQd8+lnmnvLqpLkx4jyaTDYkBYGt/6iP/bdAbuYcZn\ngFAxV5dGuVDGQFf6m4L8lkX1chtcVVIM/06NWPYpBd+IqvWki/5+2wQLHc4U\nptVMYEDLwjaj2+brp36sHhWkftji36Xw1IjUkxCenq5lAtQ96Uy4bKgew4O6\nwE7EoyS8nOIf5W3vdmwZGRzF4mnI0CwZADAlfOJhnX+0a1HxnxHXkFmW8hxE\nm2J5N9kpuQhUC/wUQpW8sPO0SyR0eytREVcf0RjidNg4hlfTvJejjgYwwG3L\nX1tosBtbHNwANPS0//QbnyM0wfOQqadBt7fjRdpV9lVcKtzxvVW4Mkj4dpVu\nVQrt16bLsC4HGHKdSdVlToqntTNM36B9Ke6W7mINvGp/Eg6hPBJkqWHU1tPs\nv3le1yBWS9Efd7KH36DPK9UMmnSWuI27M/jQ2e7v6tTEDfKDe1eRwNKLnict\nyQpnCIP4IKIpuCwM4Kuq4DnopsAxLyPMA+YOBoJdoI1BYs9KUlp7MzzKf33W\n/zUWtjkcBzFy9EJKLoLsBdri/LJqYzpl7hfK4JVVF0Zs6gQnzch+G1StvfmF\n/DcVpDmZbuGIz4V0G5QCBboD7APbdXHmcev0DmkmPNxwaEvWG1VWr4bjIbvi\nSt5M\r\n=wR9Q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCJMwJSCHpdfsaTn9qm7KpwviKIoi9zMhsGuGvjBFIhngIhAIlgo2oACSG2h/llKNuD7S6HVrr1XkoNZifIXDIRPHeu"}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_0.5.1_1590546009607_0.04182468452873822"},"_hasShrinkwrap":false},"0.6.0":{"name":"earthstar","version":"0.6.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"scripts":{"clean":"rm -rf build/*.{js,ts} .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/*.test.js","test-sqlite":"tap -Rspecy --jobs=1 build/keywingStoreSqlite.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"better-sqlite3":"^7.0.1","chalk":"^3.0.0","tslib":"^2.0.0"},"gitHead":"4b110f356cd6e26bd87d063feb71d6b17595e0eb","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@0.6.0","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-R3JPddSQUsz2SwJ2ldvzUnY185t+uPXzDcd0/NajRjW9+F/VXDnhxxeDMapp6JLMlEQSbLLYyDjqQUW6Lw7EPQ==","shasum":"fd7a0484c81cb2a005970188deb2e5b967888dd6","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-0.6.0.tgz","fileCount":33,"unpackedSize":231081,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJezc6kCRA9TVsSAnZWagAA79oQAKOMcQgKzXe4a/zK7guq\n66fw5b4Cbt/TvUWnCuWdmRiwkYknj9Gt/JnqPvoaQqJRiYZ4fDn5xvqVxc+5\nvfaBl0NOtLLe3ftU0YByNPi0NbewrO5y7aUnwdBALDMxCbn/aRNl88GwKA7X\n2cUsQ+wlqjYroOeuOjWzIiDNhoSRrZbKAqbtrSUJXHvcra0wFDbAXGalAt/E\noXZeGBeqGOvs5Dpng7AD3DQq8ybZxK4+xsyXsgtvyncLGOj06oXIbtLMLjwT\nVfVSa+7Cm70wWBdb1rd9cceWyohZHNAyJbUcAtsQvUQpddtIUa55pkZZ2JDQ\nLLDkLH68xcLUzVRkRmPdNHBIbl+NRfJ5XrN3fhFdWfd3c/JZ7C2wVp54olAy\noLo0p5vlxZA6pHDeLz7SiGPkGyCh1N0mkZpMs9w16O5aTskK84STvQkS6xDR\nVBU1+7W/lj5aL2zYCWjxuZY/DKaR1e30w24zlCjMnUvfajVoJRzLLtH5X0eh\nXDsMsaIt36ZD8/zSx5xpRQWhh4eQ4nunHgVUwU1JdqzXSb5jHRm3HjFhLgJJ\nhBuNhy/zNyw5x/iqfvAR0Hhg4tnsHbcnVh47mHiho0GGcl7VcXBW2LwT9lj0\nNDWtRL4zimmVF5UyhSHrWYsKHI1BIg2XjiuaUV0PdvT5FFY+vpNI9GUVCRlK\ni7yk\r\n=5rXk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCnwbENHiNpefk0+TITL62SyZ055aVaFWSE5ynSqSbnKAIgfcFxSenWK+ekp85dpeBa/ZoxBh8aUBKLSZ0WaZFTyZo="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_0.6.0_1590546083994_0.622412575956004"},"_hasShrinkwrap":false},"0.6.1":{"name":"earthstar","version":"0.6.1","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"scripts":{"clean":"rm -rf build/*.{js,ts} .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/*.test.js","test-sqlite":"tap -Rspecy --jobs=1 build/keywingStoreSqlite.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"better-sqlite3":"^7.0.1","chalk":"^3.0.0","tslib":"^2.0.0"},"gitHead":"1c564bceab4b9a47b12aa5425fe16ad0d1be38c3","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@0.6.1","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-WnoFxurStQZmwwtY/o+33tternnaYQIWde9XJfiF1tfnCZE1ggoHtdWaYjouKweuFCFBgf7i5VFZCCZQqk6m4Q==","shasum":"f4bca6c5ad716452ed7b44debd20450ca2d4e85e","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-0.6.1.tgz","fileCount":34,"unpackedSize":257267,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJezdIGCRA9TVsSAnZWagAAH2YP/2DpX4gUb64Bw9AKz2ng\njMEYZbczAlZXmmKDyVQnpDzjNH5jUw4UoIEi0pkwLibuMeM+UvdFhfp+jyeS\nioagKe48JImGuNZwe9AcA0Adup/LV6AH+MT5KWrlGKPWBT5VXdQ9NIf3fFeU\nQoMaZW7MAq+oER7//VhTRuiFS/ZNNq6UxWPKN7bWyiSCyHArAY62DRDQyste\nrP/cc2sJ3y4NhXxVd6aD2rMZ7mw0DepGWB1zR6flsx+x+nS3OeIC9cANtweW\ns4lXx6K8L3cesI3pAIKSMzbNhCFkrwmtPLiOgQFGCgatpAkpIDE1S5zy7ZZ1\nlawtacYB1klV+2A3wJzLO6Qid20b0QQgQNCUNwJdoeHGn/jwZRrrjY8XAFTG\ny9ZSvcCrfLHFA1nhphlJIJD9BvIrQRHxCkEV/6p7yVK56tOLGbEQLy7uh9Hv\n7qAhbJQYzmV3MgOMuv4YkdF/cPx11PRN4oaLN8sK1gIgrIVFvMmGreB9RAB1\n9FG9TA1JZs4U2652OgAu/GyUJluITf2QeW0DYhNXHMnwqWGuI8nPUi18rrBM\nvoyjaYeFtgraD/4JYCwqKElC3ytdAudthXwoPBoEHQBbX56YFN3jv0Ppt5pR\nbMySitGOJwv3MO4JSQPYK3tCbuSfhQjKLC429v+lNMZ23YzYcvgRYBxzuITm\niYUh\r\n=qcjV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDTHMrDCmMlXBhD+y7MjhGtDp49E/0SaQroFNL6q48I/gIgLATKEUyQbl9PAZaRdSst4T/NXWHPca1xNGowvC3aiCA="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_0.6.1_1590546949800_0.6662037209826812"},"_hasShrinkwrap":false},"0.6.2":{"name":"earthstar","version":"0.6.2","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"scripts":{"clean":"rm -rf build/*.{js,ts} .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/*.test.js","test-sqlite":"tap -Rspecy --jobs=1 build/keywingStoreSqlite.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"better-sqlite3":"^7.0.1","chalk":"^3.0.0","tslib":"^2.0.0"},"gitHead":"ba8725e4daca3a51d4dca6bf594b96c139d4429a","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@0.6.2","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-hEk9lqim7GoEaxlvSCaRdqYRdx5Qs3lJDK8V2ZVkbP9JhTyc4R9ifdlnbklHYsSpnSNuaIkUOaZSrlCPWv0GaA==","shasum":"10764e19ebdee1c185b4f32e8925232e45575c1e","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-0.6.2.tgz","fileCount":35,"unpackedSize":467238,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJezdUgCRA9TVsSAnZWagAAc8YQAKP6Lni1vm9mlplJyMQd\njdaU9e7NHo0lKT44I0esOBbGwEaPztHGCIX5w7KavG0cypZW56QM3ObKraP9\nQ/VMHRRbLDlfgk3vJIes+QMJYLH6M/bo67EB7+16xXs9fi2lA54pX+dCQvnm\nc+Uv+Bo1PTSMCt40W05jtLr7uBaXAy0u/UO3NDnjywUMLmrVcZthmSe91Poh\nuh0YH3utN+5N1HJ1i+eEBDQY41v9MFslKeuH4NlwxZLRNa18H7E8erd/mC+K\nmasG9RAJffxcWoiFrJdfJONpiZZNLD8xM7bWJ5VsTStjMw/IugRG2gw7OMev\nx/M2pD4IC5wmZ7XjPtH/vBcX8o/MFwotanyLd7X7ZUmkH9bPnsfvAM3VPGZu\nE3nX1wU5LRAzC+thJ0YaM+5ZK7bgKPru7yiN1oQrflBsSMQMTr1BwleVvRoc\nHyfIJ1VcS63I5SEYR5fb4nTHNjF7JZO1oS627AywfC70aXP1lr/S9f78Ad8B\nN84tj/b/xkBTYEldsnfMtKoc5LXFMYSR9Fx4ddi/3i6DNRqA/va4pTBvDObg\ngL6uB6DlgIl5oEws3ZbknAOoNKWZsZq4dlE4UhGN8Sljldo/3f6wxrmkm2/L\nr7TCysW+Z8zSt66GYFSFSFZ5mGsHstqcHfqOefY4Wi0RozUlqdK1xx1AWbG2\naVBl\r\n=TteO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB3Li0ClcTrSBjFqlookpTCxyCmDQJxsad0uC1BSEwflAiBT6PaEMVZ1DGtioEikt6RBYz0UXTvrEJQNbhqR1edW0g=="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_0.6.2_1590547743877_0.7583922639424197"},"_hasShrinkwrap":false},"0.7.0":{"name":"earthstar","version":"0.7.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"scripts":{"clean":"rm -rf build/*.{js,ts} .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/*.test.js","test-sqlite":"tap -Rspecy --jobs=1 build/keywingStoreSqlite.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"better-sqlite3":"^7.0.1","chalk":"^3.0.0","tslib":"^2.0.0"},"gitHead":"89860c7fca00b2b8cf954417f57679f8a4441881","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@0.7.0","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-Bu0HQrZUp6539QC5wjRiyzTLfwpUd09zUPXKEAfUC3AuqpZ3W7UsIKPOb4ORPLJSP7KCMT8TK5pOFM9Tz39VDg==","shasum":"eb0b399c3b9f09794384d67b656894d54aae31af","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-0.7.0.tgz","fileCount":35,"unpackedSize":467971,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJezvPSCRA9TVsSAnZWagAAFAwQAJ5uTyipQuXEHU2d7gbg\nW47fjH0HwO1IbtAwoZtRe2SJ2itFOwoy09L7Z5gToAWvGusqis179p6nA/ZN\nOm5oUExlj0HYWwwFaqoMh3MFtFQMiu5qbW3XcDwWK578YaYofrM66cvvQRmD\nHwM3JUPg7ngIkMXObU+HR1b8ppHBtnT+QEUliqtOS/tdvYnIN1DACXonRPq8\ngDq2u2g58cbfmugU4Aim1LNjWLnBpPhcGL/HE5AeVavBQzCJZCQceMp0HQZx\nNrRYRz8MTeSh4TGbT5ltge4wBYz8LJqJ/SLlzO23moqaQjkxNhp02DYXRH6i\nO9YjMSg5/QFSX7e8uYKCwEhlENBaFZuOuKxH1OxcvohW5JFPNeTfkDfOa1I7\nLAUp6eNw1Jm5J0FURg9cdsbn2ujMjzp8l7IHmuviveDC3w1hHIGnrODnMB29\ni5UG+AEv0ikqrPsjw/0mvTITEA8zmz2/sT45Fj8Cc5pjCJ/yPlBg35jPaJgT\nrnE6/3j/rCdWvW3TeRKzhpt/1+ZzO7yDQCLQWWHC69/gM+Sdw+p7fvwkJcSB\nDy9Oos65mIzdYA2k+dV1lJ7iwngCGOKbrMCsZ2AwAsvgQ5vtWKtcNsVbj5TU\nf/tv0G7d03RMIYBvbueuAbEDeuRKBYa3uS3tlyrRfuNrnTBR+2Xkst6ajel9\nMQ+X\r\n=5k3r\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD2KIVaycKagDF2GS+g6VJFAd/YjbvtCz/sdkaiN3S7PQIhAPtZZrEFRm8aWxJ6IxVMZZNQduyMEyeb3obpQ6dA4SX2"}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_0.7.0_1590621138356_0.1828052156891995"},"_hasShrinkwrap":false},"0.8.0":{"name":"earthstar","version":"0.8.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/*.{js,ts} .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/*.test.js","test-sqlite":"tap -Rspecy --jobs=1 build/keywingStoreSqlite.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"better-sqlite3":"^7.0.1","chalk":"^3.0.0","tslib":"^2.0.0"},"gitHead":"7d295b6e6d2bd9043ccb5cf9ede7f9c7952a7ad6","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@0.8.0","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-XXbhJU6fAdJwM4fu+rUdfTk7rzLn1maV0+LBFc+v8rovlorXcXmhCKW6RmdOlQuUejLtUNUQ6Ci4JqjCUol0lQ==","shasum":"92c08b225a0f4594fc505c67901647a847ce68ae","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-0.8.0.tgz","fileCount":41,"unpackedSize":483380,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe0EnECRA9TVsSAnZWagAAs2gP/ismJpyJHa+G8k9J1d+P\naQ8UEIZK9gXvDTBck8dszQVzjxyLcFSriijuTh4H2gTw9auwyOg0naVLufvS\nHz/Er7+i4Q//lWsVX77YJbkDvXji8aa9H2AAhTAU/3htRCDZpwfTayuQ8dnF\nL18E0NYSqxb26csuvj0LiMxQMng9uFoVO3qXrNZXc/X8twj0JLYDv7Yk+9rQ\niFrt0ytV5gLQFRyVmAlijfch+pcG+g3H3ZEhvnZk4DXnC8CB1eSFGUeyPKaC\nZxbrnUp7LTHLNs0Qm1bRadLMSOYbKmBnsZpeOaGupLCa/S/yBjLmIjqMU5M3\n71ifV1j+s+eIa584wpotBK+ZqzdvjtCWycIBk/lBvo135o5RyJbOyuBAo2L+\naTuWgxK4dn/o3iZ0BlduC67yMFp+IPUVskhN5f28mRH/uPsrGKuozJ6bn6rM\nifuPdoLt9BiDF1ZTR2Wu3hESKjYaA9wvmH6NPRQ7CH0PYl3uV0V02IhnGlQM\naOYn6W78tD5DcakQdrm/8VBBY57DX/ifw6B0qqVsgCcmuPMaD1FOc0c7AoyT\n7UFXBDT7FV7wnAGWZO7MBGafLyXgPtnNtCkP1PiX/OoWS06q+jp7CYgbizg+\nooM3RXOUTUdnPrii6QoDNaB2rAQaHD2tY8CUOwUhfZoEhrYAuS2zbpWppzdo\nzPPX\r\n=2NtC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCcLvCWCvF7c6YvBdIHWsEAgSBAQHCFFqHOiPEN3pBDdwIgNkva2NOyTn0TqJjpWpOmIWwu/MCMG795QYZLRFFdTyc="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_0.8.0_1590708675728_0.7419489069912739"},"_hasShrinkwrap":false},"0.9.0":{"name":"earthstar","version":"0.9.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/*.{js,ts} .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/*.test.js","test-sqlite":"tap -Rspecy --jobs=1 build/keywingStoreSqlite.test.js","test-crypto":"tap -Rspecy --jobs=1 build/crypto.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"better-sqlite3":"^7.0.1","chalk":"^3.0.0","chloride":"^2.2.14","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"a59888136f033bd29bc76d740053f6cd66d82771","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@0.9.0","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-F1mD+QApj7v3pRV304GNqjNs/F3YE1h6vemztpFIrLrRtpWI3/K5CbR8seedBiQPLYpPxAxFpo7fA4/H/u99dg==","shasum":"f489574ca0d86bb7532b4612d90fbe97ec26f296","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-0.9.0.tgz","fileCount":57,"unpackedSize":491863,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe0aUICRA9TVsSAnZWagAAIBwQAJKvvt733AewoR2jGjtR\nS6tlXt6oP+jPeFE3cjvxAgnaqN6bNBZouJsRoWfxr2pMRJRKAWBs5+sXhdp6\nMiPS+U0RusSo353uRQ0y8A2Ag8bmo5qKXbSCPwgD2r5eGTZnnF/R3XxciABx\nNgbpZgRqd6KvXW4hkCGXqW7DVvRoRrn+mD8KN93BWnK9RidWzS8rdlA4QWhu\ns43Eg4e10IgVlvs5ex5XdaIj1FtmA+rpCf36rae4F0hHu/BYp1RxTQJQXPfG\nV9ITWoQAxe5UtSyaEf+XGyI8SU0fMsSFm86nE++A0hLwwSJHgkwwvJGb+feu\nZGy0rKrzv/i78dZfoyHomNtJlKeXQ5oLc26ARXGVHJddoXjAxI1jmcGsp5T+\nWl/LribBqcWDWTuiFrwuruviaq1cLEURdv1v0ggNPydiynrwX2wEOegjYqxe\nOPrTkQ31/Cwky7icx9qKSge4sDFOtut87JSen18YBauvCZQilNPzb2jFWobA\n8gT43bQrf36b7rXfeqacGv9mS5rCOzQzPjXpZ8M4mdvuWBDBDkxyW4NFf3/m\ngIvaQDOyHwHEpJol0w6AfdhRE3dy632f0hhpEr7RW8C7XFBAWtxAeKsYdztS\nRSbryXgF9wS+DDl1vpU0+pPFU+k6cnBqyILrVea5TMlXhdy5rRBCW5Rs2uw0\ngVeY\r\n=fDAs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG/p5Bk7JKGMxCxmW7DfDd++o9Ga6QfpFBpzkASybKObAiA6q2olicV5edYkgcXPp3a3EKysQGsU/WWdn608Rb8J0Q=="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_0.9.0_1590797576203_0.7093000384400936"},"_hasShrinkwrap":false},"0.9.1":{"name":"earthstar","version":"0.9.1","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/*.{js,ts} .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/*.test.js","test-sqlite":"tap -Rspecy --jobs=1 build/keywingStoreSqlite.test.js","test-crypto":"tap -Rspecy --jobs=1 build/crypto.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"better-sqlite3":"^7.0.1","chalk":"^3.0.0","chloride":"^2.2.14","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"ffcade0ec8e0143a7ab093c28633c76111b8fd47","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@0.9.1","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-xEyKMWNzJ2fQX/uLZj6QCgPZi/+Hg6pdGZ54tQO670HD8EowBm3pSA9DnKUmZ+/CT+LD/QvX2TKT/ht+8oYUag==","shasum":"cda7bf0ed27a721c86188b74988250ffe107079a","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-0.9.1.tgz","fileCount":60,"unpackedSize":496919,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe1HYsCRA9TVsSAnZWagAAgjsP/2iR55FxwLryCkUW14wn\noS5ft2RGqcdhnpytlglpA3OE+EPgxp3xKQk7hpe1vPvwxRMk3QxC80DF4Lmu\nHHIfA+nhZCS1sJpwSChuMZrsGRxtb6YYuLSA4uh0RdkDRbSiiXjSflcKeQ15\ngRfYwbGIwbfhcHaIWbFX9zxOyz57PMV5/Y4hxr60olZ8rrNuOtXROIjkIExQ\nJT/LLzVTXv/Xy4V7fItfyU+nHQrZUsL6dVvFwCVUHhQkfxEZeNp5cJy/UDyV\nl/y/hd7Yp/WenqROGSsWQHVcp+6HcR+djrhYfL4BcPBDeVgyptc0rZSbxDu9\niiCjWZG3KtjstOfuor5dvGtmq4GEyoXY+ZS99uBxpeXI91/008lCfLCmJAEh\n6BUOdRWQIiggQMRxDtbjAm/TyU5HFDTU+9uUvl2XEyC9cR8uFVCTcOljAfWi\nnWia5boPKTWEAG524j6ScwRv2SgJz6WLvkjbNRu7mSUE/sL3F6Ar3dRNV1wl\nOAyulOUv3akZCRSC5MkywAhyjMRUT/G5jwF0j6W+Ms7TBAUwF8iAyBokC1FI\n2rR2CZRF33Y8KNkQSAGherTMTB6il8tJI7+9SrnB+OqShaeG6wb6/BCgjc2o\nJmrGqk8DEU05Kfq4FKf5sZs5P+/dx1j8gFF2d9hzyF3ULixCS0xVOnmWRQ36\n0maW\r\n=to0Y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDdL+V7Hm34JIl3Ed/bjg/ZALms+fVR5zdARax1LHdRXQIhAPXloRwLjz0GsAEm7BGMyD1ICdpG6STbCOnbjHqzL3IN"}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_0.9.1_1590982187680_0.7962092096543778"},"_hasShrinkwrap":false},"1.0.0":{"name":"earthstar","version":"1.0.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-addresses":"tap -Rspecy --jobs=1 build/test/addresses.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es2.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","better-sqlite3":"^7.0.1","chalk":"^3.0.0","chloride":"^2.2.14","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"a7cca1cc2a195a2c675d70eee6be3f9077aedddb","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@1.0.0","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-wIHD/3Hp5nUfIWA7vvaervgFS/yVlVVIp4GdnaGaWK+YzyaGtGabUFc8+Nt837FcBsufaUS45/aa0jOsduEqag==","shasum":"95eeaf8f66ed14f144ffac0098948cad6b76d2c8","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-1.0.0.tgz","fileCount":90,"unpackedSize":595870,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe4ryQCRA9TVsSAnZWagAAJooP/1qbgKqLcLb596Xmh6em\nTe1oCNXhVeze/9BS8W/6CxIaoC6ey1jpVOcg1cm/PKdjyXSBOt7ZJidrd41N\ndgfZXvwHsQB3NDPJVoDp15fMUjkju08MV9/iGZYU/hYE8gjVuiFzcmi/rJPj\ni500k8tPMZ735FrBTnlFZnhI2bSaHHtVLnROy6yKUTp4cXBgxu8JhZiKZhQT\nu4YByTHTzzRDsS4huYW66aN87yPV1ClJn/k7zJ7peN+EcCvfA4AqsUT3JCcI\n7B7fQBiBA2xMzNrLffioJqgSY3EjuIflNzyWJqdOu1lg6nuzzBlsaAR3CD0n\nVWu5k1fFX9RmTZGCrkNWtOa3YW0/IHnOQ4czCpXf7I7sqHnj5nvpu5WnbtMi\n2TuZQsfSgHaEsXUBsXb6fIP0qeino6dRVIEXx89X+MSeZDVaYf3aKmftbXQ3\nVGAL5NRTSaBMnhvDU5Vz2+m9Jxopz8efOgb72qZZSZsb5w7+f7w1EuF4klRT\nV28HkgvIwhdVATn/xlyPEvPEiz4YMTv8vM0OsJ3l7LxgzggfKGsFOxeLPugm\nsW6AlBWRYhF+qDtw7gLKOyyYrzetPhOezfBDMXcD4zDjVtYZv1/9/8HU37n0\nsUo7PUQ8JDGWLMNtpp1MQ/upze3Fu5zEoTx7bQMPx1ntBJUp4ghoirsK3QL3\nYd00\r\n=CjMw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFObfLlBYocqyzGds5lBCPULuw+Wr/CR+ZnbsWPQCZshAiEAv6mpxm0j4lHgtMOwDnJ3g/4IDIioozjqHWynoET6RPk="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_1.0.0_1591917712221_0.933422773631934"},"_hasShrinkwrap":false},"1.1.0":{"name":"earthstar","version":"1.1.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-addresses":"tap -Rspecy --jobs=1 build/test/addresses.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es2.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","better-sqlite3":"^7.0.1","chalk":"^3.0.0","chloride":"^2.2.14","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"e00a197acb0805b9a7f1f633ba9b5ef31f3bc779","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@1.1.0","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-S6jh19C1LIKy30FzzOtO0ZZ52dSz3yqbq9HvfI35NuTzeP23xoRRcOdg7EFy+UmApzBzzQXIQHmN+nTM6e/+Tw==","shasum":"cf88005c02c3c3b5efedbcfb14156993948229c8","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-1.1.0.tgz","fileCount":90,"unpackedSize":595968,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe5Bt+CRA9TVsSAnZWagAAXwcP/0EFnmmn+SxqloEkGDD6\nHw2UDYPoSx8QAqo+v+D8SKgAfWdtd2nvNDBf71bmwbIEY1LxNzKX3y6qQo+Z\nnmsXDY3Hj2dI2gvj/6L40pzV3wXs+3fwqfNI06BXJYsCLwzXyYomQwL8vy4I\n6EMHsXlgm1g2pKQYnLLaW8dAONY59HMY8OgxAs2pEJEhlaEc5M/uuczo5BHj\nZUVY9t2PQB0A2Bd63aMeQrSfLMhoKSiKWlGMuM3q+4hJrIFHF5xFM4KfYOp9\nWzRjqbR8hZYYd7nvp3NfiBFmPeYc9OJ9zOLSm7pC9BdNtZRJ4TvwFRI4r9tP\ni30OHe4bZR0VC1LDKBawWmR4EXm8x45ezKKB1nFVu1sAuPxkYCrhL6afrSlE\nrxD/Pb4Iadr4wgv4/KOtANm10pl9Er00fdaPI6pxLeNGT2Uxzya8d5YU++Fg\nUFgshiMrg/c4B9QFU87ZtK+wAxbFxJnXwIVZrRNjy/Kx1V6jq5rlqzGGSHRn\nWOs/kz8zd/AKzrtMbpu71GAgqPyM27ZeRIspjiTnYosUvwKJwBE6U54p9fes\nYwJrHS6RRG5z9uvAm2P7JcMPAoKeRjN/G+KRmbimZ8L2edvlX0gRmSI+wUaf\n2icq3H3ZJYf0X2eA4gs9g/pzxqkHk2oIdS2e/TwtXA1/CyHcA8ebJlfDWJzS\ni7iw\r\n=ax2m\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCIFYTXYb0ZRZurRnfUGgan6/AI683iwX8AnHj0Tn7SNQIgXGvvilFK4TwzOSlJw4BbErQp0qO897U7LLuFbHB4GwY="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_1.1.0_1592007550027_0.44161372948697974"},"_hasShrinkwrap":false},"1.1.1":{"name":"earthstar","version":"1.1.1","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-addresses":"tap -Rspecy --jobs=1 build/test/addresses.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es2.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","better-sqlite3":"^7.0.1","chalk":"^3.0.0","chloride":"^2.2.14","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"e5733577c7e32fc817a668d35ad7c47e98fae4b6","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@1.1.1","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-DRfc/1aVho/r5UvSFYfRTwgXn9QgZdmHrQq/yoPmL8gwpKmaIcTqKeo4LYumtAxEKVbpSQfEZgitND9S6fo9VA==","shasum":"6833a98f92254bc2ae1191eab1f68725c2f94432","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-1.1.1.tgz","fileCount":90,"unpackedSize":603853,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe5Tm6CRA9TVsSAnZWagAAOCoP/jE/6Hb+7/eZI4dTphvN\npbf5bahjUV/X+eFtF2x+snLX0+zBxazdE1VNN1XWfudYtKzCEjuMEyuO5L5R\nnRmVVxXhEsDjZ65M0fGIvkllc7AaMffQQBCImmFgc7/sOBfKCIBJcKvWPfoN\nU9Y81xycq6ygZAFqJTKYNJ7u9gUhghLD0DDyW6+4BxA1zHJqfnupZ5u9rcud\nV/4cqg6ukvsIFSHgeglk5aev+9016KTQDnZjHjHdoBirn+FpprmtE/lMiv3D\npu0pWj3VCMpbQb2PgqwgNfL5LAzm6MsL2AG4f6Cgrajx2ZAjD8TeXpwOQj8V\n2aBBzJ8kIhJMs+o92PSYD4GrDTKjVMeeNZGl5o74yNuxJP3elbBolRtXTytm\nd8DB4WjFXS7tbvTVGRMW6OPydfh4AjlMF5Tjg9t6xW86PzwWoNk1cKH4XjNh\nPMvsOApg3Xsfapqitb6D7vC7gGXQupezQumpSUAOTucaGrrJrjF37Gq1CPqL\nala1J612kzQq2tr8LJBWr/Aa7pfTznnmTINtjtQt5enpFRqJLDBePIS3ZhNP\nPYjt71WqEVjIbJapeta/6IRTAjjHhQtf9ManulSdeU2Yr5V5BPm7B9sixeEc\nRJZ0vMhjV4MDdEZBzUG0xAiVESAU40Ag5w2+5KipybEbL0CrIymkMyIy/J7X\n3ZgQ\r\n=D9k1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH+XFPgRinLEsrwr1v2gw1LS/A7dAER0r9SqtOOawBAaAiEA9psFBoBfq2DS4PGGvWXwmxhoZEtrDFu/Klf7WZ5L1lk="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_1.1.1_1592080825299_0.11481798074754468"},"_hasShrinkwrap":false},"1.1.2":{"name":"earthstar","version":"1.1.2","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-addresses":"tap -Rspecy --jobs=1 build/test/addresses.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es2.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","better-sqlite3":"^7.0.1","chalk":"^3.0.0","chloride":"^2.2.14","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"da2ff2120f28fb912b3266b7c0bcb062e63642e3","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@1.1.2","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-RjP0B+5VKYsYohh5fHqSvmt52JuJJt6INv3X41QfrpR0XTdvVSaAEz55W+E3kezQ3uePtImjh2iy0v2KoLXo+w==","shasum":"a940935131567c4d9a94f34f72651930e821cc12","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-1.1.2.tgz","fileCount":90,"unpackedSize":604631,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe57OVCRA9TVsSAnZWagAAkDgP/A33g7DBkpbboAWjEiiY\nfJFRv4N8peA4TlqQ9uQ1gFAFE1C5H36IT0gcQlcjxMC8Gg90yq8bxHLKCMBL\nKxTxeDsS1Ap9bdjchz2mfFu6meHb2dR7qDuzh+E19TP0LCEn7J9LGW+S4hv9\nDdYYCQrdOCl3AuyDI2A5alq1PtlQgvEilw8UaidzzmfYzNpmZTqYEI9CflIZ\nrGPyp7wocX2Jy39HfxQOIcpR+wUWxlsZtxqNdk4edOZIP/fPBYhk5WGt89uC\n1AHUWxVb3vUgluYvIdtncc0MrVjMM1Q6L7duyIB492B6ldBujL+jTWZEjPNc\nb7sWSy5Tzccj+0kWM45ObVbhWhRjNFy0ngCLwtSEfsXwT/aDdHVX+UfZqPBR\nnCerQTx8zeQLHITH0f52zAXAEQ9GCovrP8d5ejMKZuHXivj4QuzhTXwvGgrC\noOULWPo5OkK6xHpzgmvKT+bsFiekYgzrE5CWjQelhVKH6EppSWJsVzMu2MUp\nFyt53IsH1jw9swxpX66MtA2X9Etitd+zLBy+NhiFxRuvOfxfdI5vWIWEbL4+\ncogg3Y65NbUejaGC+BMPwQE1/9sgJmeDfhjrV3ArbDs5TGLtXSkVjDc2vK0M\nJDLIO3JthQgtqtY5rWf9IRmKEAgDVATVY22yo/w+cy08ewVryYqzTyKNFtO0\nfdVM\r\n=Se/X\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICQm4onOIktbaHAvkqh7S97ZSh0oH9lyHPdIpTz0JCJcAiEA13gpL8kxo6GLC5FsFQxo3ZhQgxnuKRU1zth5b9Bo7cg="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_1.1.2_1592243093007_0.1950204592615843"},"_hasShrinkwrap":false},"1.2.0":{"name":"earthstar","version":"1.2.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-addresses":"tap -Rspecy --jobs=1 build/test/addresses.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es2.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","better-sqlite3":"^7.0.1","chalk":"^3.0.0","chloride":"^2.2.14","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"e17b5f4373981e8dfc6f6b1b121e557e0c764ccc","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@1.2.0","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-RqoyK8/7J2/svEQka99/9mD5tdano1JNthPFcXS/uKBarAmcBKnS9rp1iluYxRL9Xi/fcBCvPJfwUH5+A/+Faw==","shasum":"1d7e350cd4a60b9692d5aae09cb4d0914d39e15f","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-1.2.0.tgz","fileCount":90,"unpackedSize":620625,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe6Yz9CRA9TVsSAnZWagAAa1gP/RTGQ88CsGKy1NpaSfhi\n2dN1lTzytRSCmMDaHrFiZts327zyswhSuVGsL6jddAVzzuxs8cQT/iI+ZSE/\nV3CrmX1PSyBKlOMfX16BUrWkr4bKGanoGwvnFyM+XCv4ANdqHc+H1UK1Idlh\njxy49IxKTRedbWUYaHQlWCnwl3Ke5zm1kfuYW6fpBHoafff6nUpj0APLxRJf\n3K7VSRcL6fq5HBxx33jiltaIPqVlunxDlN4YDm+iHrWNN/mAuC4J9k9glFer\nxdna9tAMXPwGMt9cYR88p48yUaRdTlCRtQFtMYgXzYaAPi5wzrNTKx59YW0n\n4oSVYM7ZNMwMi1CNxxQmiOawZg5kxfC88swStuqwxdtETUy5Yb/WAz+WvKuU\nNHG1CRKoFeHdYduj+R91KjwHhTt1+dvZPLePv8E5vls62CTcOZFR37zQ5+dw\nJpZweS6LtSWVQuv7F0EnkJfCxrfjdqfzbJXrw9wvLrl6zf2dchKqPSnj9K2A\npN42FihMpcBihddGwZASnDntH2+vFsBgZimM0XedHfvvbENuOv7hM9u7oeL2\n2T86SScaPTmEajSi1MhFBnOsGYNc+OmEA4Sm2rZJ/YMebwelcSFPOaoWyejD\ngheOGGWyhpTmpjVfDUl+zrbngEk0jydE+Be5UNDRnLgER+GknLqM3SJC6gTx\nl2Ua\r\n=dv8o\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEDB0n1Lh2nI6Bo+3JzjS38c2v6Ig5vls3DV/nLe6NF6AiAyB69Viszgfaa/JJpeec0Bk7mLwQ9+19lOrjdu1zEREQ=="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_1.2.0_1592364284914_0.200093014758022"},"_hasShrinkwrap":false},"1.2.1":{"name":"earthstar","version":"1.2.1","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-addresses":"tap -Rspecy --jobs=1 build/test/addresses.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es2.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","better-sqlite3":"^7.0.1","chalk":"^3.0.0","chloride":"^2.2.14","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"bb69d96d15f7e417473313f5e56e1e03762028fa","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@1.2.1","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-4ko0X5tAuN4iPvJOe1zFu9eC5b2kLQbS6ULRCjiwxWRzUYh6qXAAbjvsiyJHJmRcedIiRsycMi542336ty64Hw==","shasum":"efd4ebc04c81b4429da7fd20df75e31ad11dd44c","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-1.2.1.tgz","fileCount":90,"unpackedSize":635069,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe7p1NCRA9TVsSAnZWagAAzD4P/jKE/AF7DqE5RvD8urcm\nCxMF1YizRGqcW/f3Cz+upuK327uWGRJI/6CCT0iPlINMtGZd8QrGQDMaWG74\ntxePKwootDluB9M8F6xZ168JDk8lTenFM3nQRmF6swkIJEdYwXAAQhv0qb9d\nWQQltxitzGNN3vkYrrgYfIyuh0XEUqpQgZ/+i9e4sJe0K1WFV2adsrFB3bh8\n4ph8BqjnYZHanVxDhWe5WaVxIGiGrOFviJqolcVfLWs+o9KqggcbZ8psVwl6\nZv4zPDqR7xGIxk08IVYrzzYValaxOF4kj1gNLl6+SJFnfLzd3OxCEqWgUCe4\nfBty2nw0gT00M1viKBnjWzDAjSdG5rjIw1k/Z4158cVKA4YEGN9YIztrTTcD\njuEENgARBqzmw0QvM7GrklV6VbNWpNCS3w3a/2EqkYVIOb6S49ceJ9LnMLG2\n02YUi7u6g5ETaLTZpq5L+rTweVdzOLIIW0slwOfXbSEuymXAbg+Pit3EQicA\nmsb3G1MY6dUIAjV8JEdhJbqc1cUHzMm7hMIP7GpTOEsnLE96gbNEdCzDrOwi\nLwoJqbEHDaSkoLVtz/O97DA4gD7tH55OT0TY0+/RV4E0yu11q9k60PHZ4FuX\nk2CmEIC/Xzf2/E6i4Qi8SFi/TZtIjLePR/qFqTUI5EYdpTY/OqetyqTBtsY1\nMEqI\r\n=syyN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICMP65PBUSaqrh6t3L73sHqOgh0unHSE5L9c25xVTD2pAiAh4BWTbll3yPUYjXfSqDvHxCgUxSwQgcVtNVeGOE4lqA=="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_1.2.1_1592696141045_0.6524772746543301"},"_hasShrinkwrap":false},"1.2.2":{"name":"earthstar","version":"1.2.2","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-addresses":"tap -Rspecy --jobs=1 build/test/addresses.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es2.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","better-sqlite3":"^7.0.1","chalk":"^3.0.0","chloride":"^2.2.14","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"756e21409437ab371ec2ab8c928b36a5a7a8c0cf","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@1.2.2","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-+oDIUMgNG5zy/oofTeDYj2E3rICiJCANzFLwEr9sgJOjkV20Km9XICeSREvURyLGbKu3KHrkGnFKqBSDx6b2/g==","shasum":"405624500b7d07f9a58afa2384e8b3d9489b7d2c","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-1.2.2.tgz","fileCount":90,"unpackedSize":635207,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe7qqHCRA9TVsSAnZWagAAFIkP/16MKvfQhbNajriSQqYr\nwLwxAtMn6TRc/MPQQ81HAyIZ5bbQscbV8LysYiGKq7tM2eWZagRnfThSifZu\nXZ5jgFeeM4MvrmqXOSrPVim0cv48xAf8gYta/mY4bZiKmPTof1RNv9aCReoo\nsM5U4IK5exvroAS4u/tH3fqJY8cuOs7vOvV0HY4gaah7dn6xoNCuIRbiMshW\nEaKkBO4/DyWd/5AAQ6bsolqmVhIogW2xwMFMaRvlVN9bqCUQEfQcruGj07CR\npidQipzqUXv81OMelwA2oMtGPsk9nDYIayhNSuXqI8ISxMRkjlZq+AkElmZs\nmiFgXJUg3k7hcKm9Ddw8Zixg7bw4e6bhXIE9kgNvYdL7ossY7EHKe5gvMqpv\nura2xNuzrkA75InRx55oKWGK08YU3/SRASr39CoNHSHOZpvAVEXQYFC+EB7T\nrjyXqRGIX6MCa2URbQ1j4jZ1P2jQJEXTTy97d+d+4QD3PHO9XU5ls7YXtTyJ\n2D2JP8flcBT3e7JU2eswb7fIgIyE4Ucb6JLCakNFvuAxfiXmqN/La+IqZYzT\nrxsVhaqXOslNdxizk1QIumJeazGAYlYK3ePHNtN43ENiCAQoXHYNUKv5rjCE\nK1PZ6wM+Q5SX8vDEcFChMlveBpXWrNVqM6iEbGoIia54z/G9hKbVf9X/8uol\nlC6C\r\n=bM5M\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCRQTHSrhTItzza0Wr3MQ20ntJ5vpD3V21r9+Pj3vkCQgIgdYZCr8oJHCBHsqAm25GVn1X1J5bjVOHCUb+sU2qElI0="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_1.2.2_1592699527246_0.6970264106842414"},"_hasShrinkwrap":false},"1.2.3":{"name":"earthstar","version":"1.2.3","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-addresses":"tap -Rspecy --jobs=1 build/test/addresses.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es2.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","better-sqlite3":"^7.0.1","chalk":"^3.0.0","chloride":"^2.2.14","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"f03c95b945423ae05b492023d2495bfb836baf7e","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@1.2.3","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-EnOuqPsGhrqVyXuchk8fxBerCd3rTbrrNN/OUpbbCBty9kCezFEJ+rxmcD8NQt6QPNFacnfU0VhiYri5//0a5A==","shasum":"b275e737ff0cc6138085a91373eb825c80c5dbe9","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-1.2.3.tgz","fileCount":90,"unpackedSize":635209,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe8kabCRA9TVsSAnZWagAAdBgP/A7qSQ7eZSh4eK1gmCUh\n3IyL8+AkLJPm3f1UPMmnJuHiKfDqNZJA4Di5v9CGgsczTKXKdh0QICtAd28L\nuK3a7vPp4Xcv79rUVHlh7T9ixoc30LIZysIpw0z+rSAaRq9KmjdRFAA489xz\n/jBUaF9naB6fh2XHLTtLJNvFBWwesVq+e8b8B+fRtWGcSQ2R5Me7t5HX2KM5\nZ16fZffVtGLZ8KxmKbA8srHFQGe5KCFx23YI+UN74uzC4qTQAvh0h4pDc8Mu\nPAwwnH3uUxAzgA+B0/5TzmLWqBuXdv4si82Bp4msD2fwRNGrREik2Bt/kaZt\nfx3b17SQCMz/U+V1W6pQD0HpxFUE/6c23qlDJS+yI28c4uSERQQ8UOWGNUmO\niu/x3lzE0sorzrc0GOmqkxMJYKwZLu9GsGOMHLXKTbGrVwF+B1SQUEAdRW4X\nTpKpzSTY3FfCpUl+EODL5p2UbnOv3CwNZ1czrL9oXMJU+UvroXsknsrt5Uci\n4i0TNeeT9N85B0SNS/KOSDste28woUmbvr1av77VMyJxb6VoOEaS/7G3jL7r\ngUlThFXlVuUeouj0+kuFJhbOdlNQEMW/ParTX09oW0xIXKtmzmVcXReye1Bs\nOd7Drgd7NrecDTsAK1R4uQPngUYq18jV0ob3TgWaKhI90mFSDM3Di7UZeu0+\nNg8V\r\n=uXah\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICSICT2v34hNFG11jtRfhJbw+hXSDW2lJ3Ks/xfOMi2IAiAL/7CoVQaAO+8s3kR+oyevdhWHxFRzXm3IZFLl8+X3/g=="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_1.2.3_1592936090969_0.28528901906042403"},"_hasShrinkwrap":false},"1.2.4":{"name":"earthstar","version":"1.2.4","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-addresses":"tap -Rspecy --jobs=1 build/test/addresses.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es2.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","better-sqlite3":"^7.0.1","chalk":"^3.0.0","chloride":"^2.2.14","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"33b9472e5e14b834607602be5f6e3689c1aa6308","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@1.2.4","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-tb3rhCXzTDM6KkKfZ0NZI/uIqqVNkCvTQpT2bmPOyjmfEbVwfqpV5Bou67BZOUpVNI5lgUfbq1KlVwnFvYxbHg==","shasum":"3fe1fc52ff949c47e6ce04dc93b0fad9171c2953","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-1.2.4.tgz","fileCount":93,"unpackedSize":635817,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe8k/VCRA9TVsSAnZWagAA/6QP/iLvjqrmQihGrlLirXAq\ncN+NAY3hbMqtDSmdJ66scSXpon6VhnEVRejpyGLXfAu7+tnPc9kf98Yu1iTn\nW/jSrk5PVgQRgk0pUAdH7qGwYuATGo5uL+xKCCSgcSxIJsyh3N2df9sg3RUA\nrs6ueXtvk7+nBChV9IyWY1kHeJDri+tIU4Ho0E0mI9S1BPJlrRUqJsnaOHjb\nAACOyEH9Z0a/GBmpLwomtgGIuDMJditcXFdiQF0QEnU0X1xlpIex6Y9SqOOv\nos1JTgByWpeqB6AknnAZvyA3p9Ee4Ns60RhBLb8likmVxo664DxvsUGY9oB3\nEMjs+7+Fw41qU0LD7V9v/iQqMLIA+SX3jYErEucGDT9uNUYlFFAGyUw/ksNC\nkkHVtIXKGuZykx/fEFcWv5KwEvUBMULNPEbOnJnFcSt4jTk9DC/u6otHFEQ1\nfShfFrzh4Jcnx5J1iBh9FuoDVQ/daNuQd1M4u2xSoyRgJHU5YaG99kjch98s\nqxMcMePO5cfPZdz0VbtOVo/Yb+zbMQCk2ZMIAtLgfy8rSd/NPFVWyW8y7Y+O\nSlM5eELYExB6yUDfllzOc0cWlxkTDBTmbc2tWLjzw0AkwXJsKzjZRJn0c3L1\ngVxI1Sh6VC3gVdCwxy6vkhaVlBEyNSLcsjItXRgXGR+pWyHLy71k4L50c7vF\n6njZ\r\n=8kwY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCnaYNi6xmxQ9TI81iv3R7xLBSTh/DL6mi0lbwYBjFPWgIhAJk02m1JpBJbTxSbzqvoxsEf+Z7/L9cxgU9iA1bchYxt"}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_1.2.4_1592938452956_0.5313867929710847"},"_hasShrinkwrap":false},"1.2.5":{"name":"earthstar","version":"1.2.5","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-addresses":"tap -Rspecy --jobs=1 build/test/addresses.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es2.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","better-sqlite3":"^7.0.1","chalk":"^3.0.0","chloride":"^2.2.14","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"c60b199ad987855f50eb6972741c348874cae192","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@1.2.5","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-DfE11YtRfkRpo1ToTWwrvcauK+goJ1+8oyNtV4o306cXlrVyqX4cVRbAQH0Fu9vJndXPsHfqBvmOA8Fhr/qr2g==","shasum":"368fed12842a10c3228d3d03d3ae8da25b4c8237","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-1.2.5.tgz","fileCount":95,"unpackedSize":678951,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe+TonCRA9TVsSAnZWagAAhY4P/3V6c6mFNlyobpS2UTB9\n54yrtCZ2t5+U0njBFj1FZItStyqhyTTt3+yNoO+VlbSItHn94OXn2qOLgPq8\nva3yPVL7MwouJd8sluFgZa8dHIEP9NdclorKMtXCfwOQQRaLTVA/E9S3cszd\n14CMDYJKFtcXCUGSi4qcRWwckdvLA/ApKcw13B4dr1k1pLH533ymqya9dAGu\njL2cc+bxTw9ONQxrPYE/2vF2iXHhVQURCBBp1AROshoQgwUw1i4bWMvwUOju\n7mdsTDglUjb/QEnCD7GwrwjbBAUijeKtoRiLDNtbLp9kI7skfwxanz8/dF75\nhZAs3+TCIVTQBqx2S4A+/AbTmAp66/e04Il1wdHtDNZmkNfbIj0IVknm5Lj5\nFWZR1LmjK2f1txzhPSu85rn9px5Yhv7HS1yogGr3F+MWstIk9uG/4f9qBS3v\n3tOaWEs5ESeFE33lv2M+vIAEBo8RiFHnZSFWl8hkDNxHsxCeGbjr0SmQORQu\n5Z//pyXcjUAhgpgZmRSWL4VafxDznqkVHGVOvbjXEI9+7/0XqDbkcGD31VgT\n9jcC3rb1kyzaLnEx0hmQZKo36Y/02APkdSv6AlM4PmAIxwlSE6PBVpyBhK5s\nlu970Z8omVXI37RozPh0dl9W2+H/N44sXs4d6K6DHqHGqeS+nNX3bzdbzhkV\nJkEd\r\n=4bNw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIED2Lf0oxbwefpH/aCXbLoc6rkWPcNccW0Ws9UnF970jAiAJ9Fo+JnyoJi+rcQQMYALjwlbXVa/xSrP7ycwA7wbY4g=="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_1.2.5_1593391654503_0.5451377933134944"},"_hasShrinkwrap":false},"2.0.0":{"name":"earthstar","version":"2.0.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-addresses":"tap -Rspecy --jobs=1 build/test/addresses.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es3.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","better-sqlite3":"^7.0.1","chalk":"^3.0.0","chloride":"^2.2.14","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"b0fa02993fb64b6f3fe35db8a0f059de07cb50fd","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@2.0.0","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-x8Mr/eJ6cSrxfpFmIBI/h/86kichW/mLycCycIPoS60Z/nUMFbLMXUtbOX6dWjKC1G5RnVNQwhHywsjXLJ66Jg==","shasum":"4e9a0fbd44625f3f967c843eae65c9dbb4c4100d","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-2.0.0.tgz","fileCount":102,"unpackedSize":845983,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe+oDNCRA9TVsSAnZWagAADIQP/0mXdGj8oORbHXSHDiIQ\nrSwQqc1FBuGeg1oGpde6eJKcl//C9Y3cxM5cBSSBP1fpKeBkx7aMJmVdrNEq\nwK/yttBa8QvQFgTBnCxP6NGj4GeMNGXM8gUD5mkB6cv9dYB9Ep/bNeVZv1Dc\nHVGU+Y+YHVBWUi6JFtHl9Ue+2AZXUzga5Zi7XIU1Bd+CtrzVkFzubLKCzOFb\nKhxTGfcMt71XdO6EDqbJ6on3FsqZ9RqaGwRlgIuFbjeCO2FhbRBYqyPO8MAO\nOK0PCPASYC7Qhk4kJ6ldNTIEfjy9zRho9kZIbS4dIjB2POufd7i3/v4anUFU\nBEitX0h94PwjtK2nh4V2OAswlqNXGXBDYA5qJdaDCGx0rym//gGnQ7GMsRPg\nlCpaTeoK0ZBa/kv/FoKfMZ7ts2aV/CBJfbdswg5kn1NzHE/8SBXgAbUkzANd\npjurJ7kxUKkdTUmwOpnBezFEijIaTs96bNilfuScs7T3o4Ur2MZT3RHh2b3X\nKRvPbCPZjkZ90kv5V2qweIR8kfSBxbsXBXzh68EMxNFRj3IuH3CCBAhToMzl\nOetSjCoEeV+aAgjshq6mfmbZ1zyufd7PwxH8PDTRvysXyOeGSgArkKd598k6\nz4uQmmcKrFYHfdnwwbk2lW2CeigFvyziaZtvQiojp4H5q83mBj773DO9f+Er\ngV/1\r\n=HQBL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDGkQJG3e81Q0+uO8417Kn2yk5K2ntiUxzejjWYNAB16wIgBi3TTKyFkqHbJxN0xKtqyG7E1blJJ5cnp1Db6mA8eCM="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_2.0.0_1593475276274_0.40286348920519877"},"_hasShrinkwrap":false},"2.0.1":{"name":"earthstar","version":"2.0.1","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-addresses":"tap -Rspecy --jobs=1 build/test/addresses.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es3.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","better-sqlite3":"^7.0.1","chalk":"^3.0.0","chloride":"^2.2.14","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"862279685b757eedb8dec400099ba4819e28f528","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@2.0.1","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-1jLEJ6lt21FQHAYhke1/NS1hfP31tZDQt9QmI+IuLyPT0319Hfe3UMbHNjt4G4jH1doPgb3+0QxStc5eDUeM+Q==","shasum":"d8e099a57f1a42dd495c0f457a3a5086fa15b6be","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-2.0.1.tgz","fileCount":102,"unpackedSize":849031,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe+ossCRA9TVsSAnZWagAAapQP/jUS2i7wS7lD4G6cXbDY\nlVCcNt7ePBQ0UNXKD3yQZRZzhtbDLjBknEmANwcF+LWV4XKDocSCM6usfNuj\nvY1U7QRarZZlp+VoBE2XmvLnS9GxvJO8obDAqnkHEmEnlLSL9htPp1KSyJQ7\nHsQypA/2cXYH2H1GW6n+siVallvh6CWpt7xeNGQtvxsMzGRdDczxPDRD5fGE\nwYzzHj3JEO7WzKI+CNu0Ku7/6QhhA3v2s2z0rADlKY94Bgfx/YxKctm4lK7Q\n0/oC2l8QQXrgAQ03VHQMiaAZO9p4VyrrCmP8g88lYoaIlnmzBD/TG7UlHq7C\n04Kik6rjiWIjwcQ98QQnJZXdRi4A5caT7OrmRsW3VSrnjtYlv3vO2DTlsxgf\nr0N2SNxIkzfL4lBquDp/Wnb9ipYVLosOFdHbdpViNd1XeQxVLLSuHrMPkTGs\nPs8RYZ6kSjXC6xNSSUmU4V0A+Hn6ey4O2RU7zkWUabUuG4vqBjdRLDMDDOph\n0ief+l/ddgwMbPq2HQ2l7fmfWDBxFoNGrVkDP41+438krfzmvrKP/Q6sWLxo\nAadW+1pOMjGW/BCbBsy3faO+dwR2CZCrS3EGIprgtUggQezynmIf7hpr7y8f\ngRcHZQ+4PWk4dHfsyxkiKFGfLMgbGqdEVjNsu5l8u/SGbitJO+ikf6updwMu\noOsG\r\n=5q+e\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFGXe1jXjBOmI1ErhDebLXfGTOmfDcYqT50Gt+AKIQS4AiEAuEtvzbACbXxwWmQaSlNM0B5nupc3XWC9DFz+4d5wcmY="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_2.0.1_1593477931458_0.946453935011617"},"_hasShrinkwrap":false},"2.0.2":{"name":"earthstar","version":"2.0.2","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-addresses":"tap -Rspecy --jobs=1 build/test/addresses.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es3.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","better-sqlite3":"^7.0.1","chalk":"^3.0.0","chloride":"^2.2.14","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"e66d31f94aa8fb759f909c2237b7e9a7fe4d19a2","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@2.0.2","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-VpNBc4CSvrqZYevV9ZnB+ijGHBf/MA0lYeNhexv2kgAh48yuKYIk4e3O17ZCYyOACcHIzH7EIPV8OCYGy6kNXA==","shasum":"79f757ce3ad79c804ed220526d10b6e726e977c8","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-2.0.2.tgz","fileCount":102,"unpackedSize":849947,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe+pFdCRA9TVsSAnZWagAAk4wP/0cgNXSSVeHgME4c15tB\nYj8Stf357BRhnS5X0HPE9g8mb0UE5WAzm/zqQbv15GGaflk6RatWdJ8DPRmb\nllJAvuXZDkx0hUNb3n4NR/M057cVreYraChrqPgMlcgUXAVocnV7Tp83JhLn\n9oQMnd7xt0G3qNSa/saF2m5uC0XT/LoBHnfGpBmhvDEHUG6R0jtN9BcDJ0ky\nJZU/qLFHjfv4ngyOmT7VyG94NaSdpr1PGYBKBfs9uxED6e2kMqaTg01OAcZV\nwd8qHQ6/9X9aUdKOojoUXeNXNmR6laPA+U/THTz42TdTLozi/wH5PN5N4oB0\n6Y+zGFvUU/PGDLNP7+hS6QlSqdJnVgKB7OFQpM0f6lP5/lB+rpP9by0aiGWV\n6Wsbmu0RhTbY6b9rhn8LNB9QtvaPZTiV+of5WJcGMqZqXVSbebdFBJxMZatT\ndgczqydSl3+Fb+IHpOUi7+wbolW2zBJYScb3A4/o45Bi24OCVxACkCEfWVjs\niHsivdwhP3Qj4J7/hNMcWvsIEXkFnt1SMzwwL9G0Uyy87s6fZAVmGobposIh\ncu8AOo/8zN1Q+vwp7Ud+esutkB5pd+da37zNkXjhBaJ6UbW3dgPfcg+bYcts\nP+e34AD5nIBW/s3QqvZhrk3njjv9C8IehxYGGeaOPdi13LfjjiE2zajvq2+O\n/VeH\r\n=8Kck\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC/Bu2f2eOMnPliJaawF0Pkmiox+Yi+R9+EEXWBcqZjBAiEA2TMlzYC+49Abi5gTfMaVy6y4VOWzzXeIDDek6TOx1c8="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_2.0.2_1593479517006_0.45122837043435715"},"_hasShrinkwrap":false},"2.0.3":{"name":"earthstar","version":"2.0.3","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-addresses":"tap -Rspecy --jobs=1 build/test/addresses.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es3.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","better-sqlite3":"^7.0.1","chalk":"^3.0.0","chloride":"^2.2.14","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"580c11a59fed7d18e4c7b1cfaf441e434cf19772","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@2.0.3","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-mjYXecgz2cAo7OFcdKflOzCaAbohbugUouiBmXX4jTTzNAo7YEQFzL7kZ6qGHRHJS/DtfVGJ3l1qTmqYNN+JNw==","shasum":"0b565602ecf1beb9d3601bd8df83224b9cd3c63c","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-2.0.3.tgz","fileCount":102,"unpackedSize":850730,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe/7ibCRA9TVsSAnZWagAAHj8P/Rxz9JWII3V3uvW4Grb5\nSgUyaRp4IF71WMewR8BdGsbS9Wd8WKfWbFwdfWzqo9t+4BidK9POLWzA+rzY\nu+bzMpyakDlFvi1ObycKvN7K3v1duNg4umED13qdVsPEVrdey/V6qw62+aTS\n/UoYTxwesr5TOzGNWi7iuGGYgshcI8KZqYwsLohg1GANgDsXYMoV1ju+p3Pz\nG0ohG76iOi/RE3BENAx8SDVpzfNwLYSwaovd7nJIfY1UpaSJQrTOv214fzQx\nOvFglfO3tl/qV5SXSOr3HDdGrRqax+907IesD6Ge25b5YvzW0lxm8YOE1+JT\niY6Im9SDL9kZWyKufmVHfcIig1zFH0rzXPvTS8fCwuu4Kbt7V6x3wyNZKlzg\nKPdQGI35wTcUd1Iotu2PMjgP+W1Uu0T5sVVPddjoSdyphTtJX+/WOCj3oAh2\ni29lwGGlFM/Cyi5G5YhYDrClYsZZogX8u7IrPGOIuk8rfPTBG5kOZDZkRgww\n0Kq8KC91P6Hv7U7BwDLOJGAuaIc6uxJdAb9dKCsE4/L7Dbm9v5gPyFQdwHqS\nEpBf4YFPOVAYLRHzZo4leglpXuf2Ir+NxJHx5k7DYjT3yiDJ4I6AP9mGyDJq\nCg9GRZaVvQ+ofICV4fnM0Hn4BjvLqCusry+rqXu387ZHJu24d+gGeqOYLYM9\nGvmE\r\n=iATy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDJ/eF1u4b1VG4FI0eBsMmnjhTt9BZpqSZJ5hyysTrblAiEAuQnY9FWE3J6z/d2emuSQ39TTIT/Co6bWkCAJd29UqAc="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_2.0.3_1593817243210_0.033443381012886686"},"_hasShrinkwrap":false},"3.0.0":{"name":"earthstar","version":"3.0.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-addresses":"tap -Rspecy --jobs=1 build/test/addresses.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es3.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","better-sqlite3":"^7.0.1","chalk":"^3.0.0","chloride":"^2.2.14","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"ae9b81055f6567d0b6f03bd9499d1574e1b8dda1","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@3.0.0","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-gpz67Oh1lgW1kHeNrx4Is5ZBinKm3DSlHiDSgY/5cG7+cpuL3VVdmjtudlRglPhq63DvfyeR/NwasWTo8Iwruw==","shasum":"7dcea3751b4db85c9940d3f4f5100da291aef006","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-3.0.0.tgz","fileCount":102,"unpackedSize":853138,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfBRS4CRA9TVsSAnZWagAA1bYP/0b+cD46Vb9f0DI2U5di\nyGLQ8/voCsRPkWbygqohnetLrbmL3zYjxIsyht8dwbojuSq0oGgRSojFwmYW\nkDWXnIdc2KZnTU13A2hLaNA14BSoEK8l+bemhJVK0nTNn2tnOQ490XyvDhKi\nU7lBSCIrrpTEuNUBPAHr97EQ2fVHPxvnrUaswX6ph8jnq8JojIJ/QLHZjLAC\nVj4Ya6aREfaIg6escXFykMOd9NH5kFn4S9zDoywHfSnn6wti51ewl4na700R\n2XCRmss0REKWL06bBAxN1WnVyKN57ZMwl96kBEiChUHqS6UMbrAf4qz+dycf\nIR2fWJ7gBxwWfHqa5Ws6KOpFQknUxm7htV6hcsJViJ+5LOwRZiUPq94a3EOZ\nV9u6vA7nx2yDW5+NEfQZBBb2JnH/XqCtnM/0KbJP9wA/bYfQwo0iUz5Fs6rm\nNyAr5jwfYk14U13xqvTEdtov+rmzmIZGS8zt2YsTEiVo1cjubxYgiM1jj3C5\nx4hxErz3NtkbaIpCWV410Z5QiW3MT2eOdbY4IdU7b+2XvlQb07SqarflwDSf\njhGFCgl0jzRUxCA+PeHBpvx2648ukwnzFQr2oLN7sJmutWz4x/5hy4sVLXsE\nxXfSB4McU3uSLO5DB8kALuXP9VIfy2/bGjMMu5kzdM9XmKtQSgeDWrsBWVS/\njMyH\r\n=H9d7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFDQW9fYzDKtJgq7zF27mCPTKqiu1AkRlRxlMb8Sgt6JAiEArqFuXrb37v1fJV+jiSOzahNZE/KJ1AV/yDX5XYT5Odc="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_3.0.0_1594168503464_0.48682431112470437"},"_hasShrinkwrap":false},"3.1.0":{"name":"earthstar","version":"3.1.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-addresses":"tap -Rspecy --jobs=1 build/test/addresses.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es3.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","better-sqlite3":"^7.0.1","chalk":"^3.0.0","chloride":"^2.2.14","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"245d64f6a866ab54733d47cb61b57ebfe09ed406","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@3.1.0","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-33OwQ49Fu3PvhRixD6EhgBzpEY0pzmEeycAENCLax1YDD44+mE1CJP2X0ZtAi5kKIac+MGSqGh0c67dsaOVLmA==","shasum":"a831f881c52142dcbe4f127f325840ce727f31ac","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-3.1.0.tgz","fileCount":102,"unpackedSize":854499,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfCP4zCRA9TVsSAnZWagAANAUP/0xmmMUqXgYUUGMx2+hP\nBGnF9rpcFmNlzqxoeNPlmdPn/wEnRdQmCcmHbUDZcb5VxibyPOkirHOmI2t4\nmvW9JHwy4owNLo5RAdtlJ8feW7J+4Ryrxk1jvW3jAw4JLkh8uaiAzZ4RpfQ0\n9E045zckk56kEwKIlBTNkkkAouiKcPOtplpp4/EkyTjDI7gbT6/ksMqHO1sV\nzGYPO+iuQSBUgdGMvsygbhPbQTsNzkDWQb3bZU/glPeEqDVU62KCSkeRTuLF\n7DTcIbqfBz/IDD2OVtkZJu80Oluw2tZkgHG44frmoYQ+YHLKipbmF/cA6/UG\nijuq4oi3jbNOU1o1ZyNHBlZj41KJ32DLKDlu3I6jqOH7S7H81PuO21PXQyWt\ne0cCHGiyjAS1spHdk65vxRx6OxzqQWvAyoyCJ2mbE+TYvoouy6PyQZ1gT5lA\neV4gK6PO8YLk0dzCELfwrLPE2Cvk54+a7g8YRIlSMo7Y74SbocrqUJA5hn94\nUpNV1tEH+qeZo5+/w33j478X+Ya9v7pk8kmLYW4vDrll8WS6CauRX5C7BRKa\nNROlM/jPrypCp0xFbxn28TLMrs/I9Xi8cSJU3cOQt3FfpGGups2hjAHJNa4Z\n3GkOXxceT33CrgBeQGbstVFH6Sgnm/6G3wD3XxFYO+9yEVdL3iR3cZ+XOcsw\nMiL6\r\n=zc+2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCdm4M69aS6cd/zLN0UIjLmNOw3VIMQKn2KZwhiRY2S8wIhAPptPvCZPoduiIXPDd9B2ayYn8kkkE73gdfcqrwzQ96O"}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_3.1.0_1594424882764_0.32002652590361214"},"_hasShrinkwrap":false},"3.1.1":{"name":"earthstar","version":"3.1.1","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-addresses":"tap -Rspecy --jobs=1 build/test/addresses.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es3.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","better-sqlite3":"^7.0.1","chalk":"^3.0.0","chloride":"^2.2.14","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"f0d46cb4ed9be90a1b92aab3b9b6b51a0bef3edb","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@3.1.1","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-dTMxsUrNswxyPGYbeq3eK9hb3Vo2nTAgOIp0Fe7zLqTrC6OAKDB6DdMt2UgEq0ExBunlNaBVHrVyHFJil69/uA==","shasum":"bdd287622505cdfbe9226e8d35761c56e6a59480","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-3.1.1.tgz","fileCount":102,"unpackedSize":860635,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfCRFTCRA9TVsSAnZWagAAONkP/iw7dRALB+Zhaq5R4vZ3\n8svUDUr117X2CWDXQvPIH2Jtzl97ps9ze+bxr4vR3OoRZrg1QOIqg/1rDz9f\nATs3QC+iao7Dm49UmS3f+ydSbExGL9cpNyT6zVrh+odPEYq44fC6jspm50dx\nw/Xe+jkbkU5zT56FjVJ2o08IFICINZz9mIpcxoV65tjtkdAEkac0ggiSOPBl\nEFv75lZyWz76VMpNjuJCBHaNDQbk3S290JosL59qMH3dp4OvUZk8I5XsI4UB\nEIP9zb+ifUsvFlAgB0rHrg+ah4/TNOYSxN44xTou/fGxBB7O09NkogPaPMJs\narCBIOzwXEBq5HOkmf+keZSHHAdVjCfWftfwMyWe0u3H4X1p5zGtlO6FLrFJ\n6zZCBMTquXD2Vb5DER8VShejq9kvH3xg6iZnNDoAdY5etiQp0K3mchaA1K1a\noddaEVDPPtELFfeEs+h+rGiERkqBEj66KNNsO02C1mn7LtUzOvfKvZ+dL1tF\nd0Wo2VD8ebXMo0Oy8nnvwZpMPr+jtdQ3/po/50Ki5O8oHJQhHFWe0k8TAe/T\nUYwqMQ74DLbxRjvMPSFSixTj8T24oygm8IX449+mRQim+xbSH/aI0A7Xq/Sc\nImW03Gs33L6f028D8xviMtRqQZpugutaFF8L0/B5ZGIR3NruzPdCW/jR0p0q\n4nKP\r\n=Z+ni\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGhpbvY9SiFm2swcTubrVxofngP12iG1A3+/GBEsXKTAAiEAtN4uIJ2yO01fjP9njvt7e1wxbTaOxr7gsutY6JzClK4="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_3.1.1_1594429778109_0.8999382699132437"},"_hasShrinkwrap":false},"4.0.0":{"name":"earthstar","version":"4.0.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","toc":"./update-table-of-contents.sh","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"81fcdb5bededc228ee3ce57091fd989eeb800367","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@4.0.0","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-sbbufH7LBHord9RO07yJb6gvy7My9CGmKHEnB+ikQdUu0/sX3irY1pNyFNyEpZtPvZ4m0CsmZT9qX20EYvp2Qg==","shasum":"34ed4631efca0c01ebdb26d3ff32d7b6b50d9d6e","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-4.0.0.tgz","fileCount":121,"unpackedSize":1035068,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfLHpsCRA9TVsSAnZWagAAjscP/ij9e0Q68z3Nn/NKhhzd\nwGapVjfvfwRkJ4fG/O6u64zh6VvqcdVvsRegheSAXiLgFYPz79UbAmVYt3F0\nPhnQYzCJVRy9aGV0L/QcB+ov5Oi3hVwIX6pWGtyNtZrdpmt82cT768MipO9s\nL//cIL6Y0MzIbdTZE5M8HQGloSyYxw/KlBjRuBygm/YX/PQ6RsaUP9/b6t3G\nxRbFi1lgBi6sBoEPEdgFgA5UuywOVgQRbek523v3VGTreicWCArDPa+5agO1\nFEauwcGeYGDfTqeWUgIcGJ0jfjBfliIA3LmgHIqbNNnyqIUAnrADHD1zCUxP\nM+Z2eR180C3f7PHwvDIkiPEDw7zzbDXOwnnrNNi4viqQbyveTgUm2iSfYEHb\nfQnS/+0JSppqt7p6EQv3FOsBqN2f/V57S34X2H4skJwkRnS4gYxWjotl81vA\nHGwF0rXt7tmbsXTwQjpqpQkovTufrgJhamZ+8ozE8sO66JdoBe7kROPEvTPc\nqvfReJhc3LjdHeC3Lh02z6pXm1JxGQRgWWYMtNae+nFnUraq0kx7HBihN5Aj\ncRABw6HcTuvuuuGQkQUn/JQm8pK5FyEbZGPuajxP/lPUwc8O8ga4bex0yBop\nSz0+Atn88Z6tKBpYxcBuNjhWVb1XS6d8l+2QdxusHP1gmIHSL+ZxN8MqY88B\nK7E+\r\n=YxoW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC8C/PeC2AVPrmGxOn5vNd27CpJwtNAFrxWN57GhliF+AIhANMhHpycHrtI+p9s93uss4EGdlF8hLBFAftZFvh6HjN4"}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_4.0.0_1596750443982_0.15041258173004346"},"_hasShrinkwrap":false},"4.1.0":{"name":"earthstar","version":"4.1.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","toc":"./update-table-of-contents.sh","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"28a63e166303528763e92e914db5ea08d57866b4","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@4.1.0","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-89YA8zlQoI2DbNYX2UfMvXmwXUy6O4eAEhi0/sCVJ+LZ/DYF4OaA/tL/SZjh4t0BpweF2GXxTgX3cBlUtzBTbg==","shasum":"23d84168d046869dd7dbfa085c66ced7f3b54630","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-4.1.0.tgz","fileCount":121,"unpackedSize":1041059,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfLInPCRA9TVsSAnZWagAAjb0P/2cpQRMN1vIIbaUO5AKp\n94YMUbsxRCpn8evAzPqQSzCsKRLCZB4JRVoUCOCipchzkIihKWHEaFhcNsGo\nPC3dJjNrwxU8T6C6JS3dutE1qEmYCidsIdpYbBGr8cfdl6a5Q7rFxTFL2piB\nzK4PbqCl6EdC7IMr6w4gA6tHMjoWuYFGBwV7ON5jWL1Gg1LaIhWPLFLAE5cQ\nPq4AvTOmc9jxcnPKKmffwXvAMiXq6rb5bi2u4mkvWhH8ZexEjU2d7Ioxk6a1\n/athBi1aNzKpsoIbHtCb3ez12vuEC/A7vvrqtx0g98H6ZgPCcD0FF/xc72k8\n7hHWXEhrtHzXwovy31HEbHGqKC5JRN6WDFs7UvTAovGQGXGUSemkzJkyr6eK\nNNyPWethiiqmyuYqlrMk0Vub0gLxZO9hBnLBg0OK0zPIHwkVyfv1/0NJw8K9\nLPSnSqlzE2v5Z/K57QIkZk0dKS9SijPsngr9AoQFdVtrq3HvJN3nPyjxriSQ\nS5wKUM1GHvD5qR1FPZaj1zooJ+2I5OjH8hqCu1DV2j6opP/p5agX9qHyqSQb\nGvinpWmh31mlYj7qJF0n9h37E8MdpZt4SQnwme67BQaCvWgB6hBrKqQS0DcI\nxHY/6hvGbCAirm0Rl06DcbD5ZJ5UnhHR6Bhi0hLnLgl1RN1edi+jeTWy0/qI\nq8So\r\n=20Ue\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCJlFcIn7NxgXgOtEWBeT/+d3ETWT7oj6E7uKFtUArQ2AIhAMg3vyGUNt0zQtlOviExtiQ96lOJqQB6/uWxZt/SeTEW"}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_4.1.0_1596754382424_0.155317760570852"},"_hasShrinkwrap":false},"5.0.0":{"name":"earthstar","version":"5.0.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","toc":"./update-table-of-contents.sh","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"62acbca62e9f3ad2877b0654c331437dc1053a28","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.0.0","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-ro8+AxhyIhw8lKDsupPB0SpNvDadUtLrOaPycqNoU+sWUsWL2CiWB+xCtt5KkW01PvlAhgCDxCD4byrBZs2FnQ==","shasum":"67f0eba96517dc43bc460b8388226e6750cd98a8","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.0.0.tgz","fileCount":121,"unpackedSize":1042121,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfLJd8CRA9TVsSAnZWagAAGTIP/0/QhR041X4eV3SWVOU5\nOCqXqh5HlENGBuZ5l/JHnjR7l9USp5iLCoNgXfu83xpNCnWnMxr5CEkmjECQ\nUquqV0ik+pneeWO6n7RVw2qpGggG7cnnSftR41c2ArUZ6ij0Y5zY+y0RRG7J\nnsO0J/lf6dO5031x39bqasS/kXU6T+SIUxXWvfZFNw141hFJA0F2njsWSKGo\nlGNCKXi5MwBVWyNpc1QxSl3oQlHT/PQjvJtjzeCGCjhSi7iLBEGizPA1/vIN\nTLWN4pDOH5V3ypmIcj9b/GpQf6QYYteuVXKw+NpsUaHzajSTVbsgr1ESwkC+\npf+ygohT8aDlBehdhVpz/lY+Qz4k/0evCEL89I6C/TK4PH+Ge+tNqsqvUBqm\nsPU2nIzxb55VMEXa1EEV9G4SoJmfwHbk2V24TnzBCTKIxVTfc4FeapzXxMUH\ngO/EvO/LHzqeD79qPURkWPal2Mu7OVk/FzXfdYHoMFuOLJtdBB7o3CMalUuY\nbj6ET8nWs/qLW9Qu53azviniy9XXQXcQbATzuY8a3ASRLtFb/hlIE5xOozxf\nYcT++rh50mAsIGfgECExveoUNF6nDJh5xsM1AKIeuv6o67gXW2wRGocAY1ZT\njcEoCRTf1M/wmIWB0LUF4rlUuRh42AvbQ5AAAy5y9Co5kz7JPVPTD33xDbHi\nU/Nm\r\n=i8Hb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCDQqZyFxln2m8b0qRTBfuGh+mAu21k8uUUj8phiA+yfgIgf2hfayPllrY5aBnX7JaFAlq8i2kxAPZ3A6jo5bUzRfs="}]},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.0.0_1596757883519_0.9321222716475657"},"_hasShrinkwrap":false},"5.1.0":{"name":"earthstar","version":"5.1.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","toc":"./update-table-of-contents.sh","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"fac7b5ba23c25ff431e799e5d190c4f6056043bc","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.1.0","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-BN3U1fqsLEcwxW9HWsmzHgeiaqqN8VMiMAdq0t0K484/Iq9yMDK9P6ySjAKnSXDithCpC7H/bA9Rsr/KDtRUsg==","shasum":"2ed7297c24fac0b1f02523dede2cd8cc01f796d6","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.1.0.tgz","fileCount":121,"unpackedSize":1100872,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfOELRCRA9TVsSAnZWagAAYHsP/2WxLq1XS+wdiMiYTCOv\nJAp3CzQ7dMTjUDKzU3aL69SKoH3J+CvvkUMihXuj2WD24PKDwE91JmF6mE9X\nZEU72jbS/xUnoBGJKze286tMaIeaYgLM7X4BnVcWO/iQuo7c6p4+lLuby3wg\nDaEwO6BeyVND8IkOLjlUW4zZcLTAH82uzx1rJxPYuc7lWbv8dEWTzngbiC4w\nc1YE9oWdebApy7C4fChJNQNhq9YI0qxDpCtveayefO06zajASoehH4URhzub\nmGUmGx911CLojULJP3H4a1PSQuLtk4akWQ+hrnqrve/Yg6k1Ri+wshxBy0xv\n+BzqIYbyeCoXFZvaX0hWbrapKneh79wQH0rmy9wcmb7qW60k9vWsBVyqujGJ\nYFLU+5YYAsOhCF9WE40zFOSjgzibmVDgCmsZgSe8+SSh+xpr0ChTAaMA62en\nvAhppanaFgDUcnM4UuQcUO/wiBLYjKk0k6CD6/hh0xyF5DZ6vmA6MdU9965u\nSK3/u4hkntKjtG2z/OUqHK13dzaTZbsOylm9veP10fxE4D9VCgm/anN0YKD2\nbmwFkNNX/JG5n0XjB/WlQQU8k3FWcALEA8xM5bHkebOMXISsQU/SRyhlEcMv\nNtvlknOwsZCqT0d+CqVlVGECWJIoZycEenVeX2wsUAi6iiW8Nq6xgoshrALt\nECAH\r\n=MFs8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEp/FcWPKpkFdpiaZTBgufWsHBEODiQHaENk6ucuFiK+AiEA+TAUBZHqPipLZSK8d9a1aLiz2V7FrD9ls3G1dFdLX0U="}]},"maintainers":[{"email":"cinnamon_npm@fastmail.com","name":"cinnamon_npm"},{"email":"rangermauve@hotmail.com","name":"rangermauve"},{"email":"gwilym@me.com","name":"sgwil"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.1.0_1597522640634_0.9895584366388799"},"_hasShrinkwrap":false},"5.2.0":{"name":"earthstar","version":"5.2.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","toc":"./update-table-of-contents.sh","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"5dd04bdb98266229112d6a25394593e85ba18817","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.2.0","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-+81AIWQuSx45RNJsYYnw8rYOCVKU6fBW+Zxv1L9B5a8wLDyHjkyPCLdjcxFN9iY6eKblrgESjOVp7IVYDykmbA==","shasum":"89224f01c34c2d5dfc42931b61091621cd90afbc","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.2.0.tgz","fileCount":127,"unpackedSize":1108906,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfOw2QCRA9TVsSAnZWagAAPiYQAJaJgEfEFQ0SVOZYt9RS\nMyeAAbIHC0bkz1U0YmygjK0aM+ZneNNYAtFA+LrtQOKwnkGmHGWvwGMe4gDn\nIUvBNhTjkpBIus9iCDmzX1oVoCaimgN6KMtvfwO5tRqbwITu7JZKR/qJj8gU\nWn/h2mTJ2ZEZrtdfYtukw8NclcyZG1FsyQFQiu/X69TCmvlk2h2DdVVY8By+\nRbYjgyCY+Mw/HutmP+ZbT7tan2CCeIgyoi0nZoznFmxZdtMTptAHTOwa3h9e\n59+dnvXAYZaE/o5u4zAKVEkd0nzSOv6qCQdXnYFm/CaWGsPWY5XYy68KoGJz\njiesx5ilRqXV6eHKFkv6I5kr2CGgCc46Dfr/DyxPJnTZ9dUaiRsTsaEaAUUk\nQTzmEndpAKSsvrKxIroLvTgYkeQqXha3t3QZN8mHKbo921N74T2HS5HDngqY\nehdbdl1FQQ5QD80rSYZoFdL8XfAgQxMQvLgBQFdFFCS8bx93mfeEm73Xsfxc\nOltDsz5CYKya3GRRIp5WnGpQ6ZnY77pNZRjTfX2Xpdi5mc8OiqxH3P5/3eyU\n5LQkHcz2QF2VYxU8lQW7c5zagKIBcwObeQuMC03iPKgSAFEbpOwKRdMYm9NU\ni3tz0R2xJDnOXHKwHRlpyaEdsYX9aiaKsxIVDVdo8mkhYrwgX+u9cbsQ2xGs\nVbxZ\r\n=Mijr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDfeoLuH6mixG5V6dbg+z2cOj+BA2M4AxmxcYshaFYowAiEAmW5DHS2wN5le/SSnkEcA8aKPtbpzIESILgtHhsdhemE="}]},"maintainers":[{"email":"cinnamon_npm@fastmail.com","name":"cinnamon_npm"},{"email":"rangermauve@hotmail.com","name":"rangermauve"},{"email":"gwilym@me.com","name":"sgwil"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.2.0_1597705615499_0.4124280439620662"},"_hasShrinkwrap":false},"5.2.1":{"name":"earthstar","version":"5.2.1","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","toc":"./update-table-of-contents.sh","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"10214676fc42459ab2e2db27519e5ddd70911e6a","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.2.1","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-mUdRLKt7ExXXDP58tuT2Hs3PU/iq0tMa4e0V4LJEL9u4vCaibRtJVT0EJnVryOE6nINitongace/FP5mw1hSVQ==","shasum":"b00a33c97c90e8db549ccbbe189b85862794e66c","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.2.1.tgz","fileCount":127,"unpackedSize":1109949,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfOw94CRA9TVsSAnZWagAAVk4QAKPevOwqxv9VlX2fxKu1\nw5qBiJjfOe5YRyyMD6/z/LhuwXRQIBX5qqM3OKaFQNSMGqyBrLwgCiIidqng\n5HQQbbvJy3+71Lg9ClzkTPzaG8kyCT06Y337hTM/BsczqLXsCzEp/FXUclm4\ncfn52rT4N+5vg63SYXJzFZc2kuEKAzeYYF8A8JrYsR4K3QOYKGj9vZOtzfyT\nA2L/8iGuTCMqXLDAr9tKBLitAP16tRqce2pT4p1FNGCBNWpvlK9WLukQPBBW\nigxuWDaeaco3x6ww+6BcABKkIzY+YJtb8aJMbd95A5GnTZmFAy9fINkA+BJr\neb9g9euopUg2e3QRHmdU1oLOSmgmu8ImSYAzPgBYeuO0qNYI7sshIy7WbZ+N\n9t1Vk+5B1FV1RLVRwXhjg77XFAyZBT/wJOPrz+VLlUnHpw+jOrjM+QaqB03H\nLUVhQvUUIozFiifkBRY0IGXeMRl1ft1ElHGwheFp5J2molYbf/xb66t6zPF8\n390j5psUKnjbTKbf81up6KDg9hVgwhWBABw85/Wgz8FV6U5R7u7CQbng4df6\nZ2Mc5w8mbmYe3fECCzd4uJgsS0bShHEVTFr6mBEtJgeyOdxs8nKPotz9Ue9P\n/LqLThMCguB/joTiFhaVwBrx5BJIGn9P9r6HRlCnoH3EVUx6Bjt9Pf88Z+hY\nIXc6\r\n=ChJn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDNx8dKaCZOUe5yNcS3Kbaf1T0QJ+YjIWD040ZLPTFIRAIhAPCjP68W4c4PIOO+VOh+ts2kp1oB9lc/28jGnWpScjZr"}]},"maintainers":[{"email":"cinnamon_npm@fastmail.com","name":"cinnamon_npm"},{"email":"rangermauve@hotmail.com","name":"rangermauve"},{"email":"gwilym@me.com","name":"sgwil"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.2.1_1597706104380_0.5533060900097193"},"_hasShrinkwrap":false},"5.2.3":{"name":"earthstar","version":"5.2.3","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false},"scripts":{"clean":"rm -rf build/* .nyc_output coverage","toc":"./update-table-of-contents.sh","build":"tsc","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"94aeb6b494634a402e112557b5f924ee8d99faa6","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.2.3","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-V9y1NLlbiMCshpXBwPJqjwWLvn2f5h9P2nfQxU6zjL4DtQ3549LNzi2EM+gw/X07ex4pj0D6ARzI6KT79mx0sA==","shasum":"29202f5b1e5b833c054ac889a6ea9ec65189e93a","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.2.3.tgz","fileCount":127,"unpackedSize":1113437,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfO0t4CRA9TVsSAnZWagAA8XsQAIziKoXL0EmHuT4ZLWpO\nwTcRcrAcTUPbidUQeneDZRO872G7Dp4iXSqxLCzwDkwtnXArGYX0ZFZ3s1xa\nJdlTzCZ4fR6m1KecGga3c5KtyiE9BGgsDaj1bqK0uf+okKxLcBqmQiar04UH\nU6DZkUzUm7mDKFo6TwJt6UTXCh+SKl4nY4JKAyAw35AHXDrFNCz8D01Ql8WQ\nJFhhja2BA6X0xZUQc0kOkhXpSmSVZajNIRMELA1Ytv0F5G51+ZGrqVFZRdwV\nMOYFaNGf7TxJPymNt6T3hW30MS9r+qTGjwpY70rPkyrhd5wwjI36Zxyd5t+P\ngXS7GvyoEAg+biP0M4lHnEobdhDaAGWx1X/wFmc83+Hh2Otls+ZmOBXFpKKP\n/tJR1fM0RBKO/q13qt9poPrAFo2DHmFrsRQAMBDi5PE6vriyfqI2GP4L36pK\nvC+ecMvP9m1IEehK0DdjmYOE+mH5qJ3K1cZIew6s6woRfcpXZStgptGtZnH7\nTI5t1CkS3OybjHSyADtQ3h7j7anM0drPKdNSFLoRbqUul0rgJ4GIXQZseYt4\nt5XrKugvOQUuuZZqSdPc+BbyUpHqHbSaBME04RevXqZ1V011/7eXdQe4ilSY\n/J08mNPxecT0DCAG1ZVrEOK8DHLjUMw1LiJSFDA10PvXCANfdexKzUyAYDkF\nvkgj\r\n=8rDg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBVromy3NOgHYp4a8JcC2mh69jlndo+sigA49RZ4XN0fAiEAkCZl4vWyt24hQwd3lnnlmR/eADx5G3/Dsa4X5KFntho="}]},"maintainers":[{"email":"cinnamon_npm@fastmail.com","name":"cinnamon_npm"},{"email":"rangermauve@hotmail.com","name":"rangermauve"},{"email":"gwilym@me.com","name":"sgwil"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.2.3_1597721464005_0.5447287634509577"},"_hasShrinkwrap":false},"5.2.4":{"name":"earthstar","version":"5.2.4","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","tape":"^5.0.1","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"f4da397e2558a08a25f4506fc368bdd00177023f","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.2.4","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-O0X0vdg2tLVlp9eid4Cgp6p2MZ3OtGfSWloGyq2k447/GR+Si4SIjJxfOo0lSKRxDs/qtuXvUVE7TYY4xGPbrw==","shasum":"cb7f36a87c1f3519f7bb037a6ab9ea7b092b0ae9","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.2.4.tgz","fileCount":128,"unpackedSize":1117558,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfRtEqCRA9TVsSAnZWagAA1JIQAJVt8icNQ7866/4IFvjL\nFd4BCFGuuIzuqFvWsarwiVrghVzeX8lpzztqpJiRmfYgKSs+ucNga/cP88EW\n5zzMmoBaeVLuspioudcTOMz37sXYo6dZ0W8wOOJTP5i9P5WF1fqf6tqmHZzA\nGnR0XzEZoDPQtBgjeFQPu9bBjuXVZ1/xOa8BEMvVt797CBNbCMjecpxIuv7g\nn9OEkfnl6n554Y8zgYKrkewevB8/WwG3wYQxvR/5Q11QDVPLBOLvkBhwUTPv\nhSr1UOPb1h+Iw0RHoU3GonGAEdHXTIIZQe8JGlSskBwH9z2wqE1SpoD4W5B/\nShC04TciwWkvUdo2eLU8+KoSKRFKxlJjRxo7WK/pEeDSWcUx0oQ5QcGaTkbs\nsGqv8JuHCN6DdlNswVMdJJbWFy+F+8HvupMsjQ5na/6koHUwcmO2UWarNHA/\nqqkMaPbWhi19Lk0JiNfPCoHaIzvQqrPoJwrEP27VjeSygjpGNWIMLnBRkPFi\nCDleGMzkhjkwbG77XkwEnda3NziZfqKJ7q4DXQMJ/gHaV7dXrY/HFnyqh8gc\ndCktvn3BAwLLOxGa0+78OVFPaA12A6FdnT83bV5LPna4TTqToocZduhM5tsB\nMyE2qTkANQlzMP/hWQJjd/X6EONgmFvIx8GcINwtGQi49VvxQniqCtPLSFL5\njUh+\r\n=hUqr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICCvvEeYmpqddKZvVSO7TK5ykTe6SGL8gzDR1yyTd0j4AiAkaWgWN8/j+jE53kNRrcI047Dzscaz/LX02Nfp8lHAPw=="}]},"maintainers":[{"email":"cinnamon_npm@fastmail.com","name":"cinnamon_npm"},{"email":"rangermauve@hotmail.com","name":"rangermauve"},{"email":"gwilym@me.com","name":"sgwil"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.2.4_1598476585466_0.6190290438660611"},"_hasShrinkwrap":false},"5.2.5":{"name":"earthstar","version":"5.2.5","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","tape":"^5.0.1","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"3f29d265ef58e2502e97a735a6081fd9525616ae","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.2.5","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-X5kAH68C/+e3CEVuXaPPnaBmfo8gOLjd+Xc7YNClHJnqL4ARP+lRI+ZqIiVsQfdMTq0fH2oH3KqHKqKGGjCNiw==","shasum":"2c98a85080937deeceaa12765be8c6f815154a2a","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.2.5.tgz","fileCount":143,"unpackedSize":1982261,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfTs/vCRA9TVsSAnZWagAAUJkP/izC2TwmjxGOAiTf1Dbh\nrLhEV1QMUmR5Kv0ytgDqLxBs8L276qyV1qTtItpvSIAlNmxuEvSq4+Iizl7U\nUxtWmwzp+fY42pwMW78sfoWbGGeDcEfj0WwhypNKB4OleNWXGjh0eKQG0Npo\nZP4kX58E/HAB9bT8rOL53aPuvpAao8l72d8T/4i0Fc+rmfHXhXITpLNb7sZa\nVREwZNKvssGBjhmkFBnMQzlbijnc0J524O5zH+OXLqU7yg7sgwnnLgmb6Msk\neUQCdJcGlaUDWI2IqU6pRF4luHIGc16pSSYE7IOz0XelhdX78Vb0lxJgntKF\n8zrtjQpTjs8iigMmdhawiEg41FHk7hqahALJz+dw2ASJxZpi8prwGcQZQZN8\nEavPjX154HXD6JsKc2M/MshgNRB2WK/HiztSoDTbzN5ZW7x68sSFiz7fbhyq\nV9zFzHWvcF3bp+uaQErWSCwrx+mi0BSkNaIjM27Bpl/42GBmvaIivuv2F79D\noyYv7q/aKMCCAUTcZiukBuU2nBqZwbZZZVEnBkm3WrZd7bgEGEK6CYx7wWoT\nt4qaom23TQQGqX0gr0LV0M3IImhYrNzWhmOdkuEKS71LX5TUuVOG5NL+apu3\nK4nrDD2E/N7fRiS+eBzvNmUjrmJLpFpEk9yiTlK9hSZPcNTje9GWTcR2FeQl\n5F6H\r\n=mzGx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDI8j4ylI0mZCKCnX7TheyVExf43knqEtVMBm0HtW7jGAIhAKhYLjBEtPDdErdSbHU8tdL07LOm/xjjo5zCPTPgFG45"}]},"maintainers":[{"email":"cinnamon_npm@fastmail.com","name":"cinnamon_npm"},{"email":"rangermauve@hotmail.com","name":"rangermauve"},{"email":"gwilym@me.com","name":"sgwil"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.2.5_1599000558322_0.13197220633160067"},"_hasShrinkwrap":false},"5.2.6":{"name":"earthstar","version":"5.2.6","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","tape":"^5.0.1","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"c5cec0c7a465043a32a673ddb0ff9c69b8deaa63","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.2.6","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-QLcYHxi+DQnLwe14III/m7Mfq7Q8PqUXHCZmC3zABRqnzYuTIgQ+B/gdoSd4amdx5JkQAYcdDHkgcP3KRB2Z3Q==","shasum":"4413f9fc62722239a141194d4ebb744c6a373d4e","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.2.6.tgz","fileCount":143,"unpackedSize":1982281,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfTtGeCRA9TVsSAnZWagAAU6QP/jc/95IbhcLzgMo6WGvD\nNnhgScGI3OH6CRWC6BEPTP62RmPHZRcthbsp4W4WCXRZfTK1oho1netdT/d0\nwWMYgJgWMD4A3YZrvBzHFxJh6w8xM4XGYDPkGEgAU0g1IA+FILH/Y6EeIeik\n85hj6K+mVLpS1X/kqHeaWBIa85uQ8jM+a67kYZb7fKi+pOn4+eRDQRL9ZjSp\njD40WCHSqAtf47QUrPVWfBAc6OvDF84Why0zTDAmO9kbLMq3DCPYDMPBeEuu\nOLQoOZla5bQuiQZB5QuPnivL9DGt5geSq6YBLkEwDqCbrtfyGTmqReWdheF5\n3KgbZXd2Z9QzYbCEYrF0gzVaLkLhuu6XRMkN5afkxSR6QFKh1ZWRF0S75g9m\nsEQML+lQR+OV+JgwJS1MYQASGOT2Z70kQu7yKY1FhRHcpXALk5Jp2kmosbm5\n5I1vZzLXfUCep4622NIhKUCrOgzyYCoic0h4tJLiv0A8//sdXE9NFE/78nxe\nS9qZINh7XckNR2Sb8uEOJvSbOaeYBEur/nIvp4mDOb2glnjOm8KFzQ5kQvoY\nXPZ/ELwZ519hePYby2lg4ORN4JcvvWj/t5m183dd0H14NpwdGJo4pQ2iyVsT\n2LVUJeascjgOSSTt22LLThCMgHyb3U/JocB4+nPtsasRawmkJNMcnT/rojAt\n/Bav\r\n=mnyl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDfTGM9t2cP613Idgsq80UinsN79Adx/6iKhOGnDEbjmAiB1eTaEZurpo6U0i10d7IvslqFVs4f6HVIWy4KmkpqP5A=="}]},"maintainers":[{"email":"cinnamon_npm@fastmail.com","name":"cinnamon_npm"},{"email":"rangermauve@hotmail.com","name":"rangermauve"},{"email":"gwilym@me.com","name":"sgwil"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.2.6_1599000990303_0.009667504678038341"},"_hasShrinkwrap":false},"5.3.0":{"name":"earthstar","version":"5.3.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","tape":"^5.0.1","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"4691f0efa1efe1e0190fbbff0a8e3e098c12bac2","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.3.0","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-6V2i3sBys5SzgUxRKzFKZ+UcVHA7ZbT6QZrM2myEa6TI72CA+FQ4A19/ZcYnsyr/jKMe1RM99rnI715OurIzpQ==","shasum":"5dfb2bcdf41473b1aee55b61de16e533f4b9cb96","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.3.0.tgz","fileCount":143,"unpackedSize":1985778,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfeiexCRA9TVsSAnZWagAApAQQAJ1QN7MWKOwIGEOZyUk9\nRDfshy0I3BaUIbNK8BidcDO3cOP9e9Q9010aRswApBWkjrKoPJLm174Zi6Us\nhclMuzo5b7lwcUh9klGndEtE5WHxCV5Lg4gt12n0EgS+YxDkMXpG9XOPMkTz\nn4fHYszYrUTcfG1ajv9Lgo5z2zgALGMaINxpXBGzE8XabG4ez1gMfRhxJBpB\ntUy1hieBu3JopEYrh6cKYhUeeXoKNuADCB3NGSCm9E2Ms9UAF6yuusiXTo+j\nC5HpmX6W6AqgqVf64s8TjN4OadJxbjKvZFp3nGf+SRYp7rZTD69pcdCPWXmV\nYASWYwMKNIp7516mg+03IUJH8DZJ6C95UaKIzKTTwHaKsKDgamRJaFb08z7D\nc2YZ0NqXzkNp/4iAOqdQ3QV2oTR9WpNWunSKYreX0zQDuw8HTv+H2m0LLxs0\nNITJm6kreaK76m0qH2zokvq+DyJn/lsoV3uTdCNs2PpHakAsQiGsG4omMNTa\nhnB1ks5IBCXgKhobrbYqEPElydM+B5uIYlH/IaVTt1DdcUWxAtphXu5++AIX\nUPHQ+RJN/XPr+CZiULI6/VWW7k4uzmv8UXdakPGaaaEUA1dCVTpe9QdkH6mt\npuHsR/UntSXFVCKEjkP2Z1LUsQxYi0mLnO4L+OdIWsNiI4+LkLp+hxgT6rlP\nbltL\r\n=NNWV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBxYjdAuEdz1+yLkKJZLVVfDWR9W0fYWS4voEcyDTznqAiEA6lFx145w5rtX0Pq96krtlOEnkrAIexdEAp0pZC9x2Kk="}]},"maintainers":[{"name":"sgwil","email":"gwilym@me.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.3.0_1601841072431_0.9873507420942687"},"_hasShrinkwrap":false},"5.4.0":{"name":"earthstar","version":"5.4.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","tape":"^5.0.1","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"0e42620602a94081a4edb732e5f1df263038dd21","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.4.0","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-+zNQiuU9ye/LuP3ejK78loMxwXza1PLkJReQ7yp1EaDuuSIbNLzi4oBajxCuCvWSnO0LfcmDOD2BiBLoIKMv+A==","shasum":"6c72f0da090ffaf433203ff497edc2e4788a1518","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.4.0.tgz","fileCount":143,"unpackedSize":1999096,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfe7ygCRA9TVsSAnZWagAAj1cP/3sy7wat9agDiOUEvlos\n4p91gHesKFNzAW/iPif7tA7xQUq7U3eIr9/YVMp+aVAFq5iHHTmMazgpn88/\n2Wv/6QBa0vgmDSaicHmSS0yGFi6ET/c+EMrV+XgMjya079jvhDy4oZAg1BCX\nt7NHpdGLxcsiOZNo77MKRAd67ouHhsyzVszHrar83hEueIbgZWJEtR4Dk4wI\nvpgPD8mWV6kpDjhMg99Paayt6PGB9o0fmCf2A7g3Rx2y2d2QfZ4dfLVLSzwJ\n1AQSWSr7PGRLbrxJ0wp4sZcNkHogm0og3H4bJyNRc+HrJWsPPu2anigE3KQX\n/TfW9D8XA8SJkYTR3mfkBbQgxa8Vi8ZUX4Nh0I3tAU5l4nUg2sKJ2D9o9bR3\n/k298o1UyU303IrgVTPo2P3ciknn29JHihp6HesnQMh+cqivu+dHoka/NxDL\nJW3RLI3ofZF093uRJ6jGr3kyYqWUkLO6iM9Kwe7XHhwEqx0M0lPMO4R43uDu\nB/pFwdIa5uSS9h3uIf2HCKo6rn8I+3tcYQ00g5RIPAH+zs1OEp7feHwBO5nG\n3DYwEL5fIESHphiD+wE/1gsmIAdra2+yv5g7XlWBLawbB2+jqqMCRIi4GpPc\nOHYGCoqtDuQ6gWpERQHt2n4lGU5Cy0mqZPbdQKmXbh4ore5shZJA/cS/gNQd\n5Eo6\r\n=Y3f5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCl6FXaSaYUIOc0yg+fbHHr8zUPMSxaVgP573R8U6xM/AIgOrJ0NY1P4T3WvriZpyQgfbw58BxUaUWYU2Tt4j2Hl8I="}]},"maintainers":[{"name":"sgwil","email":"gwilym@me.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.4.0_1601944735880_0.49356245410839583"},"_hasShrinkwrap":false},"5.5.0":{"name":"earthstar","version":"5.5.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","tape":"^5.0.1","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"03bd8ec23b9fe4bc23adfa790c949bf359f846de","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.5.0","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-sqsGwDBEJXf8MlbnxuuJ8O8GmWsqeG3xpa1BQqCIsTPh4JOX2sk+N0ir5MrrDmgeLkWsOkQhpHUp0Vm76WOA4A==","shasum":"d8d8295b30302bc7436e9cfb906d7597e5f715ba","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.5.0.tgz","fileCount":143,"unpackedSize":2010280,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfhOCqCRA9TVsSAnZWagAAMvkP/2f1+/AkGMrac6ObQJUK\n2WlGBp0zlTg4+d2+FosrlAKZHb77Ge0p40t+CtmvNijCI+2Raqw0pDOX1CgK\n9llKgMOQChesKptLaB814YiBaGCR44eEhrWQjtfoiU69sfyqVQ6iRO/IF04e\nQe0HBBIBVhS3ruymDuQGTtwlAPMEjiRylxEt/+zLekgSQGwq7TOeVqfRP839\nDan2edqTl06hgCTiXVw+/1yNcRnd81KyS+0pZ+TyHmG7XknyuZvSFajkJnQ4\nLIB1ePLFPC3LJSmYoKzdFaaMvg3dp7FLlMiveMlOyQhTuKHrfwV7onJJhMsG\nHEDMvHRfMpbO4TI/h/ZuwgfWdHixhYUi5GaNonc+0wdgynBHHJ0l2EUrbkyW\n4UnS9JShsNpX4g5ygWosGKfR7Eb22uSwy/MZD/8JAGkAC68KTLVToZAl6rI2\n8CdPbSnsZOEzEKYpteavgWY7cexhCc3ClnSLpXTJV3cc0S9Z7zb2B5MAAl/r\ntpqdyH5r/kWgTcNESPvBMi2wX7sqmfUoS92Yb0C7XrHDt/3+Ccqfs4/gAJL6\nferUcDyxYJ5mlgsVj+TTXnlkrFiXSBb+DSjSSfW/U6EsDfPZpzeFh+MbmG0O\nnUYyg7oWcaZFqmI+rt5NkOU3VTILgprUAQCQ+RiApojffVS6742nWjoOeOgr\nnGOJ\r\n=mes6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCskZ5QeIsyJvbLqW3TIwibAYV6wSYlZNqtT25aG/77HAIgTxqWcIsEs+C0q+zrk8nO/FII9W76IyfFMpTZzfHfif0="}]},"maintainers":[{"name":"sgwil","email":"gwilym@me.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.5.0_1602543786001_0.20359311143889536"},"_hasShrinkwrap":false},"5.6.0":{"name":"earthstar","version":"5.6.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","tape":"^5.0.1","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"e1c0f91793e485039ddedf1e6825206f012d8d7b","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.6.0","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-GvFITpR7yCBl8+elRbdENqkCkuvh+CUz+mcg50xEGRlvvmNsOcy/bTVLV2IFvbMFn3k53Dik0kJt9C6V89doww==","shasum":"858703b6adbe9ac2861ebd9cbe24c3f94787b9dd","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.6.0.tgz","fileCount":147,"unpackedSize":2048056,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfhkEcCRA9TVsSAnZWagAAz6UQAIdB7NMxi3MCGmilRrKR\nBm16WO0zP4FD0kAnDGzagbrnIxhVT9crV9YIyJoM1OGnGIObqLMflfx9OhBq\njXJrO2ut932LhoHn+0Ef5g5w01nD53fsf3kaSY6TIkHfOHt+7HEmWRcYe6Hs\nkGsNuKq+E6aXSS6W+AXROMJPiiiaqe2x/FMXxYAJ68R5B6cgREj5EiAdfqSt\nYLdATw1oNycgHtSr8M98inQDjZRN20MzO7B+Se3u5ytFfuptkDQN5wNzqmjY\n8s7buu6GtaDze23aqGiBICcfoYUeR5aFZnnB95MACum9DsArSAYHeOur21vo\nioEHqhz6aN9Ea49yHoO5TkEI9xiZneEW0LZzNJKZDTPdmMTR/TqWjSRY9jWJ\nxhoXJkWQai9irTq4yNMajobhzSTWLGQXmWS0EecnQlN5a31I8dANBAtthkuB\ntH84mQtkb+iPhKLhup6NEpU1nuzol3AzwL4mJ7Ai4ydJ5WByu5BrH/VjaCkX\nvCYzTDnup6OzKfgObN8y9vjjvIMBYxT5nJ1goXjad7LzyduAViBuIXizy895\nd7RtJmi92z6KuuJ9oevHaSoowlJ6+ZJcHLjsXF7bW4iHaYbZHn+IZyRE31MZ\n0q7YEsjjUUpHBWJHan+ow4m+9myeZgGfPoU5zP7lBpeI/9lQLm6cvsvT28F6\nIG3W\r\n=npmT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDJQS3vRlADh4AtEV06AvnPs/VXWq3NX9dL517e5KTj9wIhAID2t5qtW4Es4xfTOHYlcQbcZMDEOWD0AeMatFbHniSZ"}]},"maintainers":[{"name":"sgwil","email":"gwilym@me.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.6.0_1602634011355_0.6831492372019317"},"_hasShrinkwrap":false},"5.7.0":{"name":"earthstar","version":"5.7.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","tape":"^5.0.1","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"44a74ed9a784d3db753c2991ff88748b185fadf4","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.7.0","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-NR9kYH4Ex+v9CAKehGFmlqWsf0MZS/v5cRkqZAPTnUfAPajPPvUBWgu6Huy7hEf7j1S09Uv2EV2j7OECUuZj6w==","shasum":"5fba38c41c085dc8305270fbb9c354c8b6769f09","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.7.0.tgz","fileCount":147,"unpackedSize":2048957,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfiMd4CRA9TVsSAnZWagAAoFgP/00tdzgmE8yH5eKZpSzw\nAnjMePKGLeq1P/zAPL1j3KigU1vb+LKwYieSGF269ppWQhGFbLwfBXPaG8Jm\nj2bq9SRS6tyFXma/4nHSeUtibdtmcsuM53tAnXQbZ5cv9sqDXM9xbXBYWi/0\nTVakKoExGErjFE5UHa2nIyHmWR5GsWJzqHGeKz3lbEuSi0qctG0h9ySIukqQ\n66E0AndDvJSQFkjcOB5ZWNMklR+GTBHbHsjm6azUBHvSNHSbJS2WuToLbCaA\n26uHH7HUwBanWieJfPKhJsEAsYqz6HrR06BA3ZgxOTmXCz5H05FqP2jqUUAA\nHa5qcY3DNAPHfOgWBhZu5hK+Bfay0vlzGqDbMA4ysSazcCkIHZKIUn4fRoT/\nqF4FHi2MWtuqeG/KcNubma6BDf3B37khClUH1xIO7H4gsQXCGUM7cEicnZT5\n4p/qbo/EQxEq4JzyntJaJIaoIFJ7NBoUDRzG/NB8+2QEI8PZ9a1SZuiFzYm5\nkk/FcddDP86HHPRTAurctdaDC7UMJ7X/hC9yxUvY6i2FumqxlwmbXbRGnQtt\nZ/FZbUfnX3hJMJGi2UgAkKnz5kFw93Sa1+6Pt1tbGTq1nEOBltwe+5BPqHEV\nCeD8tu38YWak7loEwQ8TcdchDg97ZmMj7L2OxFUJAuYxpjscTnBEK5/k695/\n2WMs\r\n=ZZbh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCQ7MC/cdVOCfL+phVUE6Epnv1nK5JN3huBvvs9P8e50AIgM9eaSWEkK9jA6mlVnd9mmEfq86cDhQvKe3W86EwJ6Q0="}]},"maintainers":[{"name":"sgwil","email":"gwilym@me.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.7.0_1602799479636_0.07547534862004768"},"_hasShrinkwrap":false},"5.7.1":{"name":"earthstar","version":"5.7.1","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","tape":"^5.0.1","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"34ba32524038b22fb50b795b74c36172251e4b2a","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.7.1","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-SUY7h3LyZ4rCNrLSDjvxsGYrJkYvpaEwDBhceNhx70OXEYee11ILVs89N4YnDzzPvEXX1NC+Ty37/2YnCdirXg==","shasum":"f8204bf743b44fc42b01cd5ff076a8b917283fc3","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.7.1.tgz","fileCount":149,"unpackedSize":2057398,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfkNhpCRA9TVsSAnZWagAA71wP/RZr1S4C/kE1iAb32glR\n/v9CubOmVLLnrLWdpIrTrLCUc+egBvm/HNs2nBxqacXrBhjN2T6RVPLZlJ8f\ngn3oWdMZRPlvpoaaJI90jkTa1QLZbvzI7leHfe9tM3lMDx0AILDWEQoVz0II\n/gOEtZqtk6zouAMbjnJBK/WFh5K6K5ua6Q58sKuUf3ItUl5NnGcElU61kMJ5\nlO9h4JYZHsO6lNLaWvKbba4KMd75WZqqkZP4I8LgJgVxSlHHeT5WknhzcKYU\n1lkTZg3EdfVBgrpaQgRwbTH9utkqYWon1YtdfMzkQtZuxvX636n6exxjLQ2T\nDwfjZVZDn93NwVPT2TDEjPApAI3qPXdzm79TC81Iy2Z/1yt7W6EgeE9JA8GI\nU6e46iuisPuvALCHLzuS8Q3kwfkX2V2mSVnbzGcms8znHZ+TYYObunssSwW9\nfy7RjprpmW2qKs7nP8tOJT6cDazgeKroii8HBXV2aQeWQIUU1YgX+otptQeF\nWWBMrsS39XKHrbMdEArO0M/Ch0K7pLGjtcD6HfylUy2LlFZACPJmMRJ8WUqe\n7edYLzxzg4nWBY0/vnCMnF7kJsTJ2vPtfx741DBezWILfAn+KYc4zkyU3QeD\nStBU2oIKET0FoMYe2vQwThsQoviTQ5qAZCvbIs+9lO0d4ZpldHSRhdSfHjxr\nV32R\r\n=btad\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDgQwT9vRVDzLXv8m5okfqjuBIIbQfXXTmYAdJ4Xz5i8wIhAPKZb2kqNyKDOU6mQ9i5BvG3dOk0mkAnUP1CGyq0/5t9"}]},"maintainers":[{"name":"sgwil","email":"gwilym@me.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.7.1_1603328105225_0.8051268226753356"},"_hasShrinkwrap":false},"5.7.2":{"name":"earthstar","version":"5.7.2","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","bench":"node --expose-gc build/test/benchmark.js | tee benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","tape":"^5.0.1","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"6f483e2ca54151e574cf24565f3a8164fc1f40cf","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.7.2","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-u0/lf2+aUrMBxVQ14ILoRK9MgkbqRzgjC7rHokx3VjIMSdxn2GUt879uGO8MUOObUv/RWj5E+aO+CV/vsnoPXg==","shasum":"6960adecbc3f1a133ae1eafd01ec6620a81568e4","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.7.2.tgz","fileCount":153,"unpackedSize":2089680,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfmep0CRA9TVsSAnZWagAAnNQP/jWgDhw9ltcpBJzNEn83\nGyYJTs0tSkznGh3JxKdLZtPRfhcYjBrQBDIfuZXt6bYkMKVBvGNoAVm0huOG\nUp59RUtopBwJ8esHPAZkeSkbaISH7rbgm3F5D93JPbgxca/E9T8+R9Sd1ULc\n+DqnMBC8UDk5c944Sv96Vo6lW+ti36aaxGjTCBLGVK3VBPEBkqilSUnCHILz\nlaobKAJoVJHOT+VNK2LcjlH5Xlz/BvkGP17wS8kqiD6q7MAagWMnZmj+dogZ\nQuP3v7FUzVfinsQkTxghlo9Xe7tcF2hyIs/oU5PaFeN8ztn1gIqURLq2FryS\nJtHbvj9EIWq+eAKEcLZvSeOlQMtOkGa+6J+u7c5uQMr1jbMKSR7FjX7GjAyB\nb3zpfVq/V42HzeJrLZD0XOjnxVjyyi3u7ncu93UYN/zowiqDouTCxNcv2Kh9\ndEuZhr09LXQWB3Uc6kdK2tCE3QSPvTNbWb82BSC9CsLP6bML8tKLGl4K8MYt\n6aAy3sXUD2OZ1L4I84tW2YbStg/GLDxC/GD0GKYRabFDPWr7+B8P0lOnSobJ\neLwhy8o/2LUsJNHZVeuvCN3SsuVjZRkHL1VyLJ+dsh3YbPafC0tHPYJGaJSV\nObr0oQosWPaQA4yXm+qVqn3cjl6aMzD5aVxn1GZhdL8bLJXFzp8jPEkWJKTf\n4Vw1\r\n=CUkX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD81DT8udWZClkmVuCt+z7RDOAz5yjt5qLJADlHMq7UMQIgObKq5dkVTicrCoA0OcIRKhJY5A//FSj22SCHjOBM8t0="}]},"maintainers":[{"name":"sgwil","email":"gwilym@me.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.7.2_1603922547986_0.7099801823886058"},"_hasShrinkwrap":false},"5.7.3":{"name":"earthstar","version":"5.7.3","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","bench":"node --expose-gc build/test/benchmark.js | tee benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","tape":"^5.0.1","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"8e2b2d78d7371c8d8a5bb967a094f4f6a3f6cc91","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.7.3","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-8fL5bGAqiSckv7rmD2o120Bpkjo7eskPNtrhf4SxKcoqerKpEAIQBFyiQwcNlKU/Werfk1fMSmC5ZgqwjZDhlg==","shasum":"ecb5c612ee6f53baa35371dbff3ba15527157e9c","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.7.3.tgz","fileCount":153,"unpackedSize":2090462,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfmexwCRA9TVsSAnZWagAAzYEQAKHWKglp+Oc+ZV6XOf4S\nozOuAsy1cherqj3IkOyvyzOsaf8tsPqYFpQQKjjKpjFr41QxVU7hJmd8Azr/\nGfDeFTVTYsDoYwtOmPQfslXId89vtEqPNwBBBHjHXYLOoMe1XDgtQCLaJB+6\nSnI1WuAMIVPoI7VLul99TjQkU9yMYGuscirE0wkKHMlPyuXbT3+OR9DCazuA\nmbsSnHMrNA+BPrwARZvhfFaB+UJP7rH+6L5zftURQY5B1ZbFZXuBj7nLzWGX\ncWP472q7KoiSNSq0Oyj8E4vWOJ1CnMpgB2x82364U9OdTOF/RNNYJhHZeXDK\nFZhFcqKWjMvmETLqXukXYT4Gu781LJkYqKzHdarib12kMbKIIYMM+OuFfTcy\naEnbWe2us3cHmO4Bjt2FowE3U1Tgenyl7oetee0qS/gOpdgXJJaX+QF5cBHA\nnSNIqEy33+ohDRuYA7lZA9s3jToP9c4JsvGAGJqxIfo+rwBdgv2gpfZFOOcd\nE8isuaZ5IzoTW0LjbgGy5cjGb6IU0qq/a/b0NUUURp50OrR9DeIP4d+GzfyT\nxKK4zRMq45PcQ9xWx0PrrQWHFnmDq/FjfUPf/mPqQ94EVFAqtAuoXui2b0+j\nzKl8to3EfHZGpj5RiyQ/GCOrS2rqMaWVauE3YXq6LdmudkE9dqQM5irXKjPo\nbjC8\r\n=y+AT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHvP0G0590nrPKtvuD5Klj7WduzntW9ixs/pb9H0UT7uAiEA81aUvB/rNoFCxBI0qGsXL9RkvmtFzGsDIXlZzAt94gw="}]},"maintainers":[{"name":"sgwil","email":"gwilym@me.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.7.3_1603923055747_0.3550916445336354"},"_hasShrinkwrap":false},"5.7.4":{"name":"earthstar","version":"5.7.4","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","bench":"node --expose-gc build/test/benchmark.js | tee benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","tape":"^5.0.1","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"13dd947c780245b3122824c5a5625b58821fe16b","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.7.4","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-bJvn4Z3RwV0MAPAq4OCpaJrFlpmvL8XctV56kR/j0nhlvt7gPvULJluVW2IBpW/XEdgD3qY/jT7Wh+lonqSaXw==","shasum":"c986ef545774fd5a6f27a98b8aaaf0de4fa3f42c","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.7.4.tgz","fileCount":76,"unpackedSize":347186,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfpH4uCRA9TVsSAnZWagAAnTUP/2ab+xmUjJryDOIamPAM\nHaD7Sh+7cdmZWm2fq3k3FJ4L4SQCvrckyHUFwd/eJ1xwxwqD1l9mR/JfdV0+\nDi5R1Vaov3o1dddx0JQlpLK9o4RapDmjErth9zrC8aB64JyTxGRiA746ibg5\n50HEFzMCabmsDsQr/4BpqiBXdfRy7/cYtpLFPWNA0FLR5ki3fUfF5VU4WU7S\nADHiDF/CkOjogpfZWCIKzTXEhttdE5y9D8R8uFHa84QHX/tiVwaxn32zL2Ct\n5lni4JXAzrSQgyOz8oUNeukQNixST6cKhYFh5odN9xdibOv21190jXMNU1nY\n2sgOMBnMJj9YQsESBkRgJa3LN/3FJ+jiv66aAJgBuN71GOQxSehY+iqfTR51\nFjeD+AM28NrOyqxMLGjEnGKfS0CL1EyWgKwybmVPMMpjhr0SOABj2BhbgP9S\nwPYuiMvYC48SWJA1ZBrzUFCHT+CLqYu61NmJTzb/gPUI5cmc9Zcxk0oVtvnr\nh9q/cnj7/Gz4StVbD4+ZA46TG9AnoSdgXBuhW/B8niC/hVd+9xfA6Q13l58Y\nVkY8p7yv5Ks2wYZxFwdlgy7exEOa2aiD5JBIf1hpQeD+jzv72mKP7uAL0Jt8\nb87ciL5JsKN0yIhiDKjDYJ36N5QYwFwY6PbxpSWy8N4bgJ4PzT+hPOmEAvi7\nNRLN\r\n=okqC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIACCo+6RSPWqMfq0bTVx6EJ5v1DtdAZDZciHayeed4dHAiAORAmvZ1ZzWG34aO+FYmpx4FhqRsvuiaGzKPuQJoeaPw=="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"sgwil","email":"gwilym@me.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.7.4_1604615725379_0.06457807428867723"},"_hasShrinkwrap":false},"6.0.0-beta.0":{"name":"earthstar","version":"6.0.0-beta.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-storageAsync":"tap -Rspecy --jobs=1 build/test/storageAsync.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","bench":"node --expose-gc build/test/benchmark.js | tee benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/lodash.debounce":"^4.0.6","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.19.2","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chalk":"^4.1.0","chloride":"^2.2.14","concurrency-friends":"^0.2.0","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","multibase":"^0.7.0","tslib":"^2.0.0"},"readme":"# Earthstar\n\n![](docs/earthstar-wordmark.png)\n\n## An offline-first, distributed, syncable, embedded document database for use in p2p software -- in browsers and outside of browsers\n\n## Community / how to contribute\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) and [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)\n\nChatroom: [`#earthstar:matrix.org`](https://matrix.to/#/!oGfoMKqZnBVrJYjebW:matrix.org)\n\n## Links and docs\n\nDocs for everyone:\n* **[A Guided Tour of Earthstar](docs/tour.md)** -- Slides and diagrams explaining how it works\n\nDocs for app developers:\n* [Overview for developers](docs/overview.md) -- A quick comparison between Earthstar, CouchDB, and SSB\n* [Rules of Earthstar](docs/rules-of-earthstar.md) -- The scope of the project, and details of the technical invariants of the distributed system.\n* [Tutorial](docs/tutorial.md) -- Make a Todo list app, step by step\n\nDocs for core Earthstar developers:\n* [Earthstar Specification](docs/specification.md) -- All you need to know to write an Earthstar implementation from scratch\n* [About syncing](docs/syncing.md) -- Exploring this topic in more detail\n* [About fancy conflict resolution](docs/fancy-conflict-resolution.md) -- How to add more complex conflict tracking on top of Earthstar\n* [About timestamps](docs/timestamps.md) -- Exploring the limits of Earthstar's assumptions about timestamps\n* [Urls](docs/urls.md) -- How to build URLs related to Earthstar\n\nRelated repos:\n* [earthstar-cli](https://github.com/earthstar-project/earthstar-cli) -- Command line utility\n* [earthstar-pub](https://github.com/earthstar-project/earthstar-pub) -- Server to help you sync\n* [earthstar-graphql](https://github.com/earthstar-project/earthstar-graphql) -- A GraphQL layer for handling Earthstar data\n\nDemo apps:\n* [earthstar-lobby](https://github.com/sgwilym/earthstar-lobby/) -- A guestbook.  [Try it here](https://earthstar-lobby.vercel.app/)\n* [earthstar-wiki](https://github.com/earthstar-project/earthstar-wiki) -- An example app built with Earthstar (deprecated)\n* [earthstar-os](https://github.com/earthstar-project/earthstar-os) -- A toolkit for hosting and using Earthstar apps in the browser (deprecated)\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n**Contents**\n\n- [What kinds of apps can you build with Earthstar?](#what-kinds-of-apps-can-you-build-with-earthstar)\n- [Motivation](#motivation)\n- [Data model](#data-model)\n- [Block diagram](#block-diagram)\n- [Scope, typical usage](#scope-typical-usage)\n- [Editing data; multiple users and devices; conflicts](#editing-data-multiple-users-and-devices-conflicts)\n- [Security properties](#security-properties)\n- [Comparisons](#comparisons)\n- [Use cases](#use-cases)\n- [What doesn't it do?](#what-doesnt-it-do)\n- [Example](#example)\n- [Details and notes](#details-and-notes)\n  - [Signatures](#signatures)\n  - [Sync over duplex streams:](#sync-over-duplex-streams)\n  - [Sync over HTTP when only one peer is publicly available:](#sync-over-http-when-only-one-peer-is-publicly-available)\n  - [HTTP API](#http-api)\n- [Future plans](#future-plans)\n  - [Immutable documents by putting \"(hash)\" in the path](#immutable-documents-by-putting-hash-in-the-path)\n  - [Path overlays](#path-overlays)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## What kinds of apps can you build with Earthstar?\n\nTools for collaborating with groups of people.  See [Use-cases](#Use-cases), below.\n\n## Motivation\n\nCentralized services like Facebook have lots of problems: privacy, surveillance, addiction, dark patterns, ads, \"real name\" policies that harm minority groups, poor handling of moderation, bots, ...\n\nThese problems come from 2 root causes:\n* They have a **profit motive**, so their purpose is to extract value from users.\n* They're **big**, so they're a bureaucracy that can't understand the nuances of the diverse world population they serve, and they're unresponsive to demands from their users.\n\nWe'd be better off with communication services that are:\n* **Not for profit** - run by volunteers on small, cheap servers\n* **Small** - close to their users, locally governed, more democratic, understanding local norms and culture\n\nThis is the \"federated\" model, like Mastodon: instead of one big Twitter, make a thousand small Twitters.\n\nBut this has problems too -- volunteer-run servers don't last forever, and when they shut down their users lose their communities.\n\nEarthstar goes one step further: you can communicate without servers at all, directly from device to device; or you can run Earthstar on [servers (\"called pubs\")](https://github.com/cinnamon-bun/earthstar-pub) which help sync your data but have no authority over your account.  You can easily run your own servers for yourself and your friends.  Instructions coming soon.\n\nAll the authority in the system rests in the users and is enforced by cryptography, not central servers.  Since servers only exist to help with syncing, and your data and identity are independent of the servers, you can easily use as many or as few servers as you want, and move between them without losing anything.\n\nEarthstar's philosophy is that **apps should be tools, not services**.  Authority no longer rests in a central server, it rests in each user.\n\n## Data model\n\nAn Earthstar workspace holds mutable **documents** with unique **paths** (ids), similar to leveldb or CouchDb.\n\nWithin each **path**, we keep the newest version of that **document** from each author.  We discard old versions of a document from the same author.\n\nIn other words, it's a mapping from `(path, author)` to `latest version of the document at that path, from that author`.\n\nThe newest document (from any author) is considered the winner of a conflict.  More details below in the \"Editing data\" section.\n\nThere are no transactions.  The unit of atomic change is the document.\n\n![](docs/earthstar-data-model.png)\n\n## Block diagram\n\nSimplified diagram of the entire system.  The dashed boxes are not implemented yet.\n\n![](docs/block-diagram.png)\n\nA more detailed look at this Javascript implementation:\n\n![](docs/building-blocks.png)\n\n## Scope, typical usage\n\nEach user will have their own instance of an Earthstar database in whatever app they're using -- in the browser or native.  There might also be some instances on cloud servers (\"pubs\").  The databases can sync with each other across HTTP or duplex stream connections.\n\nEach database instance can hold a subset of the entire data, specified by a query such as \"paths starting with a certain substring\", \"paths written after a certain timestamp\", etc.\n\nThe universe of data is divided into **workspaces** -- collections of documents accessed by certain users.  Syncing happens one workspace at a time.\n\nRead the [vocabulary and concepts](docs/vocabulary.md) documentation for more about workspaces.\n\n## Editing data; multiple users and devices; conflicts\n\nA single author can use multiple devices at the same time.  You \"log into\" a device by providing your public and private key, like a username and password.\n\nData is mutable.  Authors can update paths with new documents.  The old data is thrown away and doesn't take up space.  You can \"delete\" data by overwriting it with an empty document.\n\nThere is a write permission system to allow only certain authors to write to certain paths.  Other paths can be written by anyone.\n\nSoon, there will also be a way to write immutable messages, for use cases where you need those.\n\nConflicts from a single author (on multiple devices) are resolved by timestamp and the old data is discarded.  Conflicts from multiple authors are resolved by timestamp by default, but the old data is kept to allow for manual conflict resolution if needed.\n\n## Security properties\n\nEach author is identified by a public key.\n\nData updates are signed by the author, so it's safe for untrusted peers to help host and propagate data.  (Soon) you will also be able to encrypt data so untrusted peers can host it without reading it.\n\nMalicious peers can:\n* Withold updates to individual documents during a sync\n* See the data (until encryption is implemented, soon)\n* Know which peers they're connecting to\n\nMalicious peers cannot:\n* Alter documents from another author\n* Forge new documents signed by another author\n\nAlthough malicious peers can withold individual documents, as long as there are honest peers around you will eventually get the latest verison of everything.\n\nBecause it allows partial sync and mutation of data, Earthstar doesn't cryptographically guarantee that you have a complete dataset with no gaps from a certain author.  Authors could chose to use sequential paths or embed a blockchain of hash backlinks into their messages, and you could verify these in your app (outside of Earthstar).\n\n## Comparisons\n\nLike leveldb, but:\n* multi-author\n* it syncs\n\nLike CouchDb, but:\n* with signatures and encryption, so untrusted nodes can help move data around.\n\nLike Scuttlebutt, but:\n* one author can use multiple devices\n* data is mutable\n* instead of an append-only log, it's a set of mutable items\n* supports partial replication\n* will sync over HTTP, not just TCP, so it's easy to host in places like Glitch.com\n* has less strict data guarantees -- you can't tell if you have someone's entire dataset or not\n\nLike DAT, but:\n* multi-author, multi-device\n* simpler\n* communicates over HTTP, making it easier to deploy pub servers and run in regular browsers\n* instead of an append-only log, it's a set of mutable items\n\nLike IPFS, but:\n* multi-author, multi-device\n* mutable\n* documents are signed by the author\n* currently more focused on pub servers for replication and not DHT swarms, although swarm support is coming\n\nLike Firebase, but:\n* open source\n* distributed\n\nSometimes immutability is needed, like if you're running a package registry or want an audit log.  For social-network style use cases, though, immutability can be a privacy liability instead of a desirable guarantee.\n\n## Use cases\n\nEarthstar can be used for invite-only tools where you have all the data (think Slack) and large open-world tools where you only replicate part of the entire dataset (think SSB).  Apps tell Earthstar what paths and what authors to replicate.\n\nThese styles of app could be built on top of Earthstar:\n* wikis\n* chat: Slack, IRC\n* social: Facebook, Scuttlebutt, Discourse, LiveJournal, Forums\n* microblogging: Twitter, Mastodon\n* productivity: Trello, GitHub Issues, Asana, Todo lists\n* office: Google sheets\n* art: Collaborative drawing or music tools, multi-user Twine for making interactive fiction games\n\n## What doesn't it do?\n\nEarthstar's conflict resolution chooses entire document versions as winners, it doesn't merge versions together.  This means it's a poor choice for simultaneous multi-user editing of large text documents.  For that, you could use a fancier CRDT like Automerge and rely on Earthstar to move and sync the patches it produces.  Or you can design apps to store large documents as smaller pieces, like paragraphs, or design other ways to collaborate such as comments or chat where people don't simultaneously edit the same text.\n\nIt will eventually stream live changes, but it doesn't yet.  For now, syncing is done on demand.\n\nThe cryptography is not audited yet.  It's based on libsodium which is also used by Scuttlebutt and many other projects.\n\nEarthstar is more focused on autonomy than on anonymity.  It doesn't have perfect forward secrecy.  Your messages are signed by your key so it's easy to prove which identity said something.  We try to reduce IP address exposure etc, but if you have a serious need for anonymity you should layer it on something like Tor or use other tools that are anonymity-focused.\n\nEarthstar doesn't provide transactions or causality guarantees.\n\nModeration and blocking support is not figured out yet but it's important and we'll get there eventually.  In the meantime, apps can layer their own moderation and blocking support on top of Earthstar.\n\n## Example\n\nThe main interface to Earthstar is the Storage class:\n\n```ts\nexport interface IStorage {\n    // A Storage instance holds the documents of a single workspace.\n    // To construct one, you need to supply\n    //   * a workspace address\n    //   * a list of Validator classes, for the document formats you want to support\n    //   * various other options such as database filenames, specific to that kind of Storage\n\n    // The workspace held in this Storage object.\n    workspace: WorkspaceAddress;\n\n    // onChange is called whenever any data changes:\n    //   * after every set()\n    //   * after every ingestDocument()\n    //   * after each document obtained during a sync (because that happens via ingestDocument())\n    // It doesn't yet send any details about the changes to the callback, but it should.\n    // Subscribe with onChange.subscribe(...cb...);\n    onChange: Emitter<undefined>;\n\n    // QUERYING\n    // Return the documents that match the query.\n    // Default sort is path ASC, then timestamp DESC (newest first within same path)\n    //  but query objects will eventually include sort options.\n    documents(query?: QueryOpts): Document[];\n    // Same as documents(), but only return the distinct paths of the matching documents (duplicates removed).\n    paths(query?: QueryOpts): string[];\n    // Same as documents(), but only return the content properties of the matching documents.\n    contents(query?: QueryOpts): string[];\n\n    // List of authors that have ever written in this workspace.\n    authors(now?: number): AuthorAddress[];\n\n    // INDIVIDUAL DOCUMENT LOOKUP\n    // Get one document by path.\n    // Only returns the most recent document at this path.\n    // To get older docs at this path (from other authors), do a query.\n    getDocument(path: string, now?: number): Document | undefined;\n    // Same as getDocument(path).content -- just the content of that document\n    getContent(path: string, now?: number): string | undefined;\n\n    // WRITING\n    // Write a document.\n    // To do this you need to know an author's private key, which is part of the keypair object.\n    // The DocToSet type is similar but smaller than a regular document:\n    //   format: which document format to use\n    //   path\n    //   content\n    //   timestamp: optional.  If absent or zero, the current time is set for you\n    //   - no workspace -- this Storage object knows what workspace it is\n    //   - no author -- it's provided in the keypair argument\n    //   - no signature -- it will be signed for you\n    // Timestamps should only be set manually for testing purposes.  Normally they should be\n    // omitted so they default to now.\n    // The timestamp will also be increased so that it's greater than any previous doc\n    // at the same path (from any author), to guarantee that this write will be the conflict winner.\n    //\n    // now should usually be omitted; it's used for testing and defaults to Date.now()*1000\n    set(keypair: AuthorKeypair, docToSet: DocToSet, now?: number): WriteResult | ValidationError;\n\n    // Save a document from an external source to this Storage instance.\n    // The document must be already signed.\n    // This is mostly used for syncing.\n    //\n    // now should usually be omitted; it's used for testing and defaults to Date.now()*1000\n    ingestDocument(doc: Document, now?: number): WriteResult | ValidationError;\n\n    // Internal helper method to do a one-way pull sync.\n    _syncFrom(otherStore: IStorage, existing: boolean, live: boolean): number;\n\n    // TODO: add now? param to _syncFrom and sync\n\n    // Two-way sync to another local Storage instance running in the same process.\n    // This is not network-aware.  Network sync is handled by the Syncer class.\n    sync(otherStore: IStorage, opts?: SyncOpts): SyncResults;\n\n    // TODO: Delete data locally.  This deletion will not propagate.\n    // forget(query : QueryOpts) : void;  // same query options as paths()\n\n    // Close this storage.\n    // All functions called after this will throw a StorageIsClosedError,\n    // except you can call close() as many times as you want.\n    // Once closed, a Storage instance cannot be opened again.\n    // TODO: what happens when a long-running process like a sync is happening, and the Storage is closed?\n    close() : void;\n    // Find out if the storage is closed.\n    isClosed() : boolean;\n}\n```\n\nUsage example ([readme-example.ts](src/readme-example.ts)):\n```ts\nimport {\n    StorageMemory,\n    ValidatorEs4,\n    generateAuthorKeypair,\n    isErr,\n} from 'earthstar';\n\n// Create a database for a particular workspace, '+gardening.xxxxxxxx'\n// We've chosen to use the latest 'es.4' feed format so we supply the matching validator.\nlet storage = new StorageMemory([ValidatorEs4], '+gardening.xxxxxxxx');\n\n// Users are called \"authors\".\n// Let's make up some authors for testing.\n// A keypair is { address: '@aaaa.xxx', secret: 'xxx' }.\n// (xxx represents base32-encoded ed25519 keys)\nlet keypair1 = generateAuthorKeypair('aaaa');\nlet keypair2 = generateAuthorKeypair('bbbb');\nif (isErr(keypair1)) { throw \"oops\"; }  // error could happen if our author shortname broke the rules\nif (isErr(keypair2)) { throw \"oops\"; }\nlet author1 = keypair1.address;\nlet author2 = keypair2.address;\n\n// You can set documents at specific paths, like a filesystem or key-value store.\nstorage.set(keypair1, { format: 'es.4', path: '/wiki/Strawberry', content: 'Tasty' });\nstorage.getContent('/wiki/Strawberry'); // --> 'Tasty'\n\n// One author can use multiple devices with no problems.\n// Conflicts are resolved by timestamp.\n// Here the same author overwrites their previous document,\n// which is forgotten from the database.\nstorage.set(keypair1, { format: 'es.4', path: '/wiki/Strawberry', content: 'Tasty!!' });\nstorage.getContent('/wiki/Strawberry'); // --> 'Tasty!!'\n\n// Multiple authors can overwrite each other (also by timestamp).\n// Here author 2 writes to the same path.\nstorage.set(keypair2, { format: 'es.4', path: '/wiki/Strawberry', content: 'Yum' });\nstorage.getContent('wiki/Strawberry'); // --> 'Yum'\n\n// Within a path we keep the most-recent document from each author,\n// in case we need to do better conflict resolution later.\n// To see the old versions, use a query:\nstorage.contents({ path: '/wiki/Strawberry', includeHistory: true });\n// --> ['Yum', 'Tasty!!']  // newest first\n\n// Get the entire document to see all the metadata as well as the content.\nstorage.getDocument('/wiki/Strawberry');\n// --> {\n//     format: 'es.4',\n//     workspace: '+gardening.xxxxxxxx',\n//     path: '/wiki/Strawberry',\n//     content: 'Yum',\n//     author: '@bbbb.xxxxxxx',\n//     timestamp: 1596676583283000,  // time in microseconds: Date.now()*1000\n//     signature: 'xxxxxxxx',\n// }\n\n// WRITE PERMISSIONS\n//\n// Paths can specify which authors are allowed to write to them.\n// Author names in a path prefixed by '~' can write to that path.\n//\n// Examples:\n// (in these docs, \"xxx\" is shorthand for a long public key)\n// One author write permission:\n//   '/about/~@aaaa.xxx/name'  -- only @aaaa.xxx can write here.\n//   '/about/~@aaaa.xxx/follows/@bbbb.xxx'  -- only @aaaa.xxx can write here\n// Public:\n//   '/wall/@aaaa.xxx'  -- no tilde, so anyone can write here\n//   '/wiki/Kittens'  -- no tilde, so anyone can write here\n// Multiple authors:\n//   '/whiteboard/~@aaaa.xxx~@bbbb.xxx'  -- both @aaaa.xxx and @bbbb.xxx can write here\n//\n// Here we'll set the author's display name by writing to their profile document.\nstorage.set(keypair1, {\n    format: 'es.4',\n    path: '/about/~' + keypair1.address + '/profile.json',\n    content: JSON.stringify({displayName: 'Suzie'}),\n});\n\n// You can do leveldb style queries.\nstorage.paths()\nstorage.paths({ lowPath: '/abc', limit: 100 })\nstorage.paths({ pathPrefix: '/wiki/' })\n\n// You can sync to another Storage that has the same workspace address\nlet storage2 = new StorageMemory([ValidatorEs4], '+gardening.xxxxxxxx');\nstorage.sync(storage2);\n// Now storage and storage2 are identical.\n\n// Get notified when anything changes.\nlet unsub = storage.onChange.subscribe(() => console.log('something changed'));\n\n// Later, you can turn off your subscription.\nunsub();\n```\n\n----\n\n## Details and notes\n\n**NOTE** The rest of this README is somewhat out of date!\n\n### Signatures\n\nDocument hashes are used within signatures and could be used to link to specific versions of a doc.\n\nThere's a simple canonical way to hash a document.  See [docs/serialization-and-hashing.md](Serialization and Hashing) for details.\n\nTo sign a doc, you sign its hash with the author's secret key.\n\nNote that docs only ever have to get transformed INTO this representation just before hashing -- we never need to convert from this representation BACK into a real doc -- so it can be nice and simple.\n\nThere is no canonical encoding for storage or networking - only the canonical hash encoding, above.  Databases and network code can represent the doc in any way they want.\n\nThe hash and signature specification may change as the schema evolves beyond `es.4`.  For example there may be another schema `ssb.1` which wraps and embeds SSB messages and knows how to validate their signatures.\n\n### Sync over duplex streams:\n\nHere's a very simple but inefficient algorithm to start with:\n\n```\n    sort paths by (path, timestamp DESC, signature ASC)\n    filter by my interest query\n    while true:\n        both sides send next 100 docs to each other as (path, timestamp, signature)\n        both sides figure out what the other needs and send it in full\n        both sides send 'ok'\n```\n\n### Sync over HTTP when only one peer is publicly available:\n\nHere's a very simple but inefficient algorithm to start with:\n\n```\n    the client side is in charge and does these actions:\n    sort paths by (path, timestamp DESC, signature ASC)\n    filter by my interest query\n    GET /interest-query   the server's interest query\n    while true:\n        GET /doc-versions?after='foo/bar'&limit=100 from server\n        compare with my own docs\n        pull things I need\n            POST /batch-get-docs       paths=[foo, foo/a, foo/b, ...]\n        push things they need:\n            POST /batch-ingest-docs    docs=[ {...}, {...} ]\n```\n\nNote that everything happens in batches instead of infinite streams.  The code avoids using streams.\n\nFor *efficient* sync, we'll use something similar to [this set reconciliation algorithm described by Aljoscha Meyer](https://github.com/AljoschaMeyer/set-reconciliation/).\n\n### HTTP API\n\nThis is out of date -- See earthstar-pub for the latest\n\n```\nHTTP replication:\n\nGET /interest-query   the server's interest query\n    return a list of query objects -- what does the server want?\nGET /doc-versions [after='...'] [limit=100] [before='...']\n    return array of docs with just path, version, first N bytes of signature\nPOST /batch-get-docs       paths=[foo, foo/a, foo/b, ...]\n    return complete docs\nPOST /batch-ingest-docs    docs=[ {...}, {...} ]\n    ask server to write these docs\n    return 'ok' or error\n```\n\n## Future plans\n\n### Immutable documents by putting \"(hash)\" in the path\nYou'll be able to put the literal string \"`(hash)`\" in a path.  It will be replaced with the hash of that document.  Since no other document can have the same path, it will be impossible to overwrite or delete this document, making it immutable.\n\n* Signatures are based on the shorthand path\n* Upon ingestion to the db, replace `(hash)` with the actual hash of the document\n* Database lookups use the full expanded path\n* Across the network, we only need to send the shorthand path.  The expanded path is derived state.\n* `(hash)` lets you create docs that can never be overwritten, because you can never make another doc with the same hash.\n* The expanded path needs to contain a character that's not allowed in regular paths, so the only way to get that path is via `(hash)`.  e.g. a percent sign like `(hash)` --> `%a93jDj39sdH...`\n\n### Path overlays\n* It would be easy make an overlay view of different path prefixes (\"folders\") within a Storage\n* Or overlay two Storage instances\n* For example you could combine `/wiki/~@a.xxxx` and `/wiki/~@b.xxxx` into one namespace\n","readmeFilename":"README.md","gitHead":"d62239cdc811155729eb11e4ce3a744efa4dd1c2","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@6.0.0-beta.0","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-d8aWbsoWuElP7CMvdXZiOeG7Bi4u/goCcQ5xdbK8EWeNTaVJlvEppufv5IJoWzp4glVnIMxKD9FOWz68a59BGA==","shasum":"9166cf1e88d4a588b34f7f32f74f3d6fa60e7bc8","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.0.0-beta.0.tgz","fileCount":93,"unpackedSize":6500175,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfyBgLCRA9TVsSAnZWagAAeRUP/iwK4ne5kv4PH6FWzzKi\nd9w/hUcKKN5sPxOxLilichh3pfedOXQNJxnuoPRVijYFqDMBK/7pBIFqA4kg\nQR5OHBURsVlbL6JrIdCbQ8zMWZXaUptCMBBjhtfPNzeTTitmAB/x+3orqTyD\nW8LVHg8k5rFzksV2Zg5Dv5p9MhoTE5CTpdT91LJaAy0kwv97Agj8rwjQ7tjT\nP/UHph2YkhkoLTOizvlg44aQfs3l+tz791n55TfxGBUJXFety66I5RS3SVnQ\nQLORZG0rO4PEsG+3Wyio539KwUCqJysqnoPkcNp5PDa+cXvNZ7HyeyKwZgM4\n+ebrzzL9jcCDfiqzFL+om9E01FM3v85Y3Vb6ko1idzZu/ZRFTEB7M+XYHE5+\nhVhZ1aONw76BNTJLSrdxeIyNO6vL/lfrWDArzYhDRqDT4Gu4jtG77ghFgDyZ\nwhoVoPYH77vAgOrYj73H2TKwmyXMGDkSOqvRjN08BDE1FDI7eNfO4pXIoRoQ\nxL4Pomt6qwKEB7IO2ILY1GH1YIYXmTMXrohaTZ5pguRRr9DqAHV4J5zqt01y\nvpfb+5I3V7en/wXEuxISBTk1sTI6qwwxP39F7Zvu6Nn2rkv0ph2Y0YLhzHhL\nLCbtYEbnyunWnLpJHkueWWfeDVYt0+EM+J1iDfzgq64pHXBrk2JNj4Qd2krJ\n3XB0\r\n=wlif\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDTrlWYaegwZtbFFurLTJ873RTTOf7mw/nms+vqkL4AxAIgNHI5dlgsG+5Mo29bWu0EUkcS6CLAxVQsrLNvu3fCNaI="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"sgwil","email":"gwilym@me.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.0.0-beta.0_1606948874945_0.05687298348331993"},"_hasShrinkwrap":false},"6.0.0-beta.1":{"name":"earthstar","version":"6.0.0-beta.1","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-storageAsync":"tap -Rspecy --jobs=1 build/test/storageAsync.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","bench":"node --expose-gc build/test/benchmark.js | tee benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/lodash.debounce":"^4.0.6","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.19.2","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chalk":"^4.1.0","chloride":"^2.2.14","concurrency-friends":"^0.2.0","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","multibase":"^0.7.0","tslib":"^2.0.0"},"readme":"# Earthstar\n\n![](docs/earthstar-wordmark.png)\n\n## An offline-first, distributed, syncable, embedded document database for use in p2p software -- in browsers and outside of browsers\n\n## Community / how to contribute\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) and [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)\n\nChatroom: [`#earthstar:matrix.org`](https://matrix.to/#/!oGfoMKqZnBVrJYjebW:matrix.org)\n\n## Links and docs\n\nDocs for everyone:\n* **[A Guided Tour of Earthstar](docs/tour.md)** -- Slides and diagrams explaining how it works\n\nDocs for app developers:\n* [Overview for developers](docs/overview.md) -- A quick comparison between Earthstar, CouchDB, and SSB\n* [Rules of Earthstar](docs/rules-of-earthstar.md) -- The scope of the project, and details of the technical invariants of the distributed system.\n* [Tutorial](docs/tutorial.md) -- Make a Todo list app, step by step\n\nDocs for core Earthstar developers:\n* [Earthstar Specification](docs/specification.md) -- All you need to know to write an Earthstar implementation from scratch\n* [About syncing](docs/syncing.md) -- Exploring this topic in more detail\n* [About fancy conflict resolution](docs/fancy-conflict-resolution.md) -- How to add more complex conflict tracking on top of Earthstar\n* [About timestamps](docs/timestamps.md) -- Exploring the limits of Earthstar's assumptions about timestamps\n* [Urls](docs/urls.md) -- How to build URLs related to Earthstar\n\nRelated repos:\n* [earthstar-cli](https://github.com/earthstar-project/earthstar-cli) -- Command line utility\n* [earthstar-pub](https://github.com/earthstar-project/earthstar-pub) -- Server to help you sync\n* [earthstar-graphql](https://github.com/earthstar-project/earthstar-graphql) -- A GraphQL layer for handling Earthstar data\n\nDemo apps:\n* [earthstar-lobby](https://github.com/sgwilym/earthstar-lobby/) -- A guestbook.  [Try it here](https://earthstar-lobby.vercel.app/)\n* [earthstar-wiki](https://github.com/earthstar-project/earthstar-wiki) -- An example app built with Earthstar (deprecated)\n* [earthstar-os](https://github.com/earthstar-project/earthstar-os) -- A toolkit for hosting and using Earthstar apps in the browser (deprecated)\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n**Contents**\n\n- [What kinds of apps can you build with Earthstar?](#what-kinds-of-apps-can-you-build-with-earthstar)\n- [Motivation](#motivation)\n- [Data model](#data-model)\n- [Block diagram](#block-diagram)\n- [Scope, typical usage](#scope-typical-usage)\n- [Editing data; multiple users and devices; conflicts](#editing-data-multiple-users-and-devices-conflicts)\n- [Security properties](#security-properties)\n- [Comparisons](#comparisons)\n- [Use cases](#use-cases)\n- [What doesn't it do?](#what-doesnt-it-do)\n- [Example](#example)\n- [Details and notes](#details-and-notes)\n  - [Signatures](#signatures)\n  - [Sync over duplex streams:](#sync-over-duplex-streams)\n  - [Sync over HTTP when only one peer is publicly available:](#sync-over-http-when-only-one-peer-is-publicly-available)\n  - [HTTP API](#http-api)\n- [Future plans](#future-plans)\n  - [Immutable documents by putting \"(hash)\" in the path](#immutable-documents-by-putting-hash-in-the-path)\n  - [Path overlays](#path-overlays)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## What kinds of apps can you build with Earthstar?\n\nTools for collaborating with groups of people.  See [Use-cases](#Use-cases), below.\n\n## Motivation\n\nCentralized services like Facebook have lots of problems: privacy, surveillance, addiction, dark patterns, ads, \"real name\" policies that harm minority groups, poor handling of moderation, bots, ...\n\nThese problems come from 2 root causes:\n* They have a **profit motive**, so their purpose is to extract value from users.\n* They're **big**, so they're a bureaucracy that can't understand the nuances of the diverse world population they serve, and they're unresponsive to demands from their users.\n\nWe'd be better off with communication services that are:\n* **Not for profit** - run by volunteers on small, cheap servers\n* **Small** - close to their users, locally governed, more democratic, understanding local norms and culture\n\nThis is the \"federated\" model, like Mastodon: instead of one big Twitter, make a thousand small Twitters.\n\nBut this has problems too -- volunteer-run servers don't last forever, and when they shut down their users lose their communities.\n\nEarthstar goes one step further: you can communicate without servers at all, directly from device to device; or you can run Earthstar on [servers (\"called pubs\")](https://github.com/cinnamon-bun/earthstar-pub) which help sync your data but have no authority over your account.  You can easily run your own servers for yourself and your friends.  Instructions coming soon.\n\nAll the authority in the system rests in the users and is enforced by cryptography, not central servers.  Since servers only exist to help with syncing, and your data and identity are independent of the servers, you can easily use as many or as few servers as you want, and move between them without losing anything.\n\nEarthstar's philosophy is that **apps should be tools, not services**.  Authority no longer rests in a central server, it rests in each user.\n\n## Data model\n\nAn Earthstar workspace holds mutable **documents** with unique **paths** (ids), similar to leveldb or CouchDb.\n\nWithin each **path**, we keep the newest version of that **document** from each author.  We discard old versions of a document from the same author.\n\nIn other words, it's a mapping from `(path, author)` to `latest version of the document at that path, from that author`.\n\nThe newest document (from any author) is considered the winner of a conflict.  More details below in the \"Editing data\" section.\n\nThere are no transactions.  The unit of atomic change is the document.\n\n![](docs/earthstar-data-model.png)\n\n## Block diagram\n\nSimplified diagram of the entire system.  The dashed boxes are not implemented yet.\n\n![](docs/block-diagram.png)\n\nA more detailed look at this Javascript implementation:\n\n![](docs/building-blocks.png)\n\n## Scope, typical usage\n\nEach user will have their own instance of an Earthstar database in whatever app they're using -- in the browser or native.  There might also be some instances on cloud servers (\"pubs\").  The databases can sync with each other across HTTP or duplex stream connections.\n\nEach database instance can hold a subset of the entire data, specified by a query such as \"paths starting with a certain substring\", \"paths written after a certain timestamp\", etc.\n\nThe universe of data is divided into **workspaces** -- collections of documents accessed by certain users.  Syncing happens one workspace at a time.\n\nRead the [vocabulary and concepts](docs/vocabulary.md) documentation for more about workspaces.\n\n## Editing data; multiple users and devices; conflicts\n\nA single author can use multiple devices at the same time.  You \"log into\" a device by providing your public and private key, like a username and password.\n\nData is mutable.  Authors can update paths with new documents.  The old data is thrown away and doesn't take up space.  You can \"delete\" data by overwriting it with an empty document.\n\nThere is a write permission system to allow only certain authors to write to certain paths.  Other paths can be written by anyone.\n\nSoon, there will also be a way to write immutable messages, for use cases where you need those.\n\nConflicts from a single author (on multiple devices) are resolved by timestamp and the old data is discarded.  Conflicts from multiple authors are resolved by timestamp by default, but the old data is kept to allow for manual conflict resolution if needed.\n\n## Security properties\n\nEach author is identified by a public key.\n\nData updates are signed by the author, so it's safe for untrusted peers to help host and propagate data.  (Soon) you will also be able to encrypt data so untrusted peers can host it without reading it.\n\nMalicious peers can:\n* Withold updates to individual documents during a sync\n* See the data (until encryption is implemented, soon)\n* Know which peers they're connecting to\n\nMalicious peers cannot:\n* Alter documents from another author\n* Forge new documents signed by another author\n\nAlthough malicious peers can withold individual documents, as long as there are honest peers around you will eventually get the latest verison of everything.\n\nBecause it allows partial sync and mutation of data, Earthstar doesn't cryptographically guarantee that you have a complete dataset with no gaps from a certain author.  Authors could chose to use sequential paths or embed a blockchain of hash backlinks into their messages, and you could verify these in your app (outside of Earthstar).\n\n## Comparisons\n\nLike leveldb, but:\n* multi-author\n* it syncs\n\nLike CouchDb, but:\n* with signatures and encryption, so untrusted nodes can help move data around.\n\nLike Scuttlebutt, but:\n* one author can use multiple devices\n* data is mutable\n* instead of an append-only log, it's a set of mutable items\n* supports partial replication\n* will sync over HTTP, not just TCP, so it's easy to host in places like Glitch.com\n* has less strict data guarantees -- you can't tell if you have someone's entire dataset or not\n\nLike DAT, but:\n* multi-author, multi-device\n* simpler\n* communicates over HTTP, making it easier to deploy pub servers and run in regular browsers\n* instead of an append-only log, it's a set of mutable items\n\nLike IPFS, but:\n* multi-author, multi-device\n* mutable\n* documents are signed by the author\n* currently more focused on pub servers for replication and not DHT swarms, although swarm support is coming\n\nLike Firebase, but:\n* open source\n* distributed\n\nSometimes immutability is needed, like if you're running a package registry or want an audit log.  For social-network style use cases, though, immutability can be a privacy liability instead of a desirable guarantee.\n\n## Use cases\n\nEarthstar can be used for invite-only tools where you have all the data (think Slack) and large open-world tools where you only replicate part of the entire dataset (think SSB).  Apps tell Earthstar what paths and what authors to replicate.\n\nThese styles of app could be built on top of Earthstar:\n* wikis\n* chat: Slack, IRC\n* social: Facebook, Scuttlebutt, Discourse, LiveJournal, Forums\n* microblogging: Twitter, Mastodon\n* productivity: Trello, GitHub Issues, Asana, Todo lists\n* office: Google sheets\n* art: Collaborative drawing or music tools, multi-user Twine for making interactive fiction games\n\n## What doesn't it do?\n\nEarthstar's conflict resolution chooses entire document versions as winners, it doesn't merge versions together.  This means it's a poor choice for simultaneous multi-user editing of large text documents.  For that, you could use a fancier CRDT like Automerge and rely on Earthstar to move and sync the patches it produces.  Or you can design apps to store large documents as smaller pieces, like paragraphs, or design other ways to collaborate such as comments or chat where people don't simultaneously edit the same text.\n\nIt will eventually stream live changes, but it doesn't yet.  For now, syncing is done on demand.\n\nThe cryptography is not audited yet.  It's based on libsodium which is also used by Scuttlebutt and many other projects.\n\nEarthstar is more focused on autonomy than on anonymity.  It doesn't have perfect forward secrecy.  Your messages are signed by your key so it's easy to prove which identity said something.  We try to reduce IP address exposure etc, but if you have a serious need for anonymity you should layer it on something like Tor or use other tools that are anonymity-focused.\n\nEarthstar doesn't provide transactions or causality guarantees.\n\nModeration and blocking support is not figured out yet but it's important and we'll get there eventually.  In the meantime, apps can layer their own moderation and blocking support on top of Earthstar.\n\n## Example\n\nThe main interface to Earthstar is the Storage class:\n\n```ts\nexport interface IStorage {\n    // A Storage instance holds the documents of a single workspace.\n    // To construct one, you need to supply\n    //   * a workspace address\n    //   * a list of Validator classes, for the document formats you want to support\n    //   * various other options such as database filenames, specific to that kind of Storage\n\n    // The workspace held in this Storage object.\n    workspace: WorkspaceAddress;\n\n    // onChange is called whenever any data changes:\n    //   * after every set()\n    //   * after every ingestDocument()\n    //   * after each document obtained during a sync (because that happens via ingestDocument())\n    // It doesn't yet send any details about the changes to the callback, but it should.\n    // Subscribe with onChange.subscribe(...cb...);\n    onChange: Emitter<undefined>;\n\n    // QUERYING\n    // Return the documents that match the query.\n    // Default sort is path ASC, then timestamp DESC (newest first within same path)\n    //  but query objects will eventually include sort options.\n    documents(query?: QueryOpts): Document[];\n    // Same as documents(), but only return the distinct paths of the matching documents (duplicates removed).\n    paths(query?: QueryOpts): string[];\n    // Same as documents(), but only return the content properties of the matching documents.\n    contents(query?: QueryOpts): string[];\n\n    // List of authors that have ever written in this workspace.\n    authors(now?: number): AuthorAddress[];\n\n    // INDIVIDUAL DOCUMENT LOOKUP\n    // Get one document by path.\n    // Only returns the most recent document at this path.\n    // To get older docs at this path (from other authors), do a query.\n    getDocument(path: string, now?: number): Document | undefined;\n    // Same as getDocument(path).content -- just the content of that document\n    getContent(path: string, now?: number): string | undefined;\n\n    // WRITING\n    // Write a document.\n    // To do this you need to know an author's private key, which is part of the keypair object.\n    // The DocToSet type is similar but smaller than a regular document:\n    //   format: which document format to use\n    //   path\n    //   content\n    //   timestamp: optional.  If absent or zero, the current time is set for you\n    //   - no workspace -- this Storage object knows what workspace it is\n    //   - no author -- it's provided in the keypair argument\n    //   - no signature -- it will be signed for you\n    // Timestamps should only be set manually for testing purposes.  Normally they should be\n    // omitted so they default to now.\n    // The timestamp will also be increased so that it's greater than any previous doc\n    // at the same path (from any author), to guarantee that this write will be the conflict winner.\n    //\n    // now should usually be omitted; it's used for testing and defaults to Date.now()*1000\n    set(keypair: AuthorKeypair, docToSet: DocToSet, now?: number): WriteResult | ValidationError;\n\n    // Save a document from an external source to this Storage instance.\n    // The document must be already signed.\n    // This is mostly used for syncing.\n    //\n    // now should usually be omitted; it's used for testing and defaults to Date.now()*1000\n    ingestDocument(doc: Document, now?: number): WriteResult | ValidationError;\n\n    // Internal helper method to do a one-way pull sync.\n    _syncFrom(otherStore: IStorage, existing: boolean, live: boolean): number;\n\n    // TODO: add now? param to _syncFrom and sync\n\n    // Two-way sync to another local Storage instance running in the same process.\n    // This is not network-aware.  Network sync is handled by the Syncer class.\n    sync(otherStore: IStorage, opts?: SyncOpts): SyncResults;\n\n    // TODO: Delete data locally.  This deletion will not propagate.\n    // forget(query : QueryOpts) : void;  // same query options as paths()\n\n    // Close this storage.\n    // All functions called after this will throw a StorageIsClosedError,\n    // except you can call close() as many times as you want.\n    // Once closed, a Storage instance cannot be opened again.\n    // TODO: what happens when a long-running process like a sync is happening, and the Storage is closed?\n    close() : void;\n    // Find out if the storage is closed.\n    isClosed() : boolean;\n}\n```\n\nUsage example ([readme-example.ts](src/readme-example.ts)):\n```ts\nimport {\n    StorageMemory,\n    ValidatorEs4,\n    generateAuthorKeypair,\n    isErr,\n} from 'earthstar';\n\n// Create a database for a particular workspace, '+gardening.xxxxxxxx'\n// We've chosen to use the latest 'es.4' feed format so we supply the matching validator.\nlet storage = new StorageMemory([ValidatorEs4], '+gardening.xxxxxxxx');\n\n// Users are called \"authors\".\n// Let's make up some authors for testing.\n// A keypair is { address: '@aaaa.xxx', secret: 'xxx' }.\n// (xxx represents base32-encoded ed25519 keys)\nlet keypair1 = generateAuthorKeypair('aaaa');\nlet keypair2 = generateAuthorKeypair('bbbb');\nif (isErr(keypair1)) { throw \"oops\"; }  // error could happen if our author shortname broke the rules\nif (isErr(keypair2)) { throw \"oops\"; }\nlet author1 = keypair1.address;\nlet author2 = keypair2.address;\n\n// You can set documents at specific paths, like a filesystem or key-value store.\nstorage.set(keypair1, { format: 'es.4', path: '/wiki/Strawberry', content: 'Tasty' });\nstorage.getContent('/wiki/Strawberry'); // --> 'Tasty'\n\n// One author can use multiple devices with no problems.\n// Conflicts are resolved by timestamp.\n// Here the same author overwrites their previous document,\n// which is forgotten from the database.\nstorage.set(keypair1, { format: 'es.4', path: '/wiki/Strawberry', content: 'Tasty!!' });\nstorage.getContent('/wiki/Strawberry'); // --> 'Tasty!!'\n\n// Multiple authors can overwrite each other (also by timestamp).\n// Here author 2 writes to the same path.\nstorage.set(keypair2, { format: 'es.4', path: '/wiki/Strawberry', content: 'Yum' });\nstorage.getContent('wiki/Strawberry'); // --> 'Yum'\n\n// Within a path we keep the most-recent document from each author,\n// in case we need to do better conflict resolution later.\n// To see the old versions, use a query:\nstorage.contents({ path: '/wiki/Strawberry', includeHistory: true });\n// --> ['Yum', 'Tasty!!']  // newest first\n\n// Get the entire document to see all the metadata as well as the content.\nstorage.getDocument('/wiki/Strawberry');\n// --> {\n//     format: 'es.4',\n//     workspace: '+gardening.xxxxxxxx',\n//     path: '/wiki/Strawberry',\n//     content: 'Yum',\n//     author: '@bbbb.xxxxxxx',\n//     timestamp: 1596676583283000,  // time in microseconds: Date.now()*1000\n//     signature: 'xxxxxxxx',\n// }\n\n// WRITE PERMISSIONS\n//\n// Paths can specify which authors are allowed to write to them.\n// Author names in a path prefixed by '~' can write to that path.\n//\n// Examples:\n// (in these docs, \"xxx\" is shorthand for a long public key)\n// One author write permission:\n//   '/about/~@aaaa.xxx/name'  -- only @aaaa.xxx can write here.\n//   '/about/~@aaaa.xxx/follows/@bbbb.xxx'  -- only @aaaa.xxx can write here\n// Public:\n//   '/wall/@aaaa.xxx'  -- no tilde, so anyone can write here\n//   '/wiki/Kittens'  -- no tilde, so anyone can write here\n// Multiple authors:\n//   '/whiteboard/~@aaaa.xxx~@bbbb.xxx'  -- both @aaaa.xxx and @bbbb.xxx can write here\n//\n// Here we'll set the author's display name by writing to their profile document.\nstorage.set(keypair1, {\n    format: 'es.4',\n    path: '/about/~' + keypair1.address + '/profile.json',\n    content: JSON.stringify({displayName: 'Suzie'}),\n});\n\n// You can do leveldb style queries.\nstorage.paths()\nstorage.paths({ lowPath: '/abc', limit: 100 })\nstorage.paths({ pathPrefix: '/wiki/' })\n\n// You can sync to another Storage that has the same workspace address\nlet storage2 = new StorageMemory([ValidatorEs4], '+gardening.xxxxxxxx');\nstorage.sync(storage2);\n// Now storage and storage2 are identical.\n\n// Get notified when anything changes.\nlet unsub = storage.onChange.subscribe(() => console.log('something changed'));\n\n// Later, you can turn off your subscription.\nunsub();\n```\n\n----\n\n## Details and notes\n\n**NOTE** The rest of this README is somewhat out of date!\n\n### Signatures\n\nDocument hashes are used within signatures and could be used to link to specific versions of a doc.\n\nThere's a simple canonical way to hash a document.  See [docs/serialization-and-hashing.md](Serialization and Hashing) for details.\n\nTo sign a doc, you sign its hash with the author's secret key.\n\nNote that docs only ever have to get transformed INTO this representation just before hashing -- we never need to convert from this representation BACK into a real doc -- so it can be nice and simple.\n\nThere is no canonical encoding for storage or networking - only the canonical hash encoding, above.  Databases and network code can represent the doc in any way they want.\n\nThe hash and signature specification may change as the schema evolves beyond `es.4`.  For example there may be another schema `ssb.1` which wraps and embeds SSB messages and knows how to validate their signatures.\n\n### Sync over duplex streams:\n\nHere's a very simple but inefficient algorithm to start with:\n\n```\n    sort paths by (path, timestamp DESC, signature ASC)\n    filter by my interest query\n    while true:\n        both sides send next 100 docs to each other as (path, timestamp, signature)\n        both sides figure out what the other needs and send it in full\n        both sides send 'ok'\n```\n\n### Sync over HTTP when only one peer is publicly available:\n\nHere's a very simple but inefficient algorithm to start with:\n\n```\n    the client side is in charge and does these actions:\n    sort paths by (path, timestamp DESC, signature ASC)\n    filter by my interest query\n    GET /interest-query   the server's interest query\n    while true:\n        GET /doc-versions?after='foo/bar'&limit=100 from server\n        compare with my own docs\n        pull things I need\n            POST /batch-get-docs       paths=[foo, foo/a, foo/b, ...]\n        push things they need:\n            POST /batch-ingest-docs    docs=[ {...}, {...} ]\n```\n\nNote that everything happens in batches instead of infinite streams.  The code avoids using streams.\n\nFor *efficient* sync, we'll use something similar to [this set reconciliation algorithm described by Aljoscha Meyer](https://github.com/AljoschaMeyer/set-reconciliation/).\n\n### HTTP API\n\nThis is out of date -- See earthstar-pub for the latest\n\n```\nHTTP replication:\n\nGET /interest-query   the server's interest query\n    return a list of query objects -- what does the server want?\nGET /doc-versions [after='...'] [limit=100] [before='...']\n    return array of docs with just path, version, first N bytes of signature\nPOST /batch-get-docs       paths=[foo, foo/a, foo/b, ...]\n    return complete docs\nPOST /batch-ingest-docs    docs=[ {...}, {...} ]\n    ask server to write these docs\n    return 'ok' or error\n```\n\n## Future plans\n\n### Immutable documents by putting \"(hash)\" in the path\nYou'll be able to put the literal string \"`(hash)`\" in a path.  It will be replaced with the hash of that document.  Since no other document can have the same path, it will be impossible to overwrite or delete this document, making it immutable.\n\n* Signatures are based on the shorthand path\n* Upon ingestion to the db, replace `(hash)` with the actual hash of the document\n* Database lookups use the full expanded path\n* Across the network, we only need to send the shorthand path.  The expanded path is derived state.\n* `(hash)` lets you create docs that can never be overwritten, because you can never make another doc with the same hash.\n* The expanded path needs to contain a character that's not allowed in regular paths, so the only way to get that path is via `(hash)`.  e.g. a percent sign like `(hash)` --> `%a93jDj39sdH...`\n\n### Path overlays\n* It would be easy make an overlay view of different path prefixes (\"folders\") within a Storage\n* Or overlay two Storage instances\n* For example you could combine `/wiki/~@a.xxxx` and `/wiki/~@b.xxxx` into one namespace\n","readmeFilename":"README.md","gitHead":"b879490ee535d9b1e1ea969cb8b2ce2e4abc6431","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@6.0.0-beta.1","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-KDulIwaily4A0CMEdAyXwX2TSxS734Qdmj4QOpTndXQT3Wo27LVjeSJPXDKMpIvxgklQuRzEEbMMzvrw4QZ/pA==","shasum":"42ae2eef04e8e828d7a8ce9ccb3fbaa9fd18250f","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.0.0-beta.1.tgz","fileCount":93,"unpackedSize":6500406,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfyCgLCRA9TVsSAnZWagAAdcAP/00Aztvst1eYILvevWhV\nwDKEO8ajgJBje16LRcOzSd8LiRoW009RmgQHXyoFIMv9plLszXT9EH8PF5Kb\nrAsaF5TcPfKfynBMkNF11zNBwHymRDjk/cU6SFu3SU1EnW3zEsd4GSeEhoqA\ny+uwdp/Cw9XhM70qXBEWQQ+5yeNwSrwFY4vdi81HZxDszb7YXJ8T//e27lI4\n6bPiUKm/iIEKBLVBcweQqfUBt2RBQ2PhlBUXB9YHSu1K8jSw13VL3hqGnJUJ\nZVDrxAXFnZee3jA5UTVGR3ls+twVwerDav4bLNea595Oun7ymkIh2CiHoiud\nS7E0yR4qpVRIwp+A2j7ezaWJZTY2O7wW+tdbuLQQiPDyTmjj32wavTH1qvNe\n5j9kabzlCo6TJ59I1t4frGjjQVCKGlNrau17Oh7oNF1wjikbxcChbMC2ZJWD\nhzlyUShd08D6lCTjFRJyyn4BWoKptD2Win0CybT+Kg9dAJ16FJvqDdGUgHRT\nmuZTOQCtirEiziLAtOLDWc/w0x//IkbuVC1Q1wWEEHCa4qOz/ieEuSi2Yi8N\nuZ74LDFZ2W2ufziTchXaqQR6Tvpczk00BEUU4DH0XLtw1kqqiLI6WJa+4bjO\nrULZ1ndzpNfEtB/UzVXIimKDF8SGsmk99oFwoaJlI5SvvOtPeUBB0TlCmDtg\n9v4m\r\n=COcr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHOkWxEQfbxQ6A6z2w3UGC6HMZWcQLL30lMtazL+6R0uAiEAgjAeOac/x3X8JE5ehZgIF04UbA/xN0bUCLd3wxiboZw="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"sgwil","email":"gwilym@me.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.0.0-beta.1_1606952970837_0.7056748477194599"},"_hasShrinkwrap":false},"6.0.0-beta.2":{"name":"earthstar","version":"6.0.0-beta.2","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-storageAsync":"tap -Rspecy --jobs=1 build/test/storageAsync.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.1","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.10","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.2.3","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.19.2","typescript":"^4.1.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","@types/multibase":"^0.6.0","bencode":"^2.0.1","better-sqlite3":"^7.1.1","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^0.2.0","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","multibase":"^2.0.0","tslib":"^2.0.3"},"readme":"# Earthstar\n\n![](docs/earthstar-wordmark.png)\n\n## An offline-first, distributed, syncable, embedded document database for use in p2p software -- in browsers and outside of browsers\n\n## Community / how to contribute\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) and [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)\n\nChatroom: [`#earthstar:matrix.org`](https://matrix.to/#/!oGfoMKqZnBVrJYjebW:matrix.org)\n\n## Links and docs\n\nDocs for everyone:\n* **[A Guided Tour of Earthstar](docs/tour.md)** -- Slides and diagrams explaining how it works\n\nDocs for app developers:\n* [Overview for developers](docs/overview.md) -- A quick comparison between Earthstar, CouchDB, and SSB\n* [Rules of Earthstar](docs/rules-of-earthstar.md) -- The scope of the project, and details of the technical invariants of the distributed system.\n* [Tutorial](docs/tutorial.md) -- Make a Todo list app, step by step\n\nDocs for core Earthstar developers:\n* [Earthstar Specification](docs/specification.md) -- All you need to know to write an Earthstar implementation from scratch\n* [About syncing](docs/syncing.md) -- Exploring this topic in more detail\n* [About fancy conflict resolution](docs/fancy-conflict-resolution.md) -- How to add more complex conflict tracking on top of Earthstar\n* [About timestamps](docs/timestamps.md) -- Exploring the limits of Earthstar's assumptions about timestamps\n* [Urls](docs/urls.md) -- How to build URLs related to Earthstar\n\nRelated repos:\n* [earthstar-cli](https://github.com/earthstar-project/earthstar-cli) -- Command line utility\n* [earthstar-pub](https://github.com/earthstar-project/earthstar-pub) -- Server to help you sync\n* [earthstar-graphql](https://github.com/earthstar-project/earthstar-graphql) -- A GraphQL layer for handling Earthstar data\n\nDemo apps:\n* [earthstar-lobby](https://github.com/sgwilym/earthstar-lobby/) -- A guestbook.  [Try it here](https://earthstar-lobby.vercel.app/)\n* [earthstar-wiki](https://github.com/earthstar-project/earthstar-wiki) -- An example app built with Earthstar (deprecated)\n* [earthstar-os](https://github.com/earthstar-project/earthstar-os) -- A toolkit for hosting and using Earthstar apps in the browser (deprecated)\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n**Contents**\n\n- [What kinds of apps can you build with Earthstar?](#what-kinds-of-apps-can-you-build-with-earthstar)\n- [Motivation](#motivation)\n- [Data model](#data-model)\n- [Block diagram](#block-diagram)\n- [Scope, typical usage](#scope-typical-usage)\n- [Editing data; multiple users and devices; conflicts](#editing-data-multiple-users-and-devices-conflicts)\n- [Security properties](#security-properties)\n- [Comparisons](#comparisons)\n- [Use cases](#use-cases)\n- [What doesn't it do?](#what-doesnt-it-do)\n- [Example](#example)\n- [Details and notes](#details-and-notes)\n  - [Signatures](#signatures)\n  - [Sync over duplex streams:](#sync-over-duplex-streams)\n  - [Sync over HTTP when only one peer is publicly available:](#sync-over-http-when-only-one-peer-is-publicly-available)\n  - [HTTP API](#http-api)\n- [Future plans](#future-plans)\n  - [Immutable documents by putting \"(hash)\" in the path](#immutable-documents-by-putting-hash-in-the-path)\n  - [Path overlays](#path-overlays)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## What kinds of apps can you build with Earthstar?\n\nTools for collaborating with groups of people.  See [Use-cases](#Use-cases), below.\n\n## Motivation\n\nCentralized services like Facebook have lots of problems: privacy, surveillance, addiction, dark patterns, ads, \"real name\" policies that harm minority groups, poor handling of moderation, bots, ...\n\nThese problems come from 2 root causes:\n* They have a **profit motive**, so their purpose is to extract value from users.\n* They're **big**, so they're a bureaucracy that can't understand the nuances of the diverse world population they serve, and they're unresponsive to demands from their users.\n\nWe'd be better off with communication services that are:\n* **Not for profit** - run by volunteers on small, cheap servers\n* **Small** - close to their users, locally governed, more democratic, understanding local norms and culture\n\nThis is the \"federated\" model, like Mastodon: instead of one big Twitter, make a thousand small Twitters.\n\nBut this has problems too -- volunteer-run servers don't last forever, and when they shut down their users lose their communities.\n\nEarthstar goes one step further: you can communicate without servers at all, directly from device to device; or you can run Earthstar on [servers (\"called pubs\")](https://github.com/cinnamon-bun/earthstar-pub) which help sync your data but have no authority over your account.  You can easily run your own servers for yourself and your friends.  Instructions coming soon.\n\nAll the authority in the system rests in the users and is enforced by cryptography, not central servers.  Since servers only exist to help with syncing, and your data and identity are independent of the servers, you can easily use as many or as few servers as you want, and move between them without losing anything.\n\nEarthstar's philosophy is that **apps should be tools, not services**.  Authority no longer rests in a central server, it rests in each user.\n\n## Data model\n\nAn Earthstar workspace holds mutable **documents** with unique **paths** (ids), similar to leveldb or CouchDb.\n\nWithin each **path**, we keep the newest version of that **document** from each author.  We discard old versions of a document from the same author.\n\nIn other words, it's a mapping from `(path, author)` to `latest version of the document at that path, from that author`.\n\nThe newest document (from any author) is considered the winner of a conflict.  More details below in the \"Editing data\" section.\n\nThere are no transactions.  The unit of atomic change is the document.\n\n![](docs/earthstar-data-model.png)\n\n## Block diagram\n\nSimplified diagram of the entire system.  The dashed boxes are not implemented yet.\n\n![](docs/block-diagram.png)\n\nA more detailed look at this Javascript implementation:\n\n![](docs/building-blocks.png)\n\n## Scope, typical usage\n\nEach user will have their own instance of an Earthstar database in whatever app they're using -- in the browser or native.  There might also be some instances on cloud servers (\"pubs\").  The databases can sync with each other across HTTP or duplex stream connections.\n\nEach database instance can hold a subset of the entire data, specified by a query such as \"paths starting with a certain substring\", \"paths written after a certain timestamp\", etc.\n\nThe universe of data is divided into **workspaces** -- collections of documents accessed by certain users.  Syncing happens one workspace at a time.\n\nRead the [vocabulary and concepts](docs/vocabulary.md) documentation for more about workspaces.\n\n## Editing data; multiple users and devices; conflicts\n\nA single author can use multiple devices at the same time.  You \"log into\" a device by providing your public and private key, like a username and password.\n\nData is mutable.  Authors can update paths with new documents.  The old data is thrown away and doesn't take up space.  You can \"delete\" data by overwriting it with an empty document.\n\nThere is a write permission system to allow only certain authors to write to certain paths.  Other paths can be written by anyone.\n\nSoon, there will also be a way to write immutable messages, for use cases where you need those.\n\nConflicts from a single author (on multiple devices) are resolved by timestamp and the old data is discarded.  Conflicts from multiple authors are resolved by timestamp by default, but the old data is kept to allow for manual conflict resolution if needed.\n\n## Security properties\n\nEach author is identified by a public key.\n\nData updates are signed by the author, so it's safe for untrusted peers to help host and propagate data.  (Soon) you will also be able to encrypt data so untrusted peers can host it without reading it.\n\nMalicious peers can:\n* Withold updates to individual documents during a sync\n* See the data (until encryption is implemented, soon)\n* Know which peers they're connecting to\n\nMalicious peers cannot:\n* Alter documents from another author\n* Forge new documents signed by another author\n\nAlthough malicious peers can withold individual documents, as long as there are honest peers around you will eventually get the latest verison of everything.\n\nBecause it allows partial sync and mutation of data, Earthstar doesn't cryptographically guarantee that you have a complete dataset with no gaps from a certain author.  Authors could chose to use sequential paths or embed a blockchain of hash backlinks into their messages, and you could verify these in your app (outside of Earthstar).\n\n## Comparisons\n\nLike leveldb, but:\n* multi-author\n* it syncs\n\nLike CouchDb, but:\n* with signatures and encryption, so untrusted nodes can help move data around.\n\nLike Scuttlebutt, but:\n* one author can use multiple devices\n* data is mutable\n* instead of an append-only log, it's a set of mutable items\n* supports partial replication\n* will sync over HTTP, not just TCP, so it's easy to host in places like Glitch.com\n* has less strict data guarantees -- you can't tell if you have someone's entire dataset or not\n\nLike DAT, but:\n* multi-author, multi-device\n* simpler\n* communicates over HTTP, making it easier to deploy pub servers and run in regular browsers\n* instead of an append-only log, it's a set of mutable items\n\nLike IPFS, but:\n* multi-author, multi-device\n* mutable\n* documents are signed by the author\n* currently more focused on pub servers for replication and not DHT swarms, although swarm support is coming\n\nLike Firebase, but:\n* open source\n* distributed\n\nSometimes immutability is needed, like if you're running a package registry or want an audit log.  For social-network style use cases, though, immutability can be a privacy liability instead of a desirable guarantee.\n\n## Use cases\n\nEarthstar can be used for invite-only tools where you have all the data (think Slack) and large open-world tools where you only replicate part of the entire dataset (think SSB).  Apps tell Earthstar what paths and what authors to replicate.\n\nThese styles of app could be built on top of Earthstar:\n* wikis\n* chat: Slack, IRC\n* social: Facebook, Scuttlebutt, Discourse, LiveJournal, Forums\n* microblogging: Twitter, Mastodon\n* productivity: Trello, GitHub Issues, Asana, Todo lists\n* office: Google sheets\n* art: Collaborative drawing or music tools, multi-user Twine for making interactive fiction games\n\n## What doesn't it do?\n\nEarthstar's conflict resolution chooses entire document versions as winners, it doesn't merge versions together.  This means it's a poor choice for simultaneous multi-user editing of large text documents.  For that, you could use a fancier CRDT like Automerge and rely on Earthstar to move and sync the patches it produces.  Or you can design apps to store large documents as smaller pieces, like paragraphs, or design other ways to collaborate such as comments or chat where people don't simultaneously edit the same text.\n\nIt will eventually stream live changes, but it doesn't yet.  For now, syncing is done on demand.\n\nThe cryptography is not audited yet.  It's based on libsodium which is also used by Scuttlebutt and many other projects.\n\nEarthstar is more focused on autonomy than on anonymity.  It doesn't have perfect forward secrecy.  Your messages are signed by your key so it's easy to prove which identity said something.  We try to reduce IP address exposure etc, but if you have a serious need for anonymity you should layer it on something like Tor or use other tools that are anonymity-focused.\n\nEarthstar doesn't provide transactions or causality guarantees.\n\nModeration and blocking support is not figured out yet but it's important and we'll get there eventually.  In the meantime, apps can layer their own moderation and blocking support on top of Earthstar.\n\n## Example\n\nThe main interface to Earthstar is the Storage class:\n\n```ts\nexport interface IStorage {\n    // A Storage instance holds the documents of a single workspace.\n    // To construct one, you need to supply\n    //   * a workspace address\n    //   * a list of Validator classes, for the document formats you want to support\n    //   * various other options such as database filenames, specific to that kind of Storage\n\n    // The workspace held in this Storage object.\n    workspace: WorkspaceAddress;\n\n    // onChange is called whenever any data changes:\n    //   * after every set()\n    //   * after every ingestDocument()\n    //   * after each document obtained during a sync (because that happens via ingestDocument())\n    // It doesn't yet send any details about the changes to the callback, but it should.\n    // Subscribe with onChange.subscribe(...cb...);\n    onChange: Emitter<undefined>;\n\n    // QUERYING\n    // Return the documents that match the query.\n    // Default sort is path ASC, then timestamp DESC (newest first within same path)\n    //  but query objects will eventually include sort options.\n    documents(query?: QueryOpts): Document[];\n    // Same as documents(), but only return the distinct paths of the matching documents (duplicates removed).\n    paths(query?: QueryOpts): string[];\n    // Same as documents(), but only return the content properties of the matching documents.\n    contents(query?: QueryOpts): string[];\n\n    // List of authors that have ever written in this workspace.\n    authors(now?: number): AuthorAddress[];\n\n    // INDIVIDUAL DOCUMENT LOOKUP\n    // Get one document by path.\n    // Only returns the most recent document at this path.\n    // To get older docs at this path (from other authors), do a query.\n    getDocument(path: string, now?: number): Document | undefined;\n    // Same as getDocument(path).content -- just the content of that document\n    getContent(path: string, now?: number): string | undefined;\n\n    // WRITING\n    // Write a document.\n    // To do this you need to know an author's private key, which is part of the keypair object.\n    // The DocToSet type is similar but smaller than a regular document:\n    //   format: which document format to use\n    //   path\n    //   content\n    //   timestamp: optional.  If absent or zero, the current time is set for you\n    //   - no workspace -- this Storage object knows what workspace it is\n    //   - no author -- it's provided in the keypair argument\n    //   - no signature -- it will be signed for you\n    // Timestamps should only be set manually for testing purposes.  Normally they should be\n    // omitted so they default to now.\n    // The timestamp will also be increased so that it's greater than any previous doc\n    // at the same path (from any author), to guarantee that this write will be the conflict winner.\n    //\n    // now should usually be omitted; it's used for testing and defaults to Date.now()*1000\n    set(keypair: AuthorKeypair, docToSet: DocToSet, now?: number): WriteResult | ValidationError;\n\n    // Save a document from an external source to this Storage instance.\n    // The document must be already signed.\n    // This is mostly used for syncing.\n    //\n    // now should usually be omitted; it's used for testing and defaults to Date.now()*1000\n    ingestDocument(doc: Document, now?: number): WriteResult | ValidationError;\n\n    // Internal helper method to do a one-way pull sync.\n    _syncFrom(otherStore: IStorage, existing: boolean, live: boolean): number;\n\n    // TODO: add now? param to _syncFrom and sync\n\n    // Two-way sync to another local Storage instance running in the same process.\n    // This is not network-aware.  Network sync is handled by the Syncer class.\n    sync(otherStore: IStorage, opts?: SyncOpts): SyncResults;\n\n    // TODO: Delete data locally.  This deletion will not propagate.\n    // forget(query : QueryOpts) : void;  // same query options as paths()\n\n    // Close this storage.\n    // All functions called after this will throw a StorageIsClosedError,\n    // except you can call close() as many times as you want.\n    // Once closed, a Storage instance cannot be opened again.\n    // TODO: what happens when a long-running process like a sync is happening, and the Storage is closed?\n    close() : void;\n    // Find out if the storage is closed.\n    isClosed() : boolean;\n}\n```\n\nUsage example ([readme-example.ts](src/readme-example.ts)):\n```ts\nimport {\n    StorageMemory,\n    ValidatorEs4,\n    generateAuthorKeypair,\n    isErr,\n} from 'earthstar';\n\n// Create a database for a particular workspace, '+gardening.xxxxxxxx'\n// We've chosen to use the latest 'es.4' feed format so we supply the matching validator.\nlet storage = new StorageMemory([ValidatorEs4], '+gardening.xxxxxxxx');\n\n// Users are called \"authors\".\n// Let's make up some authors for testing.\n// A keypair is { address: '@aaaa.xxx', secret: 'xxx' }.\n// (xxx represents base32-encoded ed25519 keys)\nlet keypair1 = generateAuthorKeypair('aaaa');\nlet keypair2 = generateAuthorKeypair('bbbb');\nif (isErr(keypair1)) { throw \"oops\"; }  // error could happen if our author shortname broke the rules\nif (isErr(keypair2)) { throw \"oops\"; }\nlet author1 = keypair1.address;\nlet author2 = keypair2.address;\n\n// You can set documents at specific paths, like a filesystem or key-value store.\nstorage.set(keypair1, { format: 'es.4', path: '/wiki/Strawberry', content: 'Tasty' });\nstorage.getContent('/wiki/Strawberry'); // --> 'Tasty'\n\n// One author can use multiple devices with no problems.\n// Conflicts are resolved by timestamp.\n// Here the same author overwrites their previous document,\n// which is forgotten from the database.\nstorage.set(keypair1, { format: 'es.4', path: '/wiki/Strawberry', content: 'Tasty!!' });\nstorage.getContent('/wiki/Strawberry'); // --> 'Tasty!!'\n\n// Multiple authors can overwrite each other (also by timestamp).\n// Here author 2 writes to the same path.\nstorage.set(keypair2, { format: 'es.4', path: '/wiki/Strawberry', content: 'Yum' });\nstorage.getContent('wiki/Strawberry'); // --> 'Yum'\n\n// Within a path we keep the most-recent document from each author,\n// in case we need to do better conflict resolution later.\n// To see the old versions, use a query:\nstorage.contents({ path: '/wiki/Strawberry', includeHistory: true });\n// --> ['Yum', 'Tasty!!']  // newest first\n\n// Get the entire document to see all the metadata as well as the content.\nstorage.getDocument('/wiki/Strawberry');\n// --> {\n//     format: 'es.4',\n//     workspace: '+gardening.xxxxxxxx',\n//     path: '/wiki/Strawberry',\n//     content: 'Yum',\n//     author: '@bbbb.xxxxxxx',\n//     timestamp: 1596676583283000,  // time in microseconds: Date.now()*1000\n//     signature: 'xxxxxxxx',\n// }\n\n// WRITE PERMISSIONS\n//\n// Paths can specify which authors are allowed to write to them.\n// Author names in a path prefixed by '~' can write to that path.\n//\n// Examples:\n// (in these docs, \"xxx\" is shorthand for a long public key)\n// One author write permission:\n//   '/about/~@aaaa.xxx/name'  -- only @aaaa.xxx can write here.\n//   '/about/~@aaaa.xxx/follows/@bbbb.xxx'  -- only @aaaa.xxx can write here\n// Public:\n//   '/wall/@aaaa.xxx'  -- no tilde, so anyone can write here\n//   '/wiki/Kittens'  -- no tilde, so anyone can write here\n// Multiple authors:\n//   '/whiteboard/~@aaaa.xxx~@bbbb.xxx'  -- both @aaaa.xxx and @bbbb.xxx can write here\n//\n// Here we'll set the author's display name by writing to their profile document.\nstorage.set(keypair1, {\n    format: 'es.4',\n    path: '/about/~' + keypair1.address + '/profile.json',\n    content: JSON.stringify({displayName: 'Suzie'}),\n});\n\n// You can do leveldb style queries.\nstorage.paths()\nstorage.paths({ lowPath: '/abc', limit: 100 })\nstorage.paths({ pathPrefix: '/wiki/' })\n\n// You can sync to another Storage that has the same workspace address\nlet storage2 = new StorageMemory([ValidatorEs4], '+gardening.xxxxxxxx');\nstorage.sync(storage2);\n// Now storage and storage2 are identical.\n\n// Get notified when anything changes.\nlet unsub = storage.onChange.subscribe(() => console.log('something changed'));\n\n// Later, you can turn off your subscription.\nunsub();\n```\n\n----\n\n## Details and notes\n\n**NOTE** The rest of this README is somewhat out of date!\n\n### Signatures\n\nDocument hashes are used within signatures and could be used to link to specific versions of a doc.\n\nThere's a simple canonical way to hash a document.  See [docs/serialization-and-hashing.md](Serialization and Hashing) for details.\n\nTo sign a doc, you sign its hash with the author's secret key.\n\nNote that docs only ever have to get transformed INTO this representation just before hashing -- we never need to convert from this representation BACK into a real doc -- so it can be nice and simple.\n\nThere is no canonical encoding for storage or networking - only the canonical hash encoding, above.  Databases and network code can represent the doc in any way they want.\n\nThe hash and signature specification may change as the schema evolves beyond `es.4`.  For example there may be another schema `ssb.1` which wraps and embeds SSB messages and knows how to validate their signatures.\n\n### Sync over duplex streams:\n\nHere's a very simple but inefficient algorithm to start with:\n\n```\n    sort paths by (path, timestamp DESC, signature ASC)\n    filter by my interest query\n    while true:\n        both sides send next 100 docs to each other as (path, timestamp, signature)\n        both sides figure out what the other needs and send it in full\n        both sides send 'ok'\n```\n\n### Sync over HTTP when only one peer is publicly available:\n\nHere's a very simple but inefficient algorithm to start with:\n\n```\n    the client side is in charge and does these actions:\n    sort paths by (path, timestamp DESC, signature ASC)\n    filter by my interest query\n    GET /interest-query   the server's interest query\n    while true:\n        GET /doc-versions?after='foo/bar'&limit=100 from server\n        compare with my own docs\n        pull things I need\n            POST /batch-get-docs       paths=[foo, foo/a, foo/b, ...]\n        push things they need:\n            POST /batch-ingest-docs    docs=[ {...}, {...} ]\n```\n\nNote that everything happens in batches instead of infinite streams.  The code avoids using streams.\n\nFor *efficient* sync, we'll use something similar to [this set reconciliation algorithm described by Aljoscha Meyer](https://github.com/AljoschaMeyer/set-reconciliation/).\n\n### HTTP API\n\nThis is out of date -- See earthstar-pub for the latest\n\n```\nHTTP replication:\n\nGET /interest-query   the server's interest query\n    return a list of query objects -- what does the server want?\nGET /doc-versions [after='...'] [limit=100] [before='...']\n    return array of docs with just path, version, first N bytes of signature\nPOST /batch-get-docs       paths=[foo, foo/a, foo/b, ...]\n    return complete docs\nPOST /batch-ingest-docs    docs=[ {...}, {...} ]\n    ask server to write these docs\n    return 'ok' or error\n```\n\n## Future plans\n\n### Immutable documents by putting \"(hash)\" in the path\nYou'll be able to put the literal string \"`(hash)`\" in a path.  It will be replaced with the hash of that document.  Since no other document can have the same path, it will be impossible to overwrite or delete this document, making it immutable.\n\n* Signatures are based on the shorthand path\n* Upon ingestion to the db, replace `(hash)` with the actual hash of the document\n* Database lookups use the full expanded path\n* Across the network, we only need to send the shorthand path.  The expanded path is derived state.\n* `(hash)` lets you create docs that can never be overwritten, because you can never make another doc with the same hash.\n* The expanded path needs to contain a character that's not allowed in regular paths, so the only way to get that path is via `(hash)`.  e.g. a percent sign like `(hash)` --> `%a93jDj39sdH...`\n\n### Path overlays\n* It would be easy make an overlay view of different path prefixes (\"folders\") within a Storage\n* Or overlay two Storage instances\n* For example you could combine `/wiki/~@a.xxxx` and `/wiki/~@b.xxxx` into one namespace\n","readmeFilename":"README.md","gitHead":"26170415349b0acc0090936f7a2581c4ad5bba12","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@6.0.0-beta.2","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-GAjSDGqTGBKyub4lZZQAP0/ZyG8XJXvxOd7y9dlUCWFL4OSms5FnCCXsXs/nZkwd/Hc6QgFVvroJfx+qn8cOdA==","shasum":"a05e6a68f8b2daac14af5bc78b2e3f80d40bf128","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.0.0-beta.2.tgz","fileCount":95,"unpackedSize":9619038,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfy+gBCRA9TVsSAnZWagAASbgQAJ5vo1DkcT1LzhN6RZEf\n5EuQlyk9HuiG0gLVgYm7tA2lKVF1F7yGr34q/+61XDqbUfzZ3GlGl4u6Vls8\nVvRX+4ENrgkdFQ6WlwVGd7VJ6Wz/cO0IzuDoCPjYUclDsHMsabQhAnUP61ER\nKO+8F96wu6y5BLqrV/CKS4PTzJPlRtVWjEG3er6C+DBojye6O0m9R/B5Qq6V\nB3rwcjqPK/zxNR5MeUYu5QuK976Ezk9LWcQvw8kU0vHlqNGd9XZgRoQR02B5\nNkqwLvNJlK3gBQ9VFEji7ZhTyVAHwYmhWM3QxU5Pp4sBPU2ieXJVgSFuOlcE\na5cUShcE+lhmzNROqTb0SlNc2kXvtbAylepXOHjnfiL52jZrxP0PXrPbVOgh\nYb4AT8t33EugFmwichk4Jp8AbN6AhscLTf/Ow+HEpxLodZbLmsUK7Jxj3fhb\n/zDIwftVw5rK4ZAmdOdkwMmHlHhybeXCEETUDsAMa3HIpOpRsqTUQyVgMIw1\n9H/dLipOc+asMCBW5Ig2KLM2AaF93sh0kbe40QztT9NSk4jnW71I0iSFIu5v\nYplnr+RyMBVbsRlSGnP33z2BfzfvvMSk3cFny1lHpmYB6lYBGK9VsdWMAblS\nbtuSdv7ryS/JxBaGMJODQYHzr28td8dn1Zkfdxhc2nWuFICKcthgazsIURwt\n2XGC\r\n=yXVN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDuDyIgPq5TRG7sM7dWUqsLSN+hronFfJIm2c6QsIpXzgIgJThhhg0iQxubFLT7fKZnznfgQNpYw1HE4HJ6mkOj9ws="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"sgwil","email":"gwilym@me.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.0.0-beta.2_1607198721175_0.10704253167803435"},"_hasShrinkwrap":false},"6.0.0-beta.3":{"name":"earthstar","version":"6.0.0-beta.3","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-storageAsync":"tap -Rspecy --jobs=1 build/test/storageAsync.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.10","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.2.3","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.19.2","typescript":"^4.1.2"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","@types/multibase":"^0.6.0","bencode":"^2.0.1","better-sqlite3":"^7.1.1","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^0.2.0","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","multibase":"^2.0.0","tslib":"^2.0.3"},"readme":"# Earthstar\n\n![](docs/earthstar-wordmark.png)\n\n## An offline-first, distributed, syncable, embedded document database for use in p2p software -- in browsers and outside of browsers\n\n## Community / how to contribute\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) and [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)\n\nChatroom: [`#earthstar:matrix.org`](https://matrix.to/#/!oGfoMKqZnBVrJYjebW:matrix.org)\n\n## Links and docs\n\nDocs for everyone:\n* **[A Guided Tour of Earthstar](docs/tour.md)** -- Slides and diagrams explaining how it works\n\nDocs for app developers:\n* [Overview for developers](docs/overview.md) -- A quick comparison between Earthstar, CouchDB, and SSB\n* [Rules of Earthstar](docs/rules-of-earthstar.md) -- The scope of the project, and details of the technical invariants of the distributed system.\n* [Tutorial](docs/tutorial.md) -- Make a Todo list app, step by step\n\nDocs for core Earthstar developers:\n* [Earthstar Specification](docs/specification.md) -- All you need to know to write an Earthstar implementation from scratch\n* [About syncing](docs/syncing.md) -- Exploring this topic in more detail\n* [About fancy conflict resolution](docs/fancy-conflict-resolution.md) -- How to add more complex conflict tracking on top of Earthstar\n* [About timestamps](docs/timestamps.md) -- Exploring the limits of Earthstar's assumptions about timestamps\n* [Urls](docs/urls.md) -- How to build URLs related to Earthstar\n\nRelated repos:\n* [earthstar-cli](https://github.com/earthstar-project/earthstar-cli) -- Command line utility\n* [earthstar-pub](https://github.com/earthstar-project/earthstar-pub) -- Server to help you sync\n* [earthstar-graphql](https://github.com/earthstar-project/earthstar-graphql) -- A GraphQL layer for handling Earthstar data\n\nDemo apps:\n* [earthstar-lobby](https://github.com/sgwilym/earthstar-lobby/) -- A guestbook.  [Try it here](https://earthstar-lobby.vercel.app/)\n* [earthstar-wiki](https://github.com/earthstar-project/earthstar-wiki) -- An example app built with Earthstar (deprecated)\n* [earthstar-os](https://github.com/earthstar-project/earthstar-os) -- A toolkit for hosting and using Earthstar apps in the browser (deprecated)\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n**Contents**\n\n- [What kinds of apps can you build with Earthstar?](#what-kinds-of-apps-can-you-build-with-earthstar)\n- [Motivation](#motivation)\n- [Data model](#data-model)\n- [Block diagram](#block-diagram)\n- [Scope, typical usage](#scope-typical-usage)\n- [Editing data; multiple users and devices; conflicts](#editing-data-multiple-users-and-devices-conflicts)\n- [Security properties](#security-properties)\n- [Comparisons](#comparisons)\n- [Use cases](#use-cases)\n- [What doesn't it do?](#what-doesnt-it-do)\n- [Example](#example)\n- [Details and notes](#details-and-notes)\n  - [Signatures](#signatures)\n  - [Sync over duplex streams:](#sync-over-duplex-streams)\n  - [Sync over HTTP when only one peer is publicly available:](#sync-over-http-when-only-one-peer-is-publicly-available)\n  - [HTTP API](#http-api)\n- [Future plans](#future-plans)\n  - [Immutable documents by putting \"(hash)\" in the path](#immutable-documents-by-putting-hash-in-the-path)\n  - [Path overlays](#path-overlays)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## What kinds of apps can you build with Earthstar?\n\nTools for collaborating with groups of people.  See [Use-cases](#Use-cases), below.\n\n## Motivation\n\nCentralized services like Facebook have lots of problems: privacy, surveillance, addiction, dark patterns, ads, \"real name\" policies that harm minority groups, poor handling of moderation, bots, ...\n\nThese problems come from 2 root causes:\n* They have a **profit motive**, so their purpose is to extract value from users.\n* They're **big**, so they're a bureaucracy that can't understand the nuances of the diverse world population they serve, and they're unresponsive to demands from their users.\n\nWe'd be better off with communication services that are:\n* **Not for profit** - run by volunteers on small, cheap servers\n* **Small** - close to their users, locally governed, more democratic, understanding local norms and culture\n\nThis is the \"federated\" model, like Mastodon: instead of one big Twitter, make a thousand small Twitters.\n\nBut this has problems too -- volunteer-run servers don't last forever, and when they shut down their users lose their communities.\n\nEarthstar goes one step further: you can communicate without servers at all, directly from device to device; or you can run Earthstar on [servers (\"called pubs\")](https://github.com/cinnamon-bun/earthstar-pub) which help sync your data but have no authority over your account.  You can easily run your own servers for yourself and your friends.  Instructions coming soon.\n\nAll the authority in the system rests in the users and is enforced by cryptography, not central servers.  Since servers only exist to help with syncing, and your data and identity are independent of the servers, you can easily use as many or as few servers as you want, and move between them without losing anything.\n\nEarthstar's philosophy is that **apps should be tools, not services**.  Authority no longer rests in a central server, it rests in each user.\n\n## Data model\n\nAn Earthstar workspace holds mutable **documents** with unique **paths** (ids), similar to leveldb or CouchDb.\n\nWithin each **path**, we keep the newest version of that **document** from each author.  We discard old versions of a document from the same author.\n\nIn other words, it's a mapping from `(path, author)` to `latest version of the document at that path, from that author`.\n\nThe newest document (from any author) is considered the winner of a conflict.  More details below in the \"Editing data\" section.\n\nThere are no transactions.  The unit of atomic change is the document.\n\n![](docs/earthstar-data-model.png)\n\n## Block diagram\n\nSimplified diagram of the entire system.  The dashed boxes are not implemented yet.\n\n![](docs/block-diagram.png)\n\nA more detailed look at this Javascript implementation:\n\n![](docs/building-blocks.png)\n\n## Scope, typical usage\n\nEach user will have their own instance of an Earthstar database in whatever app they're using -- in the browser or native.  There might also be some instances on cloud servers (\"pubs\").  The databases can sync with each other across HTTP or duplex stream connections.\n\nEach database instance can hold a subset of the entire data, specified by a query such as \"paths starting with a certain substring\", \"paths written after a certain timestamp\", etc.\n\nThe universe of data is divided into **workspaces** -- collections of documents accessed by certain users.  Syncing happens one workspace at a time.\n\nRead the [vocabulary and concepts](docs/vocabulary.md) documentation for more about workspaces.\n\n## Editing data; multiple users and devices; conflicts\n\nA single author can use multiple devices at the same time.  You \"log into\" a device by providing your public and private key, like a username and password.\n\nData is mutable.  Authors can update paths with new documents.  The old data is thrown away and doesn't take up space.  You can \"delete\" data by overwriting it with an empty document.\n\nThere is a write permission system to allow only certain authors to write to certain paths.  Other paths can be written by anyone.\n\nSoon, there will also be a way to write immutable messages, for use cases where you need those.\n\nConflicts from a single author (on multiple devices) are resolved by timestamp and the old data is discarded.  Conflicts from multiple authors are resolved by timestamp by default, but the old data is kept to allow for manual conflict resolution if needed.\n\n## Security properties\n\nEach author is identified by a public key.\n\nData updates are signed by the author, so it's safe for untrusted peers to help host and propagate data.  (Soon) you will also be able to encrypt data so untrusted peers can host it without reading it.\n\nMalicious peers can:\n* Withold updates to individual documents during a sync\n* See the data (until encryption is implemented, soon)\n* Know which peers they're connecting to\n\nMalicious peers cannot:\n* Alter documents from another author\n* Forge new documents signed by another author\n\nAlthough malicious peers can withold individual documents, as long as there are honest peers around you will eventually get the latest verison of everything.\n\nBecause it allows partial sync and mutation of data, Earthstar doesn't cryptographically guarantee that you have a complete dataset with no gaps from a certain author.  Authors could chose to use sequential paths or embed a blockchain of hash backlinks into their messages, and you could verify these in your app (outside of Earthstar).\n\n## Comparisons\n\nLike leveldb, but:\n* multi-author\n* it syncs\n\nLike CouchDb, but:\n* with signatures and encryption, so untrusted nodes can help move data around.\n\nLike Scuttlebutt, but:\n* one author can use multiple devices\n* data is mutable\n* instead of an append-only log, it's a set of mutable items\n* supports partial replication\n* will sync over HTTP, not just TCP, so it's easy to host in places like Glitch.com\n* has less strict data guarantees -- you can't tell if you have someone's entire dataset or not\n\nLike DAT, but:\n* multi-author, multi-device\n* simpler\n* communicates over HTTP, making it easier to deploy pub servers and run in regular browsers\n* instead of an append-only log, it's a set of mutable items\n\nLike IPFS, but:\n* multi-author, multi-device\n* mutable\n* documents are signed by the author\n* currently more focused on pub servers for replication and not DHT swarms, although swarm support is coming\n\nLike Firebase, but:\n* open source\n* distributed\n\nSometimes immutability is needed, like if you're running a package registry or want an audit log.  For social-network style use cases, though, immutability can be a privacy liability instead of a desirable guarantee.\n\n## Use cases\n\nEarthstar can be used for invite-only tools where you have all the data (think Slack) and large open-world tools where you only replicate part of the entire dataset (think SSB).  Apps tell Earthstar what paths and what authors to replicate.\n\nThese styles of app could be built on top of Earthstar:\n* wikis\n* chat: Slack, IRC\n* social: Facebook, Scuttlebutt, Discourse, LiveJournal, Forums\n* microblogging: Twitter, Mastodon\n* productivity: Trello, GitHub Issues, Asana, Todo lists\n* office: Google sheets\n* art: Collaborative drawing or music tools, multi-user Twine for making interactive fiction games\n\n## What doesn't it do?\n\nEarthstar's conflict resolution chooses entire document versions as winners, it doesn't merge versions together.  This means it's a poor choice for simultaneous multi-user editing of large text documents.  For that, you could use a fancier CRDT like Automerge and rely on Earthstar to move and sync the patches it produces.  Or you can design apps to store large documents as smaller pieces, like paragraphs, or design other ways to collaborate such as comments or chat where people don't simultaneously edit the same text.\n\nIt will eventually stream live changes, but it doesn't yet.  For now, syncing is done on demand.\n\nThe cryptography is not audited yet.  It's based on libsodium which is also used by Scuttlebutt and many other projects.\n\nEarthstar is more focused on autonomy than on anonymity.  It doesn't have perfect forward secrecy.  Your messages are signed by your key so it's easy to prove which identity said something.  We try to reduce IP address exposure etc, but if you have a serious need for anonymity you should layer it on something like Tor or use other tools that are anonymity-focused.\n\nEarthstar doesn't provide transactions or causality guarantees.\n\nModeration and blocking support is not figured out yet but it's important and we'll get there eventually.  In the meantime, apps can layer their own moderation and blocking support on top of Earthstar.\n\n## Example\n\nThe main interface to Earthstar is the Storage class:\n\n```ts\nexport interface IStorage {\n    // A Storage instance holds the documents of a single workspace.\n    // To construct one, you need to supply\n    //   * a workspace address\n    //   * a list of Validator classes, for the document formats you want to support\n    //   * various other options such as database filenames, specific to that kind of Storage\n\n    // The workspace held in this Storage object.\n    workspace: WorkspaceAddress;\n\n    // onChange is called whenever any data changes:\n    //   * after every set()\n    //   * after every ingestDocument()\n    //   * after each document obtained during a sync (because that happens via ingestDocument())\n    // It doesn't yet send any details about the changes to the callback, but it should.\n    // Subscribe with onChange.subscribe(...cb...);\n    onChange: Emitter<undefined>;\n\n    // QUERYING\n    // Return the documents that match the query.\n    // Default sort is path ASC, then timestamp DESC (newest first within same path)\n    //  but query objects will eventually include sort options.\n    documents(query?: QueryOpts): Document[];\n    // Same as documents(), but only return the distinct paths of the matching documents (duplicates removed).\n    paths(query?: QueryOpts): string[];\n    // Same as documents(), but only return the content properties of the matching documents.\n    contents(query?: QueryOpts): string[];\n\n    // List of authors that have ever written in this workspace.\n    authors(now?: number): AuthorAddress[];\n\n    // INDIVIDUAL DOCUMENT LOOKUP\n    // Get one document by path.\n    // Only returns the most recent document at this path.\n    // To get older docs at this path (from other authors), do a query.\n    getDocument(path: string, now?: number): Document | undefined;\n    // Same as getDocument(path).content -- just the content of that document\n    getContent(path: string, now?: number): string | undefined;\n\n    // WRITING\n    // Write a document.\n    // To do this you need to know an author's private key, which is part of the keypair object.\n    // The DocToSet type is similar but smaller than a regular document:\n    //   format: which document format to use\n    //   path\n    //   content\n    //   timestamp: optional.  If absent or zero, the current time is set for you\n    //   - no workspace -- this Storage object knows what workspace it is\n    //   - no author -- it's provided in the keypair argument\n    //   - no signature -- it will be signed for you\n    // Timestamps should only be set manually for testing purposes.  Normally they should be\n    // omitted so they default to now.\n    // The timestamp will also be increased so that it's greater than any previous doc\n    // at the same path (from any author), to guarantee that this write will be the conflict winner.\n    //\n    // now should usually be omitted; it's used for testing and defaults to Date.now()*1000\n    set(keypair: AuthorKeypair, docToSet: DocToSet, now?: number): WriteResult | ValidationError;\n\n    // Save a document from an external source to this Storage instance.\n    // The document must be already signed.\n    // This is mostly used for syncing.\n    //\n    // now should usually be omitted; it's used for testing and defaults to Date.now()*1000\n    ingestDocument(doc: Document, now?: number): WriteResult | ValidationError;\n\n    // Internal helper method to do a one-way pull sync.\n    _syncFrom(otherStore: IStorage, existing: boolean, live: boolean): number;\n\n    // TODO: add now? param to _syncFrom and sync\n\n    // Two-way sync to another local Storage instance running in the same process.\n    // This is not network-aware.  Network sync is handled by the Syncer class.\n    sync(otherStore: IStorage, opts?: SyncOpts): SyncResults;\n\n    // TODO: Delete data locally.  This deletion will not propagate.\n    // forget(query : QueryOpts) : void;  // same query options as paths()\n\n    // Close this storage.\n    // All functions called after this will throw a StorageIsClosedError,\n    // except you can call close() as many times as you want.\n    // Once closed, a Storage instance cannot be opened again.\n    // TODO: what happens when a long-running process like a sync is happening, and the Storage is closed?\n    close() : void;\n    // Find out if the storage is closed.\n    isClosed() : boolean;\n}\n```\n\nUsage example ([readme-example.ts](src/readme-example.ts)):\n```ts\nimport {\n    StorageMemory,\n    ValidatorEs4,\n    generateAuthorKeypair,\n    isErr,\n} from 'earthstar';\n\n// Create a database for a particular workspace, '+gardening.xxxxxxxx'\n// We've chosen to use the latest 'es.4' feed format so we supply the matching validator.\nlet storage = new StorageMemory([ValidatorEs4], '+gardening.xxxxxxxx');\n\n// Users are called \"authors\".\n// Let's make up some authors for testing.\n// A keypair is { address: '@aaaa.xxx', secret: 'xxx' }.\n// (xxx represents base32-encoded ed25519 keys)\nlet keypair1 = generateAuthorKeypair('aaaa');\nlet keypair2 = generateAuthorKeypair('bbbb');\nif (isErr(keypair1)) { throw \"oops\"; }  // error could happen if our author shortname broke the rules\nif (isErr(keypair2)) { throw \"oops\"; }\nlet author1 = keypair1.address;\nlet author2 = keypair2.address;\n\n// You can set documents at specific paths, like a filesystem or key-value store.\nstorage.set(keypair1, { format: 'es.4', path: '/wiki/Strawberry', content: 'Tasty' });\nstorage.getContent('/wiki/Strawberry'); // --> 'Tasty'\n\n// One author can use multiple devices with no problems.\n// Conflicts are resolved by timestamp.\n// Here the same author overwrites their previous document,\n// which is forgotten from the database.\nstorage.set(keypair1, { format: 'es.4', path: '/wiki/Strawberry', content: 'Tasty!!' });\nstorage.getContent('/wiki/Strawberry'); // --> 'Tasty!!'\n\n// Multiple authors can overwrite each other (also by timestamp).\n// Here author 2 writes to the same path.\nstorage.set(keypair2, { format: 'es.4', path: '/wiki/Strawberry', content: 'Yum' });\nstorage.getContent('wiki/Strawberry'); // --> 'Yum'\n\n// Within a path we keep the most-recent document from each author,\n// in case we need to do better conflict resolution later.\n// To see the old versions, use a query:\nstorage.contents({ path: '/wiki/Strawberry', includeHistory: true });\n// --> ['Yum', 'Tasty!!']  // newest first\n\n// Get the entire document to see all the metadata as well as the content.\nstorage.getDocument('/wiki/Strawberry');\n// --> {\n//     format: 'es.4',\n//     workspace: '+gardening.xxxxxxxx',\n//     path: '/wiki/Strawberry',\n//     content: 'Yum',\n//     author: '@bbbb.xxxxxxx',\n//     timestamp: 1596676583283000,  // time in microseconds: Date.now()*1000\n//     signature: 'xxxxxxxx',\n// }\n\n// WRITE PERMISSIONS\n//\n// Paths can specify which authors are allowed to write to them.\n// Author names in a path prefixed by '~' can write to that path.\n//\n// Examples:\n// (in these docs, \"xxx\" is shorthand for a long public key)\n// One author write permission:\n//   '/about/~@aaaa.xxx/name'  -- only @aaaa.xxx can write here.\n//   '/about/~@aaaa.xxx/follows/@bbbb.xxx'  -- only @aaaa.xxx can write here\n// Public:\n//   '/wall/@aaaa.xxx'  -- no tilde, so anyone can write here\n//   '/wiki/Kittens'  -- no tilde, so anyone can write here\n// Multiple authors:\n//   '/whiteboard/~@aaaa.xxx~@bbbb.xxx'  -- both @aaaa.xxx and @bbbb.xxx can write here\n//\n// Here we'll set the author's display name by writing to their profile document.\nstorage.set(keypair1, {\n    format: 'es.4',\n    path: '/about/~' + keypair1.address + '/profile.json',\n    content: JSON.stringify({displayName: 'Suzie'}),\n});\n\n// You can do leveldb style queries.\nstorage.paths()\nstorage.paths({ lowPath: '/abc', limit: 100 })\nstorage.paths({ pathPrefix: '/wiki/' })\n\n// You can sync to another Storage that has the same workspace address\nlet storage2 = new StorageMemory([ValidatorEs4], '+gardening.xxxxxxxx');\nstorage.sync(storage2);\n// Now storage and storage2 are identical.\n\n// Get notified when anything changes.\nlet unsub = storage.onChange.subscribe(() => console.log('something changed'));\n\n// Later, you can turn off your subscription.\nunsub();\n```\n\n----\n\n## Details and notes\n\n**NOTE** The rest of this README is somewhat out of date!\n\n### Signatures\n\nDocument hashes are used within signatures and could be used to link to specific versions of a doc.\n\nThere's a simple canonical way to hash a document.  See [docs/serialization-and-hashing.md](Serialization and Hashing) for details.\n\nTo sign a doc, you sign its hash with the author's secret key.\n\nNote that docs only ever have to get transformed INTO this representation just before hashing -- we never need to convert from this representation BACK into a real doc -- so it can be nice and simple.\n\nThere is no canonical encoding for storage or networking - only the canonical hash encoding, above.  Databases and network code can represent the doc in any way they want.\n\nThe hash and signature specification may change as the schema evolves beyond `es.4`.  For example there may be another schema `ssb.1` which wraps and embeds SSB messages and knows how to validate their signatures.\n\n### Sync over duplex streams:\n\nHere's a very simple but inefficient algorithm to start with:\n\n```\n    sort paths by (path, timestamp DESC, signature ASC)\n    filter by my interest query\n    while true:\n        both sides send next 100 docs to each other as (path, timestamp, signature)\n        both sides figure out what the other needs and send it in full\n        both sides send 'ok'\n```\n\n### Sync over HTTP when only one peer is publicly available:\n\nHere's a very simple but inefficient algorithm to start with:\n\n```\n    the client side is in charge and does these actions:\n    sort paths by (path, timestamp DESC, signature ASC)\n    filter by my interest query\n    GET /interest-query   the server's interest query\n    while true:\n        GET /doc-versions?after='foo/bar'&limit=100 from server\n        compare with my own docs\n        pull things I need\n            POST /batch-get-docs       paths=[foo, foo/a, foo/b, ...]\n        push things they need:\n            POST /batch-ingest-docs    docs=[ {...}, {...} ]\n```\n\nNote that everything happens in batches instead of infinite streams.  The code avoids using streams.\n\nFor *efficient* sync, we'll use something similar to [this set reconciliation algorithm described by Aljoscha Meyer](https://github.com/AljoschaMeyer/set-reconciliation/).\n\n### HTTP API\n\nThis is out of date -- See earthstar-pub for the latest\n\n```\nHTTP replication:\n\nGET /interest-query   the server's interest query\n    return a list of query objects -- what does the server want?\nGET /doc-versions [after='...'] [limit=100] [before='...']\n    return array of docs with just path, version, first N bytes of signature\nPOST /batch-get-docs       paths=[foo, foo/a, foo/b, ...]\n    return complete docs\nPOST /batch-ingest-docs    docs=[ {...}, {...} ]\n    ask server to write these docs\n    return 'ok' or error\n```\n\n## Future plans\n\n### Immutable documents by putting \"(hash)\" in the path\nYou'll be able to put the literal string \"`(hash)`\" in a path.  It will be replaced with the hash of that document.  Since no other document can have the same path, it will be impossible to overwrite or delete this document, making it immutable.\n\n* Signatures are based on the shorthand path\n* Upon ingestion to the db, replace `(hash)` with the actual hash of the document\n* Database lookups use the full expanded path\n* Across the network, we only need to send the shorthand path.  The expanded path is derived state.\n* `(hash)` lets you create docs that can never be overwritten, because you can never make another doc with the same hash.\n* The expanded path needs to contain a character that's not allowed in regular paths, so the only way to get that path is via `(hash)`.  e.g. a percent sign like `(hash)` --> `%a93jDj39sdH...`\n\n### Path overlays\n* It would be easy make an overlay view of different path prefixes (\"folders\") within a Storage\n* Or overlay two Storage instances\n* For example you could combine `/wiki/~@a.xxxx` and `/wiki/~@b.xxxx` into one namespace\n","readmeFilename":"README.md","gitHead":"3a13288f5561e15720abcd893080c1c30cd0ef4e","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@6.0.0-beta.3","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-XAmm+asDOvoejNTwwTmlriFlSDMTuJlgboYiQljjYFCH5iiwt270KktTcdY6ectbED1sbwqgzyeOggrNTvcISA==","shasum":"89a677f90fdd1e9009179b66dce6af3ac887c6e3","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.0.0-beta.3.tgz","fileCount":95,"unpackedSize":9619038,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfy+rOCRA9TVsSAnZWagAAlVUP/0/pC+JRzETYmcUy0QYb\nYQe40lHLr3Q0eoSH/wyAiP3Wi2nuBEjV9YCwNB83R/dVP2HpHfxRSI6FjKBA\nLqNB4W65Ir25X+a+wWcKw7xSCu3aqc2Q07XYEs2ndt6UwjB7G1nhhQXEEUew\n+pJYHQyI/yBnZkQC3j0Ere/UfQArLZzMtnAnfQvKI8QtQ3CntLXXGerDW13J\nnyRY4v12x5OePPuBDBXaVlW+VfmuyjFI4qRyI2uaU8E60GGVKPegFpDn3mHv\nCheljIz3TFOTapCKiB1+J/VZWvh+rwLgQiZIQ8E8m/QaTGiB9qWq2CWFgEBb\ndFsV4Uw8/lEqdNvXGZiPuq9UAWfIh2i0/lGZi7g4NkeGuRWgSsMxxrvPnliS\nyV/ITTRIi6AR9zQXJ2sdteDyJMYuyjouDArSQy+/s3uTDSCedm2VHNgDdetI\nbyhiEiQETXHuEbfCNFeJROB+jaY+oIHCt912K/9QzzsteUYbEcpjOynNBzwK\nQC3ZzoMtL8OqEFo6xSRjTBL0v7t3zB2FkG99oljiVGrSiqpEqHjW3o4bqT6L\nnX3GEPICMRUfNeGoN6Izz6SFonL+wZPDu+c+fb5gcE2EnpE52K+ZOSrv0CyG\n3WtkvmgzhK5fUwJpZjis6fH5ONK9BuGqGIeiknysl4+JPX7vmy0xc9UCTPre\nIKzW\r\n=NMJ/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCzrpcjvD88BsXft/aLlY1TpnAHra1TDVT+j5f+TJpNJgIgCwt1fdwOtIDXLWGs6S6NLRFCbSFm3qEiTR6wk1vaPzw="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"sgwil","email":"gwilym@me.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.0.0-beta.3_1607199438115_0.5118301266862157"},"_hasShrinkwrap":false},"5.7.5":{"name":"earthstar","version":"5.7.5","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* dist/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.19.2","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"06f38d96871967f5aed58d48d9552610355ce2bc","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.7.5","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-EmsPTUTKv/vctZV66PkFUDXUcSLai9IMBiT7IBUyAco171dW7meMvJT9GjSwRFZGOkTl2DlsomaAvGMXkZmeKg==","shasum":"a169aca24644bcd45039c0c2b8ade5c3b6569d5e","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.7.5.tgz","fileCount":85,"unpackedSize":378820,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgHihcCRA9TVsSAnZWagAABv8P/Ro/4e1fxVqJi10GqZPA\nBMaeM9F3f/eAeCKzVJFb7040Bcpn+faxjvQ0kMeRcVfS1qUBuFGTADRQMehX\nqDEDg/d5TGp6KRyTBg1nh1dQwP+/HZQrypsR+Pok/mcTnALKOxav7yXmt/AB\npW1sfM37+vDFK7XOe7d3zl7Tfpf6TSNrJ8ITP3v/XqBgVYQFP8oB73fHEsXv\n9YJ6WLWzuo4lhKEvLz8MReNKfUJPe+nptAonA+P6/RvGG1esOAe+M+eUIQE7\naxTNWJdZYZA5+ng1DgOUSY5VgJ+Xa/eiND7yZy+l1BuBM4Jqbkk0tPHn8+Wq\nF+SU+ohQfPqCK+uCfIzbYY7FHkM6Duf5BXkVUKJzjyR2S+B2Pb0P0IVSdA7S\nowI+QL9Ut08nSEoa37BGotbO6VJPIA3+JZSbvSj2aRT6ZRB//vk2Q/3dFGWg\nfraCS9n5rnJTTs7C9dbHOsva741AUKYusmynHNx6xlEhNXW6qomzq7D/e01g\nOBKx+qXNGYhSqTz6ihAEAl6AtehLO3R3Japh+iBgq/Qav4r0SFRP7tdA49O+\nvKQEEgy9T8RWCPPj6vnRKtkJgWy95QHoJhj2qFLLPCaJiek+mXuWDpWUY7G5\nHHF48XWK1sb36BqgxwTQVPtqZVsjiRB49U4nz3eP05vmTnkrWy4rINB/O9NU\n4J8R\r\n=EGu7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAI3dyACbivDsQRDVMVsDVlnREFhovwutq70VMLlId2QAiARK7GJe6bz2fwtOhjEg3tW4C+yvs0fdNwJ8oP0l/X01Q=="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.7.5_1612589148231_0.6312915434373505"},"_hasShrinkwrap":false},"5.7.6":{"name":"earthstar","version":"5.7.6","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.19.2","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"d84313c6a90858dbf6a47fd339cd90a5ed8f8868","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.7.6","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-JwK4c7ErCZII/epUzgeA/5Ul6G/tifxe2XFhi3kLjAfqM/lavmDsnq8wWb5vh40Pa84OkwzfYFa6+AceHwyjgA==","shasum":"c837c2c40b2d093a9dea76cc84bae746513b9b13","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.7.6.tgz","fileCount":87,"unpackedSize":3335651,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgHilnCRA9TVsSAnZWagAAEXkP/Aw1TX+lu7HW630Fbzbz\nCIl8N/2FQ/k5+DfXqsOZ26+qNCypgWMh/0QSkBbpw0Fo+Iq+MpOQn5U24fKR\nvOhBOJwCGv43skuVSmn7DdbrBVjpw8jEtDqFkTL2Uk8SwzOGwZmbu9PTt+f0\n6kXRktWKZlo1YQacmrNFzgBD65bY2D4AdwQjmt+WfJpwjW/en37aMNMOtR1m\n5bSDMXoEP/ObIuG7odbkc607eXWl571EG1odhDURdX1WVKiraw1BQm4Vsjuo\nZomwbstE2sW6BYtSaG44mSYDJ6YfTYnNIaLbhbfXjAY0V8kqkodDnMuoHixp\n9gbTjoVaMe1hbtZA/l/fpkQHdYbOBeiHUxm1D+QA2Ku4EoabcrpnUp25ArRA\ntqsrsUBf1dFgrRb7S+fKbAe6wA2Az9GmxtMRktKca8GVYCNWfHAQjp3iVLdq\nm1U/pxWCUS0m15zWxUOoWfESdZ9j0+GVEx+PFelDZ83N1W/SiP0OS7VRnobk\ng20bgi/OB6SqpHQSHU6gvUrEmEb5i3k75OYUW+VXbSCHNlwdC8lrx4MxxDRt\ndbzJHfratPTjw89FSnfMdxm0+gEGhNpsxJn/SHwo0t+CEHOjq2HvJEyUATJj\nRbMhEB0o50ut7J4em/5x55aH8MhkBA5jKuUt/RciYxadQW+va9Bd2t2V/6TV\nZcCK\r\n=KkMz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDL09Iv0kdNDCv8ZDh8tjqMAk+uwsiwzM+2dl9im1PYTAiEA2MncsdDKjCA7R2lJgSVR0asH/7GlJawgs89+ciNl+sk="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.7.6_1612589414946_0.06779241643699319"},"_hasShrinkwrap":false},"5.8.0":{"name":"earthstar","version":"5.8.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-layer-about":"tap -Rspecy --jobs=1 build/test/layers.about.test.js","test-layer-wiki":"tap -Rspecy --jobs=1 build/test/layers.wiki.test.js","test-storage":"tap -Rspecy --jobs=1 build/test/storage.test.js","test-sync":"tap -Rspecy --jobs=1 build/test/sync.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","test-coverage":"npm test -- --coverage-report=lcov","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/better-sqlite3":"^5.4.0","@types/multibase":"^0.6.0","@types/node":"^14.0.3","@types/tap":"^14.10.0","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.0.2","prettier":"^2.0.5","tap":"^14.10.7","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.19.2","typescript":"^3.9.2"},"dependencies":{"@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.0.1","chloride":"^2.2.14","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","multibase":"^0.7.0","tslib":"^2.0.0"},"gitHead":"44e72dfdcbdfe17fcac75057d3f1af7890b55fe2","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@5.8.0","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-iqiWEL0nyIbbC8a7L1jczPvzdRzLiREl3MytxBerXHPdk/3vlcMiMuOudR5igmn+KjvCfQlaQ5yRg67z1zXJAQ==","shasum":"a1877eee636eaf81bd056dabfcd7da0c96ad2503","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-5.8.0.tgz","fileCount":87,"unpackedSize":3339208,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgJDyACRA9TVsSAnZWagAAr6EQAJtRm7nApplkXJ4eF5pW\njp4sY9iYKYTAv7gKaga9uuDVmQV6eLXbG3uCBnosDTaCGR7dvEaY8y9jI2KZ\nH/QtZAJxIzynVYio71KDSHYpBpwhlQQsyBPGauz7+5EIPci/0mE8gTJJoiER\nyUu9r6qqoxqhw+lWflq4Q7F5RpvQXNa58MJdd/SPllhVOhA9G9zmf7GNR1dg\nOPE6Xf3EMPsNK1lZ/ZqTJHXTsAxoesjZ5wc91NpCNSGBHLoFC5UfAEHlukii\nps6NRIJn8iORfDcAst+I74DziMMjCRCewc0NyRCjTAoc5e18MlDWuF1k6PD9\nzw2FBOsvsGchwRIiy6AwjJRtPeP5q+RhpeDVftl8UtVaBCeTODAlnqyslHGh\nlbTQJ20IwnWYlrxEVl+64ulg3tJ3l/Sem1MqzJ5IZABB8QJlHE049CtVkZmo\nuK7L+D1fzXeB65ctnAy6hsKwA7ZMlhzgIbBIfLScvC0dZHH2VD1+LexokYQX\nIZS224/V5vAdNTQlQ0fd/iYkjIJp/VTnZ/PxGs3I0dpkEgXshe88nHjd1ND8\nRKrfQ1y2JeVQ5iHazyraayEm1yMZWEnIFbIPm+5gMs/nStPlmMWZ9qLUVmtF\nXrSq3oSvGw2QL2ClKhxcSsewbRdxan9FYpeu/rnLWviUbzA87iyVCFi8G54M\nzTwO\r\n=MMrI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD1HelOrirUH6d3KwEWEr+3ILN7uKxyJOabcii15T/+dgIhAJuUJiGtzOPg3huNMwKXFUobqBuNwtXCB49otAQ+r3xU"}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_5.8.0_1612987519658_0.2207649366625497"},"_hasShrinkwrap":false},"6.0.0":{"name":"earthstar","version":"6.0.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-storageAsync":"tap -Rspecy --jobs=1 build/test/storageAsync.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.10","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.2.3","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.19.2","typescript":"^4.1.2"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","@types/multibase":"^0.6.0","bencode":"^2.0.1","better-sqlite3":"^7.1.1","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^0.2.0","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","multibase":"^2.0.0","tslib":"^2.0.3"},"gitHead":"90a4d3e5ba7b859ddddedd3e8e32c16d082aa624","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@6.0.0","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-6U0cjjNARevAGDp9WUdV5OTTpykpTLMVyzK7LQu5Y+C8RzUhy/KHksJUQgb+5iP9vn48em8mRrDlF2HQYEbdQQ==","shasum":"b967bd48f97db8a15db2f23efdb8ea974d9af161","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.0.0.tgz","fileCount":96,"unpackedSize":3593062,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgJdDXCRA9TVsSAnZWagAAy0kP/01Pr3sscN/QqEp+uO6D\nH+3bcd5d7PZTOkMNMOvOP3DJcsS9mB1ttKmrCkrYLV0LCBuhjvxnlZPNvhLF\nVo+fSZX1R0Z6wlsWFhn38sgD/mPngy+M+B5o/Rl0H0PLF/Ds2a6+9KONZnhu\nwH56qoPgGUnEwbgoO68cPE4NsuBdI6c5+lbUrSG6/gXFyLgTiyXXKjsM5yM1\n+7FpysI8055w9B/UgmbmRtu3yCcmuq6PDKSyUAtAWV2BnzjAIWqmJChGMICA\nWfNThU/1XJBTbuQwJe0tusljXn9SJ7+BEOZRXURxL2vmdR2tT9xoAKffNXd2\nhnuTIzF1BxA1TimPxRh5UQcJc7faaIGLQ24RxoT+Rzb5bVU9hfxrVexX2BVS\nVUt9dBO4VsmMfz+hXUpYdOKb7yLYepTYEWYcNIZ04uoBGjHx7nch8ajrOPc6\nI9wuxHH6Kx2h2aLXGGMEGaiJ9bF5MvFrNuuXYGVsb6jwWU93gY0Bj34SFWHR\nelRxta0w9aC+6GF80WXArkzc0E5czji+tagHxk4yaRGK7Yto0clpeOvzZfYJ\nyIAT0VUt1MuBs4oa+223NUcmiB4HbzRPLgZGZwpLeQOeB/N4cnmRY7FHZVeY\nU5JrApxBAOZ9i6i6RiBf/5gqbr3igRQsqlb7QBjI9LncmU0wgwc+4hxdkEwf\n5ioF\r\n=btUY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDNzQ8MwHTpc+umXm3hTp9GuWc+P9gCBuLkFTgCfCSAsAiEA0YnFWjH9e1kEbTururMy7NJI4otVbdCzBl4lYIGQSmE="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.0.0_1613091030984_0.9917178139786342"},"_hasShrinkwrap":false},"6.1.0":{"name":"earthstar","version":"6.1.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-storageAsync":"tap -Rspecy --jobs=1 build/test/storageAsync.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.10","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.2.3","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.19.2","typescript":"^4.1.2"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","@types/multibase":"^0.6.0","bencode":"^2.0.1","better-sqlite3":"^7.1.1","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^0.2.0","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","multibase":"^2.0.0","tslib":"^2.0.3"},"gitHead":"7025873ccf8db5f13bfa97c3126f4a2da1f5b072","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@6.1.0","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-dNJnBOhIDou1ttEgjDgtlt91R8QVhIW/Ul+gHu+eoldZp4M7Uin9MObE7O5f3LOipXEHQQuURaum3sCDulJpFw==","shasum":"a6ee1369e4540d4f2540f4d1a794cf7900926815","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.1.0.tgz","fileCount":96,"unpackedSize":3598026,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgKHZwCRA9TVsSAnZWagAAT3cP/jTdcajX6epApiHFGk2v\n5r2U/i1GQva8At5q/3scgKYoYGz1xVDzOIdB3ZFcOn/ADArpqtqbQJVGZK6L\nMmsGsHDxzyDwphT7ZEIiCu7vKrwWVEqMnJGrG0TbbrEn729Xk/RJKZT/5s2t\nxEIKkyp2F5tdk0YZ2SDKDcYRqfzOterEnC/UtZ2crR/EmDhaBrg1LokO9reb\nYhjaqZIz5b8oD0zMF+LiAxfZTdjvQi7ONKhwcQmvAPuok8RMrhyKjxeM+gWe\nL4WYKB5P5sRvOn6NT+NXTgabTJcgvxWMuTHJ3u9XfPwMLkcVWwsosQEDW1om\nnj0N73Iqy4moJElZZSzpG8s9foeUFUD3N667nwx1sufdH07dAuj+INvaKRda\nkSzRhlIe8LPiKduVkdxCu6kkTrHdPIvBxqVdbFtp184sGCsgkt0A9mSRLbp4\nQotzG9aJcoU2rHIpsdBzJ+4v6Nj56aFtAIGxV6wvSOLyMp/b7sqizk21+YEW\n8/fFEfTHfCsKiizVImFAn3lcMvBeaKNfoBbOH2UW7mTc84aY01kQ7zZE63/A\n2cJarzVPjGMejWMFoiKozfnM2Umg9sWzLvwxX1ExrqLwNhJJJKaELDx9YVUW\nwFfi3mbPE4lsz0d7RF41W4J9R1SGz/mIA8eMTW1MkhxQq++Vx8eKAjl5zT8t\n7kJS\r\n=LV3u\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHcdWprXWSYvETx1cV1iEmObRxH73JC32nbQeth5Rvo1AiBEsAqAVDbY6+UbZoZvK715JdydhfTrf46f4Zav0XUl8w=="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.1.0_1613264495600_0.9275788329784052"},"_hasShrinkwrap":false},"6.2.0":{"name":"earthstar","version":"6.2.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-storageAsync":"tap -Rspecy --jobs=1 build/test/storageAsync.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.10","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.2.3","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.19.2","typescript":"^4.1.2"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","@types/multibase":"^0.6.0","bencode":"^2.0.1","better-sqlite3":"^7.1.1","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^0.2.0","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","multibase":"^2.0.0","tslib":"^2.0.3"},"gitHead":"6eaccb836c68083c871903ee073bc4b60662b8ae","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@6.2.0","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-emdF6peLKRIo/nxBdWuHZEVpgxyoihNh4P3ktHuCNgUvSnzR0VPCx+t25rhJ9Yrw6vOylzQmrWE5YQSN9knX8w==","shasum":"ee8f71d66fa2ecc37eec81782d21a4e092b569c1","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.2.0.tgz","fileCount":96,"unpackedSize":3599008,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgLEBpCRA9TVsSAnZWagAAfREP/1CtICHaMgSIik5Cn6//\nHQflAzU8AvpLKWKS9zJKcPSX9a895RwjbSeuH4SfLAj9W0hA0noFmBKVAi5I\nIZd/IJW8c/QeGqn/pZ5635zBDvebwgdX2lCiNVDjYtLLjOOUzM0zTzPLRUWg\niBmZcZM/eStV4gjYijddmY1Thz8zOeJEMQU+AL4p4z5E+ksMeWvnZCJXcG2R\nPfBHJZx/DSF7d/a8bd3Nn/wh7/Lsf6O50X271GVW6CWZZg3YZBFhfc6CqjIA\n8E133y2l7Pi639MaZ+0H6jGMBXJ9CYq7XxkCsLMd8QAjqQfF8mQ60VxCOjkJ\nyprhdr0JzZoUm4igOkERQ8RLvFlVeYpu7me3hXkkkjstXNRAmD/K/oBexONn\nvTyrqGf8V8ZHq9sCsrQ54ae4ZEiojrXTzXBjvKuT6OXx4CbIR5gJ0bQg6YZD\n9MkwzBoVHE7greDA0nDdkyDJlg9THaG++ytVgZR3DbYj80yS8tfo0ndPJUjZ\nLg8mx4oyUCIl+aTtDb4IAaVscUDUyq7/qFnhTkL1xdnzqmZR81FfTFEoMjsu\nX4Fi6ScRXmYZ2wxnJizDv5BJ+XraZI3mUFX/mfxOhGzNYIMqR1+/57VHV8PM\nuvP3L55cOz40sNxNK15k6BHfUlNb19wXncFkEDf/qTradiZEpCt3Wf7Md8Ig\njNdQ\r\n=oI46\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICbrQO9h8+qgRA4UVvxa0+vpllSHr6RnOJ6CfAOaMybEAiEA7WQZh5hxVALUOHpN2loDqDHO3PGD4WYv509BsUiWWd0="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.2.0_1613512808493_0.3105688020261195"},"_hasShrinkwrap":false},"6.2.1":{"name":"earthstar","version":"6.2.1","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-storageAsync":"tap -Rspecy --jobs=1 build/test/storageAsync.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.10","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.2.3","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.19.2","typescript":"^4.1.2"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","@types/multibase":"^0.6.0","bencode":"^2.0.1","better-sqlite3":"^7.1.1","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^0.2.0","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","multibase":"^2.0.0","tslib":"^2.0.3"},"gitHead":"9da599895123e2a56f7474764f7b9e7e29ad2931","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@6.2.1","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-OxC8yo0NzFg4HJUdfU51lU7u/XfinxwqmWMIySTUKT8YMcE2xHFfnDq02DXxfiPQz12eq8YvpFCJaEmw59ltHg==","shasum":"914e51a5f8f7af7eea8eb67b340dfe50a214ce5d","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.2.1.tgz","fileCount":98,"unpackedSize":3605334,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgLsDgCRA9TVsSAnZWagAAGcEP/2DRhm086nYG13csW2kY\n48Fl9N2G0xZj0Y0hKuHXDbBn3vkjqifxkd1+xodKhr1XPcJ52LU/XIBYbXyf\niQutQ8/YVD3VJfbIhFWxZuQByZdAmam4kZwxUU4W70/6gpGCIV+oYacvl0Tj\npX8v/6Zz/bIxjhBs6yEfaCuHTzklXOFfRKjmUAPuqK5Ay7xuuQv27b2O4UlB\naC5v8R4Mf3ubsP6FdywtyVm0XEnl/7gfMHlc1qbzVQesu/toQPNUhzu5MqwY\nQAz4qa5Rwde6G86FhmpRtI0SzWFnbzyUQHULmtNpNgiKj5vGMTho3hH1Rscc\nxS8au7a5Hs/4YIqPl/q6reAW6D0bOWn3hRB6lck6n4y5JPhQ7/YOB7+9Gj5N\nieNMP+AHit98QYwOIMRBMc6xL5Q0X7JEY4BOe2Q6WgmRfe73BF1IJqlolKYF\nUwDUhy3fnvoq78SV7uoKsF47BfjzbCaBGD3MYLnwO1F1VJQIKVlujqBatrs8\ndALjajfKkuLcq0gwX/H32DHVAt0e7OSqVTIFTAVJlj2EV0/y4cK8gw9c4cLn\nUofIYQDh0PrdlWOd35reH3RmuDZDQ8DiHzYieH8FlORp4vGqulskzcRmFbHh\nLhKNI0RMsxXBKfNaPlqR/gdCkgR2vP8szRFeGTQ6ZzViu5ZufeEzHeZ/wyB0\ndFxj\r\n=pD3j\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCmEXiUR2A2PnB68ChuNQo7rKuSYeXwQqm8g00pHfMpRAIhALBK97c8tIy0lEmrwMj7wNoq8+e6gi00+L66zQ5XwaDl"}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.2.1_1613676767923_0.19821571478201427"},"_hasShrinkwrap":false},"6.3.0":{"name":"earthstar","version":"6.3.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-storageAsync":"tap -Rspecy --jobs=1 build/test/storageAsync.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.10","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.2.3","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.20.25","typescript":"^4.1.2"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","@types/multibase":"^0.6.0","bencode":"^2.0.1","better-sqlite3":"^7.1.1","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^0.2.0","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","multibase":"^2.0.0","tslib":"^2.0.3"},"gitHead":"f7f3318d3ea85642c23a4e252754d28d0c2eff77","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@6.3.0","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-z92PuWUjinwGUkzriOv45O56xdVyB8j9vnoUs7oI+JauZrSEIp/dbUKe3xNYzaqus8UAGt4FsdDcudD2yixjBQ==","shasum":"638920e1f9dcc3267055f745036aeaa9faeda163","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.3.0.tgz","fileCount":100,"unpackedSize":6753341,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgNYTSCRA9TVsSAnZWagAA0sAP/RduUBZMSmTGtrwyKT7h\nEpyFqnlhA7896xdrTl5Uatsf+tEHNoj1F7S71f93qfHcBYkeRI8PaQGWsXZb\nqR0towU2plFu2LBMeRVvtHJiasAnZh5FJLcWG71P2mDjxhl8L/GPWMUAmNws\np/rIaEub/FcgV4xOVaUZo4M1EM8lZE/fnu7VKuu/th6LlpcDxaxvQ0oBce5+\nuu3fX5rh7CMw9uYFSihWnrThtpaXTs2mogr8ZexOqn6RBHatcLTmU+nreYZX\np0T2U4u6m9J0Z6neWdTaI9D/sJmFHO9YMsoS2ifVF0X8ftfMu1EPTA1zPMbY\nMauBEiTycpLyuaXOfqydElbzZYy5qKfHjZI4upG/kMGhr8XpzypjNRleuMAa\ndaAZDEcCnmKKysppeB4KTuuzUxfvJ3qtCta2i8JZrbgJVf5OeEOA3QgHOESL\ntlEu3YDwxtMzSkdS9dftdlRygxyoAhF11Bgpa3Vr/ViuWun4+D8Hithtb/bq\ndG9378HgMue01YY9O3x9Xv5+rKvntjlR0SDy1nWiktSbWiiaZUreCvHFVNZc\noa33rsgCpYOg6a6dER86ptvfI+yoaI5YPqkXp1uq8hEj8/0KQ8PgBU0C/Ie0\nxpOhDJ1GVzNhKPN6cXE94iyxZmaSTZQrqr3yx5weu1F4ZcfO4wWs6WwYdXkc\nn5SF\r\n=woBQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDU3vr0c7U1GyAQLy6VLb64Z+yoanmn4Bx2McB/zByujAiEAtj4DfsFh1rY84+JrbVbsxOdz87XzLgUOsbeLDhuhKW0="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.3.0_1614120146169_0.8903354074920966"},"_hasShrinkwrap":false},"6.3.1":{"name":"earthstar","version":"6.3.1","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-storageAsync":"tap -Rspecy --jobs=1 build/test/storageAsync.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.10","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.2.3","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.20.25","typescript":"^4.1.2"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","@types/multibase":"^0.6.0","bencode":"^2.0.1","better-sqlite3":"^7.1.1","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^0.2.0","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","multibase":"^2.0.0","tslib":"^2.0.3"},"gitHead":"6089bc5a826378bca4d3adb4088ab59907f4935c","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@6.3.1","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-+kDIE+Fzk+R98zwKrUo7AiEWYtylupn4PRnFrsRrLA+vtljBmuoaSjo4jZYvTiCYb0pAbv6T0eOiGnWw0atDJQ==","shasum":"8853792904fbb90efeb5efd7c7e80ab8dd331442","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.3.1.tgz","fileCount":98,"unpackedSize":3637440,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgNsHKCRA9TVsSAnZWagAA0OoP/0gdQnjSl8ex7m4AlQjD\nI96h1U+PhbVzdayKd6sHecTeyOsHc0/rNdWeVo/2I6yMohygR991kJxIM3ro\nuEfkKKce1B20YZaVEUESq0iaNwd/X/4xkOCLIKtp2is0M/Yuel/0vjjL5kA/\nS9g1EnmKdDUfxT79TnRnZIZNubUOrLfQTsUIVXkh2x5esQaK8G0Sodny5c1W\ngjMJd41Qmrzq64ILiRQLaadqCFHOyuyDF0trZDAjzzLEa+jEPzXumagVvZuv\n5VUz4x7jEUsINe6kCnEzbkyDRxFH4ACt4tmHVq85Nu7UMXLFJsjsRun6uKsN\nICz9FVH9gHuvYh5Fwc3ry5bBLUK87YUhaltQqYynuOHasJwnzu0wTL6x2vQz\nKiSHvmDvrdZM6N50FNYSb/Ctx6im5DaHbk9ensYaETyN6wB1tl/Pg9VXXFwg\nEDVORxgZTv6HL/tvE5sg893EoV/UCqrqXfT27KfSjsgjrzEo9M3PStB9NLwQ\nCp1NfDdA1PMwa2TAOpXAH8LyPNPuqQrI6tMW775y+PS2bwDdGuNlkM8zusBE\nNe8OjCXLxnYl0xKfPRhMoMpz2hxWd94bqJAnMxW7VCGPVHLexqGAQKbWqsp7\n9XAc5dHrZ++buDk0QD8RuOUFb1KCSeKBZodl82L8Q6I+BdFwcVuFKx79LLot\nHwX4\r\n=eELi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFP3Lpnd4nUw//XOI1wgk/OsCySgZRJ/QqQNPBl7whgwAiEA4lFx4nM3mdwA13kCW+YpUIoHMuBqB0KfIP65Rv5Mm+E="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.3.1_1614201289900_0.2906444312392289"},"_hasShrinkwrap":false},"6.3.2":{"name":"earthstar","version":"6.3.2","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap -Rspecy --jobs=1 build/test/*.test.js","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-storageAsync":"tap -Rspecy --jobs=1 build/test/storageAsync.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.10","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.2.3","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.20.25","typescript":"^4.1.2"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","@types/multibase":"^0.6.0","bencode":"^2.0.1","better-sqlite3":"^7.1.1","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^0.2.0","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","multibase":"^2.0.0","tslib":"^2.0.3"},"gitHead":"4ddb74168dcf6a98bd2173ed9dedf8a0d7f6783f","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@6.3.2","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-cqvqOvNsNJ7yVFnR8kRpkykXaJzvuH7c97/9ehFmImaQwEa4moT52urvDPoGoKsmrWklj8leOtlV5cXCJUisug==","shasum":"dc2a3dd4835f4eb801382378d2535c2fa25b9762","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.3.2.tgz","fileCount":98,"unpackedSize":3638205,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgQq8jCRA9TVsSAnZWagAAM6sQAKRaZVM5TNR3DVr2BNJE\nKGaJvRXe6yR3kfu42QwUI/J5CqMjL1L7IGe2zyNwY9ySxZXOBGLzDrETK/SM\ngKZQSqvSa39Q7NSBlpCsqQ7Q42jomxNH9By11snjZc4kUrftoTSvhngocWdZ\nQ4r6z4jwiFPd+gybU+gK6c5yGyPwvpQPT7uuyhn3M0tgYBRTMf79i8z7AfUE\nMTWtSUyPfMkHBvo+GOfFEU+PQa8yz/zq5rY/k7kEAAAxbcc2jgZy5vrvreq9\n+OVSdYsMgiPLxb3HKXELTMDlOyZuzZT4hAal2oRgnh5ToNokeU8TXNZxBOtm\new+hhuzLIAJMFVdD08Hup1CVMLNLiqi+2uXXGu9OpfSYRT4YWqjMNvuWAJlQ\nDuC2jX9ZTHplefua+c/7Jx5WrZpz9uhzm42u3asXaB8AVeNoKiDQja5w+VTX\n6UQBy3P/HkOtplvdQA1q3bWPu/8uP0A9kpAMG8syjKy2HqkK9uLoYAfWajWr\nUU8UN6w4adL2b9JcepITxRXW0sylb0bPsBSiD6DlNFhD/D/RX64D4BAQ0w1b\nmHljkdOEzxBGIe5tNZpgfgq/K7gG14/BW0MLGOKtLY4ZXeU4GppbXPqYHZb8\nV1sWVCJzDUz4IsPW1aHGqwwKzZHsXPjAslAlQuoIMJSYpWNk1rqB3BNMDGb5\n0Fys\r\n=PyCh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDK3muL7r4XAuFqPbC9UrXr/HQl60Bec5tIFFiOfmPs3AiEAiWqveWO/+fhX5XsVlXJHMci12D859KBDX2HOlutojys="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.3.2_1614982947381_0.7382677829116149"},"_hasShrinkwrap":false},"6.3.3":{"name":"earthstar","version":"6.3.3","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap --timeout=120 build/test/*.test.js","test-verbose":"npm test -- -Rspecy --jobs=1","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-storageAsync":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageAsync.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.10","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.2.3","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.20.25","typescript":"^4.1.2"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","@types/multibase":"^0.6.0","bencode":"^2.0.1","better-sqlite3":"^7.1.1","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^0.2.0","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","multibase":"^2.0.0","tslib":"^2.0.3"},"gitHead":"ba084e94854572044afb449af74b6a2c498e557a","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@6.3.3","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-6XHWVoKBDB7mrrvXmMxdwdwmu072KMgGGGlQH0xU0N/inp8pSXyblIM0stUvPPkv5BbqkdIvKoYJ8e02ACLNgw==","shasum":"8750d7c317854b55d4ef343da882d3fc5e33b77a","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.3.3.tgz","fileCount":98,"unpackedSize":3639817,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgQwzwCRA9TVsSAnZWagAAAM4QAJ7IgXdL3EEVzpwnSkN7\nGDYWHht1NB0aV8Mb3y584sNx1GcZ/QtAy00tjoUq7G8Sf08wygJobVRM6Rm+\np4wnGRZ1sP8Hkfrxwb+0rcwFsbY3iwwkzGl3H18Yk+qM6CIwMEsV8EuW75O7\n70X9Yi7Y/BmbNann0z/yhqDciUy0c83gRap/D4DjofIeZwP/3ETUc9u56v9r\n/fAC2EKQGfa1j+lcovOLGnEJCfqcEbNKgXhqKjobYi6iXi7mcS/UbYrIyJ+O\nq4mnN/Vp7YXc2hbxIveOU8pX7JSNTivelzVlCNYIFPEKMd+UEoFwsVa9xLda\nx1PKWwIkgA8p64R1Dtq3IRA43pez+bdy3y4xNGaboRxrSOISND7Bdf6Xg68M\ns1t8J4IIgoBjOwF8JKumP+LQinZgUqmFioFEOmXrQlg026jqD77PmqW6J+JD\nhVxQfqEeC07PERVHmDYQXgtL8FFeQwLwsMGYp8/lJMFeiRTPZVdtEjjPlT+J\nHzGVcxtNwnWvwKBlhpi005cF55MwGBVoAOEv1VVSc0BbfPmzKnJycGES3XKh\nBx1Dp/w2AHmF7mIFAR3njU0iW6EFv75BkoNAURwdOJxXoKwsntgtZBZ+WUzj\nc7t3MwxyNzKfBPYLA/MXD9oCkiaVIClsZWrUl1hUFUFbZIOGPUTOvEepkA7d\nGd97\r\n=yjju\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCEH5Xe3MJR7J8j6eYZgfyUCJ6r4J+sG6jpfyN156YFCwIgQ/Rg/WFBUtQTqAbFV8mV72uH/1ehpGbdKIpUyLwkUfg="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.3.3_1615006960065_0.8036661042455102"},"_hasShrinkwrap":false},"6.3.4":{"name":"earthstar","version":"6.3.4","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/detRandom.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap --timeout=120 build/test/*.test.js","test-verbose":"npm test -- -Rspecy --jobs=1","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-storageAsync":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageAsync.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.10","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^5.2.3","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.20.25","typescript":"^4.1.2"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","@types/multibase":"^0.6.0","bencode":"^2.0.1","better-sqlite3":"^7.1.1","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^0.2.0","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","multibase":"^2.0.0","tslib":"^2.0.3"},"gitHead":"d6e2e7e56f4ce7fb1ba2843e26f57fef1090039d","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@6.3.4","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-xX/h3UxYoROkwTHuQ/TwQysPUHLdZRjM8qA/q5R2eOmGKRpVYi6Hf7bUAAljSyP/5/8fkdUxpw1dO1rlRrzZHA==","shasum":"b47fce29f023e62cd0909ef1a8022f2cbf034b2f","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.3.4.tgz","fileCount":98,"unpackedSize":3639986,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgQxGeCRA9TVsSAnZWagAA9w8P/A+hkgWOXkdUS3OOuVZE\nXJakz9qeq8ebXRRaDYC8yInYS2NPj+Gmg53xZr47RtKppjP6HszvrxAdOShr\n124HHPg8HY0PEBnp4U5AHVfCYYQbR0afowRLJ6FBo4deASvOX1uU/3g2LGyA\nYcqC231p5KxlEverHvk+f9gSGnOyYdvQrdQmTjtHnJkHjzgpma5Ysp9puyvC\neDM9+bCBzk9MdGVYWJzj2RZTTtMfkEzEyLEUxfq4AmoKGDRzHS4Wwz+tJnEb\nZ0+1640oWwTBx3pCVrvW42C3sMyqhzfkBeCTHA0Wyh7LkZDbWB8LxzXsti3T\nmrydMUqV/56+fEFLW3eUYw26+HE4SG9zy6G4GcYGIWP+S787UIGaajTnWtug\nMaK/Jxsq798cbLKxLqUZb9zk7h7F6Pyc+KBZi55g0T+Dhcw6SrJgBd9LBl9+\nxv9MtsLmTxQzybQdoV+BOW6369JimTMTToM8jurLSIKMnAdIBWuTnOjpzmgE\nUDsIn8tT1nPUfrw3axDJZBbC/IASJKIjJ/Fv92q6gg79hJeDf9ah6EQbZwcE\newvaFICVc+vwtyELQWC9r5KJDnkDvEPo3k+68bb+9ktUhTxOZSFen5InsyXA\nL6X+aRrI0wPYvvkvclhH5O1rVbFH7mKHQZAlGm6D+rUgCgUTBuXbYWiPcXkB\n3c1h\r\n=U31q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC/eDBUf2AhtODlTpRkRurBEjilWcbY//EGSKFDxqGmEAiBPJOkAvYsiYDRkQVL3aPJEOOuWPhnMvVr4WVP5D7WJkQ=="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.3.4_1615008158236_0.866190609573779"},"_hasShrinkwrap":false},"6.3.5":{"name":"earthstar","version":"6.3.5","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/extras.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap --timeout=120 build/test/*.test.js","test-verbose":"npm test -- -Rspecy --jobs=1","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-storageAsync":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageAsync.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-syncer2":"tap -Rspecy --jobs=1 build/test/syncer2.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.10","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^6.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.20.25","typescript":"~4.1.5"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","@types/multibase":"^0.6.0","bencode":"^2.0.1","better-sqlite3":"^7.1.1","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^0.2.0","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","multibase":"^2.0.0","tslib":"^2.0.3"},"gitHead":"6d9a631809825d4463cc75fe9e0cc62f3e9eb966","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@6.3.5","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-TrdPeV+4akMUqbgAozYlPBJinv2XOX6udWqsoAx5n6/YRmDb/lQxqpOtHUsXsnOsi29ERbe/CPQ36Anh4vOkmQ==","shasum":"49e08cc31928be86820e8d84995c483f22551f4e","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.3.5.tgz","fileCount":100,"unpackedSize":3644408,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgR8oUCRA9TVsSAnZWagAAtFYP/0batHNjhAneAngJL5NO\naL/ru13BN3w1Rzn5iuKMOdLxa/aBrXvzl00Ps3GwPL8ciun54f97ieLicwcT\nxhDPxJQqgE2roNwvJ419pPU4K+9wE+MDX+USyIPbN4WG7Xjn+XHD4lTpgqks\nqNCTTyd/oonnU7h62vzv7jhKQ/ytRbnZwFfOAF7Im+b2qS2I2FMaM+B8t8c7\nrNhFModgPjNEXVX+m3CDXR+SrBuMbVi96aKDAqekJT0j9nk0Pla8R4/nvWSB\nDLASqQcWANR4XuhEsngPIP9+u9IVxaqg/fWYD0OR20ByUpCF6LU88RvzSplv\nxYYtuFVh2LN/PijxRTk1wF4Y7/M3TRLTT+APKO63clwk8wTFrqshlTH7m4ha\n1IPv6v4tc4gjlX10KcznQQZ0vcqXDufdjvu8zF6YkQa2Y0gI6EvWiLB8mf/O\n/5wqf0dpKcAkuaK8li3jdAshH9RhgHn1fxzW6b2uW7141CLlP9q28i/5c0cF\nV145bvfkjFu0j1/6AUAubEPSivIj7hS1ChfI0ESUHExEX43jZGBS57ePdDlJ\nf4e8mtJNVIHEwOonNqOnYgJphsp04zWGILDs4Iy3PtFGVaLM2O62QxU+j32f\nLd2cdOCNv2elz7mVPA0AXGuRC4lBHkOqnKBMwMXOGkRf0dJniIR7qU8v1KzQ\nvAF7\r\n=qTra\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHOlK3rKhvY7AEr6qTEiyhL5huQ3sbEqRRDjJs0PSC3DAiEAxr+lXp6Zz7n172Y09QuivWO+1ObB6n+yqPNh76nMbMg="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.3.5_1615317524000_0.29731131388883747"},"_hasShrinkwrap":false},"6.4.0":{"name":"earthstar","version":"6.4.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/extras.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap --timeout=120 build/test/*.test.js","test-verbose":"npm test -- -Rspecy --jobs=1","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-queryHelpers":"tap -Rspecy --jobs=1 build/test/queryHelpers.test.js","test-storageAsync":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageAsync.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-syncer2":"tap -Rspecy --jobs=1 build/test/syncer2.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.10","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^6.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.20.25","typescript":"~4.1.5"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","@types/multibase":"^0.6.0","bencode":"^2.0.1","better-sqlite3":"^7.1.1","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^0.2.0","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","multibase":"^2.0.0","tslib":"^2.0.3"},"gitHead":"ee470e5a3fd5a2a52c628a1db040d732dd59ea7d","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@6.4.0","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-lkpVn3I8oKn0KxA9YVF2NsE3n8lI14W61SY88w82tMACVyXTqwxXxDu2+pQv2PsI3O4jVnvE5BLnchqAMDdb3g==","shasum":"955bd553eac3b0d9ea0aa969fd90e200d7c11c33","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.4.0.tgz","fileCount":104,"unpackedSize":3636786,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgV7UcCRA9TVsSAnZWagAA+iEP/RpiQeIKKJaNQZeTaTaF\nTQTp5C1xSOU0HqGIrb48R2XxCq0MmXa4CYFg4bbTFXuuAxKfByIuDfmw+bpX\nvwNZIm50H8+N9azJsshFV9rSFUMhATGeko3MfsguCXXtbF/AxvpW2ebzgruu\nTwBJQOTgIv4P5RVIfCKSCwmp+ZpsgO7v1TcBb1gQyXMX1HUdX+EF25nso7Fy\nheWj7VZfGNfZBSJpFO/LruTAENakpz5LZBRtF/sy1hBGpfUrs5xU2P6nIeS/\nQFaeAapo5apaopM7zEXfGao5TRPUV/9lOqI8P3Zd7h0aFKzuyy2DUXW0e6jU\ninhEQoa0q9qqhC89HMH9E3vy9N7PWRzinQBcDlpdt98Jrw+ubPRaefV5odzj\n7cIhswQKZJ+cSVwI45YDMQKWg1gRWaJu/yOMXTNyS+oqjWnfqyWWrpEZgQMj\njTvVNjdHj/KKmurQynkOC1120vdJ8aEnrz9XdN403+BxOvj6lmAf8lLZE4+p\n7LDmPv8B0wdvx/FE0dXCAXCJCafIxdQN+07F5c0J5aulRkdDxA4aa8+yp9vE\nDYt2RfMN027G3G0fQo0vYi9U9P9PYvTyLnLUcjEes+TKkMeIVEDJQrmCKLHw\nSrjKXh6pyegPeVPVB/hr0iEn51kff6gMCH2cRxYPTaHwT0iikS2jfUWJKydp\nL6sy\r\n=wi8H\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDsEBJJXY+oX902hEmW3df2c2FlFEVl/9haiiTPBJGalwIgTZdcfyER39cEgPxFSo45e+KngrI051P7JhUG1ilVaUs="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.4.0_1616360732044_0.5833480622304517"},"_hasShrinkwrap":false},"6.4.1":{"name":"earthstar","version":"6.4.1","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/extras.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap --timeout=120 build/test/*.test.js","test-verbose":"npm test -- -Rspecy --jobs=1","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-queryHelpers":"tap -Rspecy --jobs=1 build/test/queryHelpers.test.js","test-storageAsync":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageAsync.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-syncer2":"tap -Rspecy --jobs=1 build/test/syncer2.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.10","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^6.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.20.25","typescript":"~4.1.5"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","@types/multibase":"^0.6.0","bencode":"^2.0.1","better-sqlite3":"^7.1.1","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^0.2.0","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","multibase":"^2.0.0","tslib":"^2.0.3"},"gitHead":"a19ff805b2739b423fc75edc178eb2dec58ff488","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@6.4.1","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-oLTfGlYZunWBgPvbSs4mQ2k+YeNg/i49pmmS6LMpqHHWlAut7g+Lqb49aQiIJt4DzjgK8pvZoMUeL3ucHThF7w==","shasum":"ad2d43856413f323d42cf33c543f614423a50934","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.4.1.tgz","fileCount":104,"unpackedSize":3646778,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgV8ClCRA9TVsSAnZWagAAJQYP/Rr8oSg1znEaxqg19vBx\nF/QMV7Zi7qi2gDctxCzQGlUdpD0XtQpc5GjUWiX1+wFCmU3AqFnCW5JvbPqq\nnQRb4QIvffaiwLNu/aijxZ5iNfWjnJbqeSqqsSdxFBzFdRrEH+dg6ogSjADe\n4exAh3o0UbtX6JZ+TwA9OmUoO7uQ2QeYNTO1A13urKkeegMgAlguA5KzMbzD\ngaOCqu35R0HqDWgvaMjHAGTnGaOyq2qQQrf3aVBDUVaDUgAQ/VTqni6sJXSX\nhQq6zikhxm+ZgD9wMRs71+9x8IGjd7On5mjOUczBvWvV3yMtAGKoAiX2qGQY\nFOMVmJlxtAZsx/QGaUOGHJZEhFHPNOX92z5I7iKUpjoKZUx2nKty5i2c1Gyz\nLACua4K2O0VDhVeSn2yQ8IiPdI374Hc8jJ9P3O4zl8HVgnP6o17WtJ0lBIHU\nf36kxUzepb226Fdf+YcFfGmpJBB5x+D+1NyaKX5GQPkOsvdGv1tKtWxW11pw\nSMO0YU2HTuMnWGq2yqsT7zbONG61uoxUe8LcRWRF8DmA0tios7pR8Yq/06CD\nFY9bmNU0l7L7n7eygB00htH6ULHcMCV5x9R048G+lvshkFhV6AM2M2OuFRk4\nryhJc0KDXccr+vBO9KSe7T51OBiW177HjO4I365DvUeNh4n3nmahG2NnJ6gt\nPbNy\r\n=m/rs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBGCyhWzJsCOGvck0klL+901P4VmHApmx4al5d7mR2xWAiEAv9t5x11oYp1OLxCm02vVS707rywsVngCbaGK/pxA9PY="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.4.1_1616363685181_0.3334046335128862"},"_hasShrinkwrap":false},"6.5.0":{"name":"earthstar","version":"6.5.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/extras.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap --timeout=120 build/test/*.test.js","test-verbose":"npm test -- -Rspecy --jobs=1","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-queryHelpers":"tap -Rspecy --jobs=1 build/test/queryHelpers.test.js","test-storageAsync":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageAsync.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-syncer2":"tap -Rspecy --jobs=1 build/test/syncer2.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.10","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^6.1.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.5.1","typedoc":"^0.20.25","typescript":"~4.1.5"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","@types/multibase":"^0.6.0","bencode":"^2.0.1","better-sqlite3":"^7.1.1","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^0.2.0","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","multibase":"^2.0.0","tslib":"^2.0.3"},"gitHead":"450714bdff6c51007f469a5df1463f97cd51b3ce","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@6.5.0","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-6T3IqBTQ1FAA0svmFhJM+s5SsejdrW9prL4TkR33pXxquTHS3ocr8dSpy6+Ra/Ou8BUlypl5YTNmSsCNrCvfxg==","shasum":"4bc4207236fd9f2b5a76bd42afd287adfa2dd0ae","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.5.0.tgz","fileCount":99,"unpackedSize":3653277,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgXT3NCRA9TVsSAnZWagAAiJkP/1iqCIcbBHNNNVk1fYuI\nqPidHkAuZ9pyTAlu42rfy8Xlfernlp2gtI/oUrb9fEx6bLjKpus4dFU7yXLS\nRcDMU8LdVL5OONK0NfczBFrueTAV1/XJcD1mcT4IxOPzw1bMqdIA1pdW7q4M\nKrG8hOivr/G3Brq4/yEMiiXn3zi5dKbRmP48M7Y4Caf+hYJAVy5rCIa2gLeF\n0zYYC7kHDVf8kd3bwdYUoLJD8puUAZxcsbK53hH1mZc7VKg/NjLlkFYPmZuC\nSffNPeIWMqseibZ+EsN/JCkb0Txao7j1kouFa1DFibb5IgdwfvDrqgeSCKSP\nXSCnkVvachE/dioLCmNZH+u1SETUJCpHzb87JD5bVPj7dGcO7Zb/48Lbn3af\nySoNN6Dyk1XeEfBoEjo7IMu6txGSSQ3/PKxFRHElsctlU1Newlw9yME0XHvi\naV5z5iC8Fw1E77zcU5ZCe6GFF6qTn8XwixFxu9yAmJe45Xl1Q8bl/nb9Nno1\nO1Pe3egXvYO7oAMSYhYnCm/SLB2Vhs3mfbjlMif/j1XwlJloLWU3K1FGH7Kt\n0YQLw2Iz8uQZZ8iladQ18w+5mHHDkvJG0bKaXt9qnvSfuv3QQ1rgXLNrgEgC\ntngXm3AR+v+ngY8yi1YVPDLF4mLVXrgfW70F1Kqw+U6flO0/4gwK0QBcVCre\neEO9\r\n=dNkP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC1IhXurEYgOasKiNy7HYB7ZyzrBsnyqtxQI4kqQMOW6gIgcx8eUqqtUAhIo6Zav6C44TdPvXn1zSVb1cVVkzy6DBQ="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.5.0_1616723404755_0.7754980916613425"},"_hasShrinkwrap":false},"6.6.0":{"name":"earthstar","version":"6.6.0","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/extras.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap --timeout=120 build/test/*.test.js","test-verbose":"npm test -- -Rspecy --jobs=1","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-queryHelpers":"tap -Rspecy --jobs=1 build/test/queryHelpers.test.js","test-storageAsync":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageAsync.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-syncer2":"tap -Rspecy --jobs=1 build/test/syncer2.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.37","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^6.3.1","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.6.1","typedoc":"^0.20.25","typescript":"^4.1.5"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","@types/multibase":"^0.6.0","bencode":"^2.0.1","better-sqlite3":"^7.1.1","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^1.0.1","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","multibase":"^2.0.0","tslib":"^2.0.3"},"gitHead":"4c04afa0134ab6e7565c1acdb10d4894d54368c6","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@6.6.0","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-+resIEXbzantc3h2D8JLrA9lT+cwWJUly3wOfHrp0SBb2ExFU9H7VSz8urq6bCDHLx3O2a/1foQmFbmlBtXATw==","shasum":"21af960018a1b3250d23d4d36b628eb3be2af88c","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.6.0.tgz","fileCount":99,"unpackedSize":3705784,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgX+BiCRA9TVsSAnZWagAATukP/0jRInTAj17h6VFEagtR\nEGg9Bs0HwhiYPquQLNvTct2l008PqIRYxjX5CJPAJtfnHnFZ9grpBRFxXhLI\nvOh2Z+qT2zxd8LEFPU8USv6jKRZkge/KugE57py/P4CX5F7UXrvkVWIq5fFd\n66StQDvOy2iz8P3wxKt0wH9ChtynZDVr/nDK/QFnN8jbmXrM7qmfjX6eFK/a\nP10QeemMZDOiVrq6H+5ElSO2xclq2pgjDFZl5Kszlhh6+JMAXVrq7vkWIlzs\n14AY4ipIW4q9tsfZojOEVMNsYqVjxIcEhT5HmxgORXBU/cqrzDjBLUSTLHOz\nX+nCC2wOq8y/GKQ0i0EZxaOsi2G6Fj7Je/OqGrw24ltKNkPt8UJ3ASH2FukW\nbp+k/uUg+7JeJqszGju4J2aL7EjSKvfply7F9ZWrn38A1HMkdqUqtDkUPgye\nr8ScfsFZd+ta2NZjJP35NlItZacHcGkNKTi3Hhgs/AlaDfo+8mJbbzchSOHm\n9I7SO0U/r2tRt3TGFBgss3keip+0Hwk3l7VzEYobZ/PLFlD3dQX2/gl9ftwl\nkZSHNM79EyJI5g7p99mgDhDwX1qG4UxvAWTrmcV+3Iqo/LcmzWvXRrWsJNt5\n1g6Ed+Ik30zJfI9A6seA/7Od2vWzb3APi/+LUQz83P/+1BWXOdFtYvp5lqKa\n3+bY\r\n=Po2X\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD8joOVeFDZWrFuQcWrQZdSohkqxJ6mbwXkf+06+CE3XgIgD4kLx87GPK3Jm6JEXNCR0TOF7l4i+hj/vMR7WZb2RQU="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.6.0_1616896097859_0.9305796744897885"},"_hasShrinkwrap":false},"6.6.1":{"name":"earthstar","version":"6.6.1","description":"A distributed, syncable key-value store","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/cinnamon-bun/earthstar.git"},"browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle","toc":"./update-table-of-contents.sh","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/extras.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap --timeout=120 build/test/*.test.js","test-verbose":"npm test -- -Rspecy --jobs=1","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-queryHelpers":"tap -Rspecy --jobs=1 build/test/queryHelpers.test.js","test-storageAsync":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageAsync.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-syncer2":"tap -Rspecy --jobs=1 build/test/syncer2.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.37","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browserify":"^16.5.2","karma":"^6.3.2","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.6.1","typedoc":"^0.20.25","typescript":"^4.1.5"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","@types/multibase":"^0.6.0","bencode":"^2.0.1","better-sqlite3":"^7.1.1","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^1.0.1","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","multibase":"^2.0.0","tslib":"^2.0.3"},"gitHead":"309561e2c4a682b283377d2b758aefb73b27c29e","bugs":{"url":"https://github.com/cinnamon-bun/earthstar/issues"},"homepage":"https://github.com/cinnamon-bun/earthstar#readme","_id":"earthstar@6.6.1","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-cILG2tx4p7D/Zl0osRRZheZLvAxocRUV1EryeHYkfxAbFeNjxZ+P+s5jYnXWjWzoq8C/RL7IO54e4Gi+yYtoiQ==","shasum":"be5f762b9b60bdab73ccc2a242d95f56fee35d8e","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.6.1.tgz","fileCount":98,"unpackedSize":3711402,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgY14sCRA9TVsSAnZWagAAT2YP/3iziRgrR+nVz9LiB0xs\na01k5huK1g9NNO92YQzJxlFSJpe7pLnyfMu7hJCEDUk+Is4/GFRKHCSmJvwq\nfh24YeKkM8iB2MhtOhWRe0GaROKtQmaLjxScSoMkBvJRJ7DPxZMXTBClpR5x\nkx+CkXTSIqOGJuJPRtuuWomCwhutwUWV4aa4Bvse8fPXqF80xVGw6lDlx7sH\n07zn9jUjT5KC+kPUvDvFrrd7qR1k5lxyTWTmSLFQaJNIjhn/XXcKzUdwGd6m\nQ19p0Nt4rmLEkSr25kp0FRfGwlmbrTxAF0RHGa1cpKj6rfH4ZmxtkHr091io\nCIoKKz1OYKPk38x9KUDnh8keD5Cuvc5QyowdMfrOyiIAnwRmCSUO4Pz9uysW\n+xtQ5OBBhoymo/EHuU/xUM1wx96qEHQczbYcM4RMLx7AFyxPpfr2Yovu91BD\nkiDRBrSmhygj65lwzyZfg5lFn+opJOyU68+vQN2Z+87XAxs9oBZ/7WP5Koot\nHUa18Sdnic+2HYUvPnSk4bccJcYPsREl980RmQjcyHufYaktAS6Rvvkh2FwS\nQH4bp7bB4XXvC43Ju2r4JDCJClG15QvjDT3PkPXTMVrv4AW7CrH06o47CDHK\nOPNTBiOsLbe9iRgmvCMqN1nyLccwOLjx8vU5XawKUaB5lwiQZGul2pGxaWaS\nBv+x\r\n=REFf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDdMyOS5Dyf0LrucJ2JytvcwLCtbzTPRpHfHBfX9cLc9AIgCuLFDm8NwKeLsqw5BsVrTbuL0jHqH62kQvNBVZykGeE="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.6.1_1617124907924_0.3255375439034949"},"_hasShrinkwrap":false},"6.6.2":{"name":"earthstar","version":"6.6.2","description":"A distributed, syncable key-value database","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/earthstar-project/earthstar.git"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle/bundle.js","toc":"./update-table-of-contents.sh","depchart":"depchart `find src | grep .ts` --exclude `find src | grep '/test/\\|/util/\\|/temp/'` src/decls.d.ts --rankdir LR --node_modules separated --open","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/storageMemory.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser-with-karma":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","test-in-browser-run":"npm run clean && npm run build && npm run browserify-for-karma && cat browserify-test-bundle/bundle.js | browser-run","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap --timeout=120 build/test/*.test.js","test-verbose":"npm test -- -Rspecy --jobs=1","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-queryHelpers":"tap -Rspecy --jobs=1 build/test/queryHelpers.test.js","test-storageMemory":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageMemory.test.js","test-storageSqlite":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageSqlite.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-syncer2":"tap -Rspecy --jobs=1 build/test/syncer2.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.37","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browser-run":"^9.0.0","browserify":"^17.0.0","depchart":"^1.1.0","karma":"^6.3.2","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.6.1","typedoc":"^0.20.25","typescript":"^4.1.5"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","@types/multibase":"^0.6.0","bencode":"^2.0.1","better-sqlite3":"^7.1.4","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^1.0.1","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","rfc4648":"^1.4.0","tslib":"^2.0.3"},"gitHead":"45e3cc7cd5c06565e146c31bd91e56d2bda14f18","bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"homepage":"https://github.com/earthstar-project/earthstar#readme","_id":"earthstar@6.6.2","_nodeVersion":"12.16.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-4/8eMmrhbWTLxnHpJXJP3VRlf+R58LrCpd2RgtYBaXohFR6sl7VQp6yDTuAFx53ljO0xMS3aP9gkpS5NzXsKxw==","shasum":"e72e24be08e6e114a8106efbb0d5e7ac66227a14","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.6.2.tgz","fileCount":107,"unpackedSize":3915167,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgelY+CRA9TVsSAnZWagAAqAQP/1EriBSd1AQWuvp4uK6w\nuZPNRBLgC2hyvoEpdJyUIibgLZaMwu5BNg/q+4iKglBum78J6LrqvqXjPjpd\nD8FcP+xXbW1IBZMrbV4k2gJtPYoMzcxXB5P9WBna9j33AyMcgW9YB6S78dZu\nAkSMFnQhk/I2VPfzAO1sZ9IXXISY0vMDmdo2pwJXOlBqCehCCZ3AUKq9xSod\nMly633ZfZt3sZGpkEHS7H+lo3GGVPIYjS/UCOf7jJaU9yhFrvMvpVt3xyOMP\n5a3xz70X5xiMjkwGfKFHsuqw+B7Te0VOKuXpTXEbINKmSqKmt0/jvd9Myc6M\ntsaiyNp+BSEgjOpwDLijJw6RKk+/j9ZhDscME3D50M/WqpiDaSXM8TqWq9li\nMRtn2LTJqIL+1iSiTs5g/fZ13L3wGOpttiWrmyDX1MrthjHK/qPQkX6FiiWx\nfTeBXkbrtAC8mRxe9xxtFdSskIBZdKcvcWzAoQsEeY1gPgiWiRZpXqqEqmK3\nrykFyi7S1b+mKaNsiGTteZNcaK4I2jjbQAnmDkj7KpeoUyhNrHRF+gc1KnMH\nghhTvPeqzjNcEWw8kLJQV6Aj434Vzzfs198awFG03KIw+GNPnTaJKyysqZCs\nqCv0UgasWMbMp0YYPGnYG2LUztJVwHdR9vIDEozLliuRd9gH6T6lfiwMgtU1\ncXvM\r\n=sAiK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD7JJ07K4e8I3dJYouSYNjJQPfiqHUADwQyXfwfptrsIwIgVWmgzabnPJt4k/Ky4uaHSYykg/WWEDRyEUy4JhBzF/4="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.6.2_1618630205251_0.93067143339853"},"_hasShrinkwrap":false},"6.7.0":{"name":"earthstar","version":"6.7.0","description":"A distributed, syncable key-value database","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/earthstar-project/earthstar.git"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle/bundle.js","toc":"./update-table-of-contents.sh","depchart":"depchart `find src | grep .ts` --exclude `find src | grep '/test/\\|/util/\\|/temp/'` src/decls.d.ts --rankdir LR --node_modules separated --open","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/storageMemory.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser-with-karma":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","test-in-browser-run":"npm run clean && npm run build && npm run browserify-for-karma && cat browserify-test-bundle/bundle.js | browser-run","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap --timeout=120 build/test/*.test.js","test-verbose":"npm test -- -Rspecy --jobs=1","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-queryHelpers":"tap -Rspecy --jobs=1 build/test/queryHelpers.test.js","test-storageMemory":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageMemory.test.js","test-storageSqlite":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageSqlite.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-syncer2":"tap -Rspecy --jobs=1 build/test/syncer2.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.37","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browser-run":"^9.0.0","browserify":"^17.0.0","depchart":"^1.1.0","karma":"^6.3.2","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.6.1","typedoc":"^0.20.25","typescript":"^4.1.5"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.1.4","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^1.0.1","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","rfc4648":"^1.4.0","tslib":"^2.0.3"},"gitHead":"349d96c94a96a637954a9386ad84808bdfe33862","bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"homepage":"https://github.com/earthstar-project/earthstar#readme","_id":"earthstar@6.7.0","_nodeVersion":"12.22.1","_npmVersion":"6.14.12","dist":{"integrity":"sha512-clFJhPJTonYrQv7D9rzJErhPZMpKnRXV/oWMnqrUuLceq+EZ0QZbfh5TqxldrivIiA/a1htH4Hw/dx12SJLqPA==","shasum":"90f5e37392ac732f2aa5aae216606ea055b14cb6","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.7.0.tgz","fileCount":107,"unpackedSize":3916114,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgg1+ACRA9TVsSAnZWagAA62AP/RnrV/2U02u8DFxGvFnz\nCRP8M7wgOZXxx/6yBoVn+7PXqU5OflCkGzcZpILYmxRbOegg4dHxjZTZUtVf\nY9B+aQxRv9HTH1TszmZ0BMJHh+js5M8gDAZkUcqWUX9o8GEa7nmqCi+vsSJr\nusTApvV+7mW8QwJm7qxnTQlT0PaKqBUy7LAEZ/UEWRAuZJ0PmjOX4my4UUEF\n59ZylKa3sR7pGtzCf9Zk3j25iL+EAg0zYL8oF5vQzQoZmmfm+h5ZwBFejcEP\nJe8DuNHpqPA6/FAag8n25jDFsERW5t3WuLdK0V/saGhhIcwqhr3oup0hg9Pq\nij1GQM7ihxH6MbDdAeRAx+tkoDechGWkazHp/ZHIOWJJv9+kRByPxjPI1U5O\ntEFRO1fU8Uj7Q2a0ZAsPMaIbdq2OKIojfrNOU7hluklqi7JWXObvsYOvkqpb\nGAkn4SQYDjYObd4hTMhDivytukRyCym3rOnm2PpquvlA/OsrkQ7m+ASm9WYH\npKJidgySFfWJ0ZX9TRnVoVskLldWC3z54fj3YL/B4jdoNhVQQhX3/1kRfnSs\nstZiwqmxs733/9TGepp6aqVVU/c53JfWbCg72+uexSWowr4bCzTj8hrKXzoq\nh94XonMKnR9NF6q8r1R8HCF2maDnzxccIw2AnCeY5yNyolp00HIltcqMqOFX\nSMie\r\n=MLvi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCWVoNtjSgRNqvBD+pwwwcb3b+7qOwQV7rR4bTm4QF6XwIhAKZfkPAOSuzn34za1V/eQcbPehBtZFsySeBD002oiXSO"}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.7.0_1619222399422_0.37858398787514336"},"_hasShrinkwrap":false},"6.8.0":{"name":"earthstar","version":"6.8.0","description":"A distributed, syncable key-value database","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/earthstar-project/earthstar.git"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle/bundle.js","toc":"./update-table-of-contents.sh","depchart":"depchart `find src | grep .ts` --exclude `find src | grep '/test/\\|/util/\\|/temp/'` src/decls.d.ts --rankdir LR --node_modules separated --open","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/storageMemory.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser-with-karma":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","test-in-browser-run":"npm run clean && npm run build && npm run browserify-for-karma && cat browserify-test-bundle/bundle.js | browser-run","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap --timeout=120 build/test/*.test.js","test-verbose":"npm test -- -Rspecy --jobs=1","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-queryHelpers":"tap -Rspecy --jobs=1 build/test/queryHelpers.test.js","test-storageMemory":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageMemory.test.js","test-storageSqlite":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageSqlite.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-syncer2":"tap -Rspecy --jobs=1 build/test/syncer2.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.37","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browser-run":"^9.0.0","browserify":"^17.0.0","depchart":"^1.1.0","karma":"^6.3.2","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.6.1","typedoc":"^0.20.25","typescript":"^4.1.5"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.1.4","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^1.0.1","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","rfc4648":"^1.4.0","tslib":"^2.0.3"},"gitHead":"967a8bf56057ef0b86f61741172152f3844f689c","bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"homepage":"https://github.com/earthstar-project/earthstar#readme","_id":"earthstar@6.8.0","_nodeVersion":"12.22.1","_npmVersion":"6.14.12","dist":{"integrity":"sha512-NyD3dtTp0EM79rjsPbcrAhS0aTGkJOG2JVtBqgBR9rd5jTPcit4VTE+j9eL4XvNp0rDpiHJzZiNfrWqo3z4WCw==","shasum":"07285d91546ae90f03445db224c92ef7d0601aa3","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.8.0.tgz","fileCount":107,"unpackedSize":3920388,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgg3M8CRA9TVsSAnZWagAANrEP/2KMtFx9d5bnMxF0bk1a\nG9qFM+jHRbsUViQlsHir8TXeg71CeJoSysUTem2sIK/GjOzTwyz81c+jtFft\nYvbC7aCH98TdcA7Q94ANxHaiXN0rK7JCo4IiU+NePal4t4RZ9E2FSJBN1VAq\n1LZVhUledbNwqq6UMDdIWA15buMHE00ENnoi6YoQNIXYt789hMHVz7Saxz/g\n8ily5+RPn9ASHnna0LWcMBWY45EjnB1QxSmIWfR7DaW8amF7WNippCcMX0Tq\n5xyRxyRWBbKo3sAJNIGLIoPUpaYOeSkismR6c8U84L4+LvLYVobBmUvxS8FR\nYSvalDf1YUgSEdLI/ZKCyxoow+1eE84SBWuakVq8SIr1tPojeNaJDQ+/vAss\neQFfvO8zMj3sjCGHbeXcbsSXCfvpPY7DavwsdFMfLJILfI0qXQ1zqUs1DrT8\n9hnHsP5S+RrkhGj8E/d27ojN85WcwpMZpublqWQviOxu+bFHMRlTmgPXcyx/\ncQjLVgNeFrsYV49uxvXuS7/W3rI78gxF9H+OmfmnXlxHNVCQ9EYsh9qXrhzE\nDYSyQ3DR3Rwys+uiTRg8zowSAqRrdeRK4TE05DAgOJrSBAH/BpzG7GZHZprK\nwBNja2M2v/txpwHHLTjQikpXilzdnfK7KCHeANZN2oaNFV2n1CCRk6lR31tQ\nSr4C\r\n=DZnc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDSe4ER/L1DGMxZ830BA7IDHLPWMDH4/bU1zD2SMHMbNAIhAKcow/PKjSJQyIJNZgrRbBVIcxkQBPH1NZ+Tr6BcoDwn"}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.8.0_1619227451334_0.6797655462365144"},"_hasShrinkwrap":false},"6.8.1":{"name":"earthstar","version":"6.8.1","description":"A distributed, syncable key-value database","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/earthstar-project/earthstar.git"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle/bundle.js","toc":"./update-table-of-contents.sh","depchart":"depchart `find src | grep .ts` --exclude `find src | grep '/test/\\|/util/\\|/temp/'` src/decls.d.ts --rankdir LR --node_modules separated --open","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/storageMemory.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser-with-karma":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","test-in-browser-run":"npm run clean && npm run build && npm run browserify-for-karma && cat browserify-test-bundle/bundle.js | browser-run","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap --timeout=120 build/test/*.test.js","test-verbose":"npm test -- -Rspecy --jobs=1","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-queryHelpers":"tap -Rspecy --jobs=1 build/test/queryHelpers.test.js","test-storageMemory":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageMemory.test.js","test-storageSqlite":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageSqlite.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-syncer2":"tap -Rspecy --jobs=1 build/test/syncer2.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.37","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browser-run":"^9.0.0","browserify":"^17.0.0","depchart":"^1.1.0","karma":"^6.3.2","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.6.1","typedoc":"^0.20.25","typescript":"^4.1.5"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.1.4","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^1.0.1","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","rfc4648":"^1.4.0","tslib":"^2.0.3"},"gitHead":"14f636598c6abd3774102c4433b0a947d2cd0797","bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"homepage":"https://github.com/earthstar-project/earthstar#readme","_id":"earthstar@6.8.1","_nodeVersion":"12.22.1","_npmVersion":"6.14.12","dist":{"integrity":"sha512-kgfUIE+RK4IyfbMmDO2KuuKGYvxLzJdY47oM4a2BYkuEfbPbYYEGygCeXLfCpDHsuCOpRTjksrsT8MGrhK1ifg==","shasum":"d32f0786fde87626c1fb0f00e0429d3ecb77c242","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.8.1.tgz","fileCount":107,"unpackedSize":3920634,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJghJWtCRA9TVsSAnZWagAAKmoP/3SxdxR8OdydkAAHQ75O\njEYK2P470BxqXHUJfY+bEbLG+2JcMtefrm+7PfKWR48+QOV/PPSY04u6m6Y1\n6umxQuLcsnn17N5yyMZfHOyxXi2c2j07w4dIDAn8Cv+FOYktTukK4neCmKS9\nwd5IKnjnDxXZST/1B1V/r/jF9LD4vgmlwO40P+2UfHGtMRko6H7Fr0D0ToLd\nG+jBCyY7x1KVH4AyTTxKc6L11AkgpmE2fMhvXRFUWFtOj59Ik3Fk1y6MUfe7\nBMCN67OZz3Jy7PQ0F1Nxoz6Db0UQYNHk96+U8ENGWHTRs8eAHIO4zHd2MJAD\nynM0P32SsvDo3qay6TvpZL3WiDjUdo4l+1mbME96nuMcbMpmhWsmOeUXZ9wL\nFn1MdDt0gSc8RzYIpPaOvn5gtC425JzAGbZUhTc/2u+PQj05guR9V2suVaXo\nm4H1dx7KjDvmlNT5CpYd9TCO2DKV6rXu3DuSC22en+fjgqR63dWGMYJzedws\nZD0sn9VbJDMMmvn91g0y6n5mK7qkEwHxbYdAOrSsgiTwMiG9uANTAjaJQPpa\n2XbQS6SPsLLymnPIavGJRrCT6hp2a2cZ3+GRVzd2W6BlUpdfRN/goHt/GLyT\nLyePtNiE8kBQ0ORapxXhtk0D/84OBxH8lCxtjrbIPE/VwpPgLGIAubPTcabL\nYbsL\r\n=h9ot\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHbKjDgg/93FC82TVHBwUZgs7z/S01ajK3L3v+fplMqZAiBTFV42A2hekTYOTYvL+aKfjrIptmGvoH0AY7WH0LcepQ=="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.8.1_1619301804426_0.28037792066510847"},"_hasShrinkwrap":false},"6.8.2":{"name":"earthstar","version":"6.8.2","description":"A distributed, syncable key-value database","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/earthstar-project/earthstar.git"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle/bundle.js","toc":"./update-table-of-contents.sh","depchart":"depchart `find src | grep .ts` --exclude `find src | grep '/test/\\|/util/\\|/temp/'` src/decls.d.ts --rankdir LR --node_modules separated --open","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/storageMemory.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser-with-karma":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","test-in-browser-run":"npm run clean && npm run build && npm run browserify-for-karma && cat browserify-test-bundle/bundle.js | browser-run","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"prettier --write src/*","test":"tap --timeout=120 build/test/*.test.js","test-verbose":"npm test -- -Rspecy --jobs=1","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-queryHelpers":"tap -Rspecy --jobs=1 build/test/queryHelpers.test.js","test-storageMemory":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageMemory.test.js","test-storageSqlite":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageSqlite.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-syncer2":"tap -Rspecy --jobs=1 build/test/syncer2.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.14.37","@types/tap":"^14.10.1","@types/tape":"^4.13.0","browser-run":"^9.0.0","browserify":"^17.0.0","depchart":"^1.1.0","karma":"^6.3.2","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.2.1","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.6.1","typedoc":"^0.20.25","typescript":"^4.1.5"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.1.4","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^1.0.1","fast-equals":"^2.0.0","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","rfc4648":"^1.4.0","tslib":"^2.0.3"},"gitHead":"72f29eda8b354c388ee69f1d0c3ab2d9237cb8a1","bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"homepage":"https://github.com/earthstar-project/earthstar#readme","_id":"earthstar@6.8.2","_nodeVersion":"12.22.1","_npmVersion":"6.14.12","dist":{"integrity":"sha512-0YhzFE764mZy860FCZ1LAVi8ta4wN70+seaj5Y4Ygo01ZVUXlbZWIGpuGMsDwHmkkHk+JUrlPXQmLUlUyYiFeQ==","shasum":"ad5970f11a9c3674219a4941bed3f62ae4e1dce3","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.8.2.tgz","fileCount":107,"unpackedSize":3921121,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJghKagCRA9TVsSAnZWagAAys8P/2bQuE96fZiaQ41w84Dl\n9lisMWLtuzHmCFAV44SCL+Gnt2NlQp+rwdRg0FhqB63Czi9Pxl4UT6Ly/qPL\nOJ9Kc4ost4QjCBJ1VtwJqpvRFdzEqJRjrPb4c3g6lsCADOebcVg+HCsqY2+e\n2drc9Pxknb2Gdp3PBgBVMYs+OPd+uCzQBQy5FqQ6t/Tn/+szxvRxtlpx8HKe\nsNm/XHVZf1ZSXVP4TNLg0l52Wl9ld/K8qAw0wZp2OG9mhElC3L1B6uszSHkJ\noQ7ZINuOHhaIMQHXWn35QjHyuRZlPONYqCTEpoQb9gPKl8xa+DqiPdm27/sN\nSi5zxqFFPxgM+Dzfeqq+ueo1LWo6NtN250RUJZB5y29Clz/u0EX/9q7Zebni\njWc728+EPqi6kUACTk/ZunD59PafxUleF+bACqHYq19PXtFpfMjPPClQM/Zg\noepTnRJSbVYIyrB+/lKdNCswruDrOej480sodTAsUZgFDwB+xhSMkRjLVDAl\n7+uovNFspuUnASzqvpBE2Dy0U3hMuGt/O4a08E++/0Ga0QH+qwCuP3wyF3O7\nT3Wo56mwpnAtmCxXlAGu2vUs89XlHCY1aZ/w1Qmbggk7dc2+yu5wYkktM/lc\nJqby78KM7seqC3Osh34zNK2UatLDgf254sVernF0Q2kgQ5pRlb4Odqubaf3K\n6R2m\r\n=WaxV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDaDNKOwBNjLDz9RDXkP/DLvyZ1PtcYcFd54SLh48JaigIhANgMf7JgFSU9RR0sxAK83j0A9CskGWVSTbRxVic/Pg9Z"}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.8.2_1619306143858_0.445139126080337"},"_hasShrinkwrap":false},"6.8.3":{"name":"earthstar","version":"6.8.3","description":"A distributed, syncable key-value database","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/earthstar-project/earthstar.git"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle/bundle.js","toc":"./update-table-of-contents.sh","depchart":"depchart `find src | grep .ts` --exclude `find src | grep '/test/\\|/util/\\|/temp/'` src/decls.d.ts --rankdir LR --node_modules separated --open","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/storageMemory.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser-with-karma":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","test-in-browser-run":"npm run clean && npm run build && npm run browserify-for-karma && cat browserify-test-bundle/bundle.js | browser-run","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"echo we are not actually using this - prettier --write src/*","test":"tap --timeout=120 build/test/*.test.js","test-verbose":"npm test -- -Rspecy --jobs=1","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-queryHelpers":"tap -Rspecy --jobs=1 build/test/queryHelpers.test.js","test-storageMemory":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageMemory.test.js","test-storageSqlite":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageSqlite.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-syncer2":"tap -Rspecy --jobs=1 build/test/syncer2.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.17.1","@types/tap":"^14.10.3","@types/tape":"^4.13.0","browser-run":"^9.0.0","browserify":"^17.0.0","depchart":"^1.2.0","karma":"^6.3.2","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.3.0","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.7.0","typedoc":"^0.20.36","typescript":"^4.1.5"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.4.0","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^1.0.1","fast-equals":"^2.0.3","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","rfc4648":"^1.5.0","tslib":"^2.2.0"},"gitHead":"fddd5481bf6434ac737e001367a92e275b3b124c","bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"homepage":"https://github.com/earthstar-project/earthstar#readme","_id":"earthstar@6.8.3","_nodeVersion":"12.22.1","_npmVersion":"6.14.12","dist":{"integrity":"sha512-kz7Lbyt1aOjAns/TLEUr8oDBVzL706zY1jmZCMWIC/H3U0YJZanmZciP2lQZSiiEXZf22Q2R6KjfA/qA6vPG/A==","shasum":"6d3c2f352c4fe238517b733ca2a6778803d9a155","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.8.3.tgz","fileCount":107,"unpackedSize":3921158,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgsUI+CRA9TVsSAnZWagAA3hAP/1IDy+Qdwk0yZKKamfji\nR18fKQ1H+eWTe4434s49zFyFxPdHPuSvM3Er2CPvJK38XMslxzM+JfJ8PKdQ\nUcI3jna9et+mBbmJIj9G1biO/C/UWDF4uXrNaD38sZ9x1yh9OAGcv/JJYn+A\nnVTwLkzNPTtT06BrCDAvHqGsHQZWfdQlYarQgDM8CF7nVw+1qvwwRDnBnmVu\nwLt51rDOBjVZIhRsWhBMAUKrRchKgWnimLz2UAO4GvCUAz4oTOQmaZ1z5RjJ\n7UC8eksIBvGOwUrNbc1ncGnBq1Pdz7tEZXHlOanE4qrM9B1iYurGTbXutohB\nCgnWBESVjxy0RWNLapPJBBPKOIx7KWB72yO0W61dqI1ev/QVHysH6k3v1bgy\ndktHre8/3cPAKOd3aag3NCPpnzU+5Ctp2nPDXrh3IWzNoxK0lL6e7toKiAM1\n1BUD732fhVhcR+84aUnQE43zwRKvAFEgueqzDEDOxGFrGWIrkwz8C3R3H0ZD\nLyxQj2RAw0HHzGdikYDj9bbAAP0X5OdvLqeqpSQpw1hKjd2PsKPzWLAJ0zL0\njU9kPfevcA+TblgU0zB4ogW55LpverEJ7K2C0i3dGbMPk8wOX0FOwfB1f14c\nHlkuMDkWAvrQCWO6ixBOCyfjZSleyPjv+GC6bP7x3LcP2kmV9Y/aDkn8LTT/\nmSKo\r\n=h8Uc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCxX2gzUoW55N+TbyB8yiAlA9v39iWk8WrcXOX9PQBXqgIgUiELsFzKhhRVrvI3+swbaBpfWCtb8rgug2/1axpWOoo="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.8.3_1622229565551_0.9727127139796448"},"_hasShrinkwrap":false},"6.8.4":{"name":"earthstar","version":"6.8.4","description":"A distributed, syncable key-value database","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/earthstar-project/earthstar.git"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle/bundle.js","toc":"./update-table-of-contents.sh","depchart":"depchart `find src | grep .ts` --exclude `find src | grep '/test/\\|/util/\\|/temp/'` src/decls.d.ts --rankdir LR --node_modules separated --open","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/storageMemory.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser-with-karma":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","test-in-browser-run":"npm run clean && npm run build && npm run browserify-for-karma && cat browserify-test-bundle/bundle.js | browser-run","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"echo we are not actually using this - prettier --write src/*","test":"tap --timeout=120 build/test/*.test.js","test-verbose":"npm test -- -Rspecy --jobs=1","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-queryHelpers":"tap -Rspecy --jobs=1 build/test/queryHelpers.test.js","test-storageMemory":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageMemory.test.js","test-storageSqlite":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageSqlite.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-syncer2":"tap -Rspecy --jobs=1 build/test/syncer2.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.17.1","@types/tap":"^14.10.3","@types/tape":"^4.13.0","browser-run":"^9.0.0","browserify":"^17.0.0","depchart":"^1.2.0","karma":"^6.3.2","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.3.0","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.7.0","typedoc":"^0.20.36","typescript":"^4.1.5"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.4.0","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^1.0.1","fast-equals":"^2.0.3","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","rfc4648":"^1.5.0","tslib":"^2.2.0"},"gitHead":"ce06c1e87457243b6f6a6b4ccddfaeb305e5271b","bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"homepage":"https://github.com/earthstar-project/earthstar#readme","_id":"earthstar@6.8.4","_nodeVersion":"12.22.1","_npmVersion":"6.14.12","dist":{"integrity":"sha512-R4L692R1c+A2OTRCrME5TXE3YbL58g8Jh9zf7+SxQtiIrdU6AHKsnGSrkAUj02eE4wZXJlnKiNT8yJUdUsCRSQ==","shasum":"90a096513e9ff5cff8748c64872ebce36a3e6ce5","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.8.4.tgz","fileCount":100,"unpackedSize":3604990,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgsUKlCRA9TVsSAnZWagAAXa4P/1G9DgM539lSUaExycoL\nHirCdSVLNBwkUgrkrR0bL4gGET8ka8ZC+lz3qskyH01o1szY8DCysg0O3O7g\nqKsI94dS4iW+zL90Ph50/bkAKcOXtAgQZERKIZmqEgbtPew2iIgw1/lxZA/W\n8Rsq3kkUYjzP3sZ1UNYYMMHdvPELEaEYbHkkGlGGpZ5H5flU4kJdh7gE5Qkk\njz445Znv52FLLM4b8ZGBqt751vYEM/hzv0f25gBRAEUXjlmZNC4B5a3VnO7Q\n9UrEapnZEPfaQaAsLx6YjlubMQ1DRuvljnFfmLwZoW7rpA8X+CXW/hZM8XA1\nTm3dmAJmd24D2ctPhWW6ZitOTzsCl1CqFoPNqAwEcxxu9Fh8VysHPFl27254\nrtlU3nPV6PhOc9QWWKZnG/OesTz4gcNtCi1A8m/EtDKSS+fJQmQfCsbqlLXO\n/u8pq+t0PZULUUYEPs6YDyT4DMw1exqXwLI+7tVhJoR5llOQiyig7zhPV5SF\n0YeCYmqDhSpWU+IThSgNDxk4MjY2mKJfFICweMm+qERXAIl9BQ6uu5zn7egj\noxYbP8ie6r+KtlL0lUSmcIAaYxqFF16kYfnc2dCFVb1MDq/o6I3RAdAW0TWU\n7yXew3AEQ9GJp/Iw706X5MZEeYxIJA5pjsD0H0AGF8CbiKOqJHf0BJ5NIF+U\nseC3\r\n=p6Jz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDENwmIAHUJGKhGxdvxbgmik4j10i/4PuyoHDH8g4vDZwIhAKnXFaLRFC3nAumewqOSs5/THTyHoUSwYyEGdIcH6+M8"}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.8.4_1622229669166_0.7708650039659484"},"_hasShrinkwrap":false},"6.8.5":{"name":"earthstar","version":"6.8.5","description":"A distributed, syncable key-value database","main":"build/index.js","types":"build/index.d.ts","repository":{"type":"git","url":"git+ssh://git@github.com/earthstar-project/earthstar.git"},"author":{"name":"Cinnamon","email":"cinnamon_npm@fastmail.com"},"license":"AGPL-3.0","browser":{"./build/index.js":"./build/index.browser.js","./build/storeSqlite.js":false,"tap":"tape"},"scripts":{"clean":"rm -rf build/* .nyc_output coverage browserify-test-bundle/bundle.js","toc":"./update-table-of-contents.sh","depchart":"depchart `find src | grep .ts` --exclude `find src | grep '/test/\\|/util/\\|/temp/'` src/decls.d.ts --rankdir LR --node_modules separated --open","build":"tsc","build-standalone":"mkdir -p dist && browserify --standalone earthstar build/index.browser.js > dist/earthstar.js && terser --compress -- dist/earthstar.js > dist/earthstar.min.js && ls -la dist","browserify-for-karma":"mkdir -p browserify-test-bundle && browserify build/test/storageMemory.test.js > browserify-test-bundle/bundle.js","karma-start":"karma start","test-in-browser-with-karma":"npm run clean && npm run build && npm run browserify-for-karma && npm run karma-start","test-in-browser-run":"npm run clean && npm run build && npm run browserify-for-karma && cat browserify-test-bundle/bundle.js | browser-run","watch-test":"onchange --initial --kill --delay 1000 src/*.ts -- npm run build-and-test","start":"node build/main.js","prettier":"echo we are not actually using this - prettier --write src/*","test":"tap --timeout=120 build/test/*.test.js","test-verbose":"npm test -- -Rspecy --jobs=1","test-coverage":"npm test -- --coverage-report=lcov","test-bus":"tap -Rspecy --jobs=1 build/test/bus.test.js","test-crypto":"tap -Rspecy --jobs=1 build/test/crypto.test.js","test-detRandom":"tap -Rspecy --jobs=1 build/test/detRandom.test.js","test-emitter":"tap -Rspecy --jobs=1 build/test/emitter.test.js","test-extras":"tap -Rspecy --jobs=1 build/test/extras.test.js","test-helpers":"tap -Rspecy --jobs=1 build/test/helpers.test.js","test-query":"tap -Rspecy --jobs=1 build/test/query.test.js","test-queryHelpers":"tap -Rspecy --jobs=1 build/test/queryHelpers.test.js","test-storageMemory":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageMemory.test.js","test-storageSqlite":"tap -Rspecy --jobs=1 --timeout=120 build/test/storageSqlite.test.js","test-syncWithChannels":"tap -Rspecy --jobs=1 build/test/syncWithChannels.test.js","test-syncer1":"tap -Rspecy --jobs=1 build/test/syncer1.test.js","test-syncer2":"tap -Rspecy --jobs=1 build/test/syncer2.test.js","test-validator":"tap -Rspecy --jobs=1 build/test/validator.es4.test.js","typedoc":"typedoc --out typedoc/ --theme minimal --name Earthstar --includeVersion --readme none src","benchmark":"mkdir -p benchmark-results && node --expose-gc build/test/benchmark.js | tee benchmark-results/benchmark.txt","build-and-test":"npm run build && npm run test","prepublishOnly":"npm run clean && npm run build && npm test"},"devDependencies":{"@types/bencode":"^2.0.0","@types/lodash.debounce":"^4.0.6","@types/node":"^14.17.1","@types/tap":"^14.10.3","@types/tape":"^4.13.0","browser-run":"^9.0.0","browserify":"^17.0.0","depchart":"^1.2.0","karma":"^6.3.2","karma-chrome-launcher":"^3.1.0","karma-tap":"^4.2.0","onchange":"^7.1.0","prettier":"^2.3.0","tap":"^14.11.0","tape":"^5.0.1","terser":"^5.7.0","typedoc":"^0.20.36","typescript":"^4.1.5"},"dependencies":{"@types/better-sqlite3":"^5.4.1","@types/isomorphic-fetch":"0.0.35","bencode":"^2.0.1","better-sqlite3":"^7.4.0","chalk":"^4.1.0","chloride":"^2.3.0","concurrency-friends":"^1.0.1","fast-equals":"^2.0.3","isomorphic-fetch":"^2.2.1","lodash.debounce":"^4.0.8","rfc4648":"^1.5.0","tslib":"^2.2.0"},"gitHead":"60e06b38b177030786e42a1195b627a1c68881f2","bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"homepage":"https://github.com/earthstar-project/earthstar#readme","_id":"earthstar@6.8.5","_nodeVersion":"12.22.1","_npmVersion":"6.14.12","dist":{"integrity":"sha512-EQfOmUGFC52XGlBk+ulpVH2Bm0LSEBRBAyxOLKp06K39vO0wIvgUXgvV6q6k/R0upCQHOI5vNilQ74GuiQknQw==","shasum":"bccf9f8c0ba3caee39f9f79d97c3451b5d028e1d","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-6.8.5.tgz","fileCount":67,"unpackedSize":3380224,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgsURVCRA9TVsSAnZWagAAmlgQAJtim3QJqtBEPQCE3xod\nM99QLJxgPAfToYohQaHDsxgNT5fHvBsh9Hfm5ShLXhnqjZgrP2S4BseCifDA\nhcAFaqWPTSMnngMQxhSPaT/fD1M5dU6tmNBDUtV80mUhol4B9aWg4DaH++zU\nPhLUaRObs9eWKeuTifjn0x1CJ3bh4mCA9u7+geeHuwjjb2d+UsxKJNO1f/ru\nRggvU3ImGCocZaglJ/0CDiUwtIyIdIqJVdFfSVap7PIB6MjvxfJcMWsNBAx/\nUXT/yz3WMYjIFtCcTvojowLjjiFqi9w9on3Fe8oKhD91hoHVrKvjAGVdyBHD\nDozBinLnFQRv3Xqgy8/xbJjlTv05Pa+I4XljumZWjZ7Q0jgXgrYCEhwZm5Fv\nAuois57J2l2NHzMy0GD8QJL5DDcC/3FzvhE2CXQhpfe2KH9Ux8tAW25JfyZF\nclR+JVdBZI/GKLJODX70WMveqi4xg6S8A3ePywKoQ14ax/3ZKv9OvUNlnx5b\ngn/3kFbUHl/k7A+iVrLxdbDDJrjQ8hKUKq/Lj6Lewmy/PtjCxfKcgVQXyaFZ\ny+pL5eIiz6Z1qWYDsap2wUVPPOYKlerywzONsIMplX+1wtrwlDLHXCMZebtu\ndD/gS1wCHaWAdDa2BaNKwThWBnywToARub3r+2ESMpZpETYVTM/E4thSefqO\n6Mnv\r\n=CAtU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC5KJLyBrGSED3AuVz9UO9ZPCmBjwiEePXYIfOMCvf5iwIgH2CEKR0vV1AsUwB8CesFRTq/nG/x54f0RwERREookDU="}]},"_npmUser":{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_6.8.5_1622230100933_0.31055085469157606"},"_hasShrinkwrap":false},"7.0.0":{"module":"./esm/src/entries/universal.js","main":"./umd/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"7.0.0","description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./umd/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./src/entries/node.js":{"import":"./esm/src/entries/node.js","require":"./umd/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./src/entries/browser.js":{"import":"./esm/src/entries/browser.js","require":"./umd/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"3.2.1","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","@ungap/structured-clone":"0.3.4"},"devDependencies":{"@types/node":"16.11.1","express":"4.17.2","@deno/shim-deno-test":"~0.2.0","@types/chloride":"2.4.0","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/node-fetch":"2.5.12"},"gitHead":"8d01469a9c88a4a7e395bbee64b00e9597836a1c","_id":"earthstar@7.0.0","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-pBA8uKLQQKMIwqyFcWA5nwm1f+pLN9EPr3HAgdlh7J8i1p33jLjMzvXIp+YBtUXx0ENPxg344Mm2H8n0i9bYjg==","shasum":"14d4f4996d8e0c34d0f1f95ca807aa140ffb0478","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-7.0.0.tgz","fileCount":146,"unpackedSize":547591,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJiDQZCCRA9TVsSAnZWagAAV08P/j+tsxEoovP8/QBME55G\nbpqg02ZxhqVnksXVfPqmPI6kMliY49MIC2tQivsBgIzlpSVoEEg+kqFCWlL2\nyRqvLhs/Qcb4saOcrh7SXoav2lxdWaq0q0+mSR1HcVHhvOc0UVyvhYz/28TR\nFUoZllEuB0Wlrn2hYhNuNflqJr6uT/2oRnVCSJT2PIEveLh2NBc8ViK4qtPB\nvFqWVlhincsvGtblN9IjL9gI6XC1VTCc+fjb9ly3vtX9ze32BDF159d9OVVv\nt+cHKUUQ2mz2PJ+NnwVnozbXZdZDQmF2Ryl7plIe7eACUX9HL8XmKOM4vdaB\n5foLql5lUEUZDeTHwHI1WKyk4QkUIrB3T39tfri8h3/W0qKpyMTURhJbx9oa\nG+RPPns4TG89PQq5SHNNUrjEVb6DWB8LY7+r234wHrqHoJuJeL5qxQNV81LX\n20jTOL1OfqRcwZoXsuVriLMbSSuCbbt9YFkIF468Q1q18ckKEgycXmo1OQaJ\nSzBqblqSNeSyaCmZJ2pT14PtGG6Ox7EqOIBLGzbzzkPc+/Ag7J9lXIg0wj/z\nPzTzjM1OjXo/pwW3d4PYPskc5wmetZmbyo9pUHufPbskJTS6xB8McdET8+TM\ncJTxrVVcPa0ReNunPPmkqaRv8ufrK2HqL3S4iUDFuDNNlp7a/mRQKrFETYTM\n1MX5\r\n=Zy+b\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICmSbyMCxJ3qhgFDVqWY7wmWGLxSObOSkjSzJek79GiyAiBPeK4Zj3GHn+AUYW5fQQCrynJbURIXL65m5dFNZMC5zA=="}]},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_7.0.0_1645020738603_0.8945575556024001"},"_hasShrinkwrap":false},"7.1.0":{"module":"./esm/src/entries/universal.js","main":"./umd/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"7.1.0","description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./umd/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./src/entries/node.js":{"import":"./esm/src/entries/node.js","require":"./umd/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./src/entries/browser.js":{"import":"./esm/src/entries/browser.js","require":"./umd/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"3.2.3","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","@ungap/structured-clone":"0.3.4"},"devDependencies":{"@types/node":"16.11.1","express":"4.17.2","@deno/shim-deno-test":"~0.2.0","@types/chloride":"2.4.0","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/node-fetch":"2.5.12"},"_id":"earthstar@7.1.0","_nodeVersion":"14.18.2","_npmVersion":"6.14.15","dist":{"integrity":"sha512-tvJrMPqhkR0PyJom969E75fkR8oXe6t3Qxw7xNAcbUCzxfObAg3FBmlR+PC8q6ks8EByEpjFQxcZmj22usA1Kw==","shasum":"2147f2a64bf0aaa4d465d187615a8135fd2588cf","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-7.1.0.tgz","fileCount":149,"unpackedSize":586771,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiFNs1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmocDw/7B9uF63grYC1IRQF9B/CSg/WqE9o8E9b7PD8q36omxDA3Y0Qg\r\ncfxsYHCu2xgJsKGTA3K7Vn6RuKLqoHqgc83hk2Q9sO+r7jcktyk9Uq+EJUMF\r\nfXdG13/Nafx9P/PNyiYFZ7xsoBp8cH6zBLrxLhWuZzi3QoeI1+4HMOhTWyx1\r\n+sC306JhJR/sqq3NElYkKI4lPyCTtJrmpc1AYVtwf5sYZn7r3Vw0MpvCdT49\r\n4PIxpSsTBiO0OO+AVtQnPgGukObE+I+60DbjrwKGcnwyEqzGkoVTkuk1PzLZ\r\nP29p2bmqN/Chu75mkgiKjZrqKtBLS78nPSvB+1Bnb/EC8u8cHB+kviPJftDx\r\n5oFfGFvOVKA5JiUZtienw4M8qcC/ZE83oGcEjqMZGDEmOYhpcbFV1hEiJ3CL\r\nC4YtM2SeybM9GqSFhKqyoE83Zic9kxcIjdv6TelaSGMRav9N40jqCGzU/4fL\r\n/IgoSJ0CKDtF7cHOhLH8tdHmQ+Y7K7ZgCKYsfq3WlwxRFN8wrUR8LDLIarbu\r\n2x/G847Sj0375aHnraubOA/xJ77QdMEaJPg10FIz1i+YXV+Xo7aDwd3TW20N\r\nLEa0OuVv7ctUSNoIGafy5v1WsMwCRkDN/rNO5A6L37VYianOKKCUL2WwxBrQ\r\nk1BRGhnypr8FfYx8R22lIzMPiBm5m6mc7kY=\r\n=u03/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC5YbHee17R7nAORG9cuHx12xsZShXA4wlk4YQ61FhvwAIhALK+xH/+f47i1IGdc+ExHLa2Ta7iyuP3HRmmXJoJpW6D"}]},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_7.1.0_1645534005661_0.27195978367860074"},"_hasShrinkwrap":false},"7.2.0":{"module":"./esm/src/entries/npm.js","main":"./umd/src/entries/npm.js","types":"./types/src/entries/npm.d.ts","name":"earthstar","version":"7.2.0","description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"exports":{".":{"import":"./esm/src/entries/npm.js","require":"./umd/src/entries/npm.js","types":"./types/src/entries/npm.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"3.2.3","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","@ungap/structured-clone":"0.3.4"},"devDependencies":{"@types/node":"16.11.1","express":"4.17.2","@deno/shim-deno-test":"~0.2.0","@types/chloride":"2.4.0","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/node-fetch":"2.5.12"},"gitHead":"967ceb6ec068ac59e7fb79727cf4522faff4df8e","_id":"earthstar@7.2.0","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-6RBHUdypUMF+PBwWQP6zEW3DapVMeNny3PDrQ2jB/9yuPmhcWoR0OC9qOAnGz44qMg4KZI5PgUdCbakxUsaTCg==","shasum":"08637976c7912efd8bbe959c6ac1ce8d4794d8cc","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-7.2.0.tgz","fileCount":152,"unpackedSize":588136,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiHgPmACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrDFw//cBdCi88roYqF0PlBkLCumdgbGXwsRbKaKfSUdZL2IaSB9bgk\r\n15/57gQE2bNkiGbhUX1m8pHUXmR0n3eAD+Zs3UQd+8nFHe6Qp85Itc0jaQ+j\r\n/cCCt1yeABXZT6afrAYRzcbLP1S7YNGxu0cE+C5DOarqLt00coJBQQY1rKHk\r\nUEe3b7glWkc7yPXtSbXl77Gl4AQtHdUBJ988SYGgmJMAZTnEJM3ESkixPnvm\r\ntPWm/5qOJx7dig2vZ59Nk2I7YrRG4RB+K7DmoW/NVeDmUIi17FEhLFRTAthZ\r\nFPy3DYkJ5WTaS7b6y32ZK3WS16On6JzFelVXF2btgkKh7UzyS9OyOMcgF/X8\r\nnI7ouc5fXcfQY5+//4HlQj0EyD471J/Co4qzGBIO7rXZ+3Hc9gMzSsmTR6bD\r\nLuI9qBxe79zAyWstSK5llPz3BnunnqvJcDF+siJhLL99NEmBpVCL6n1FNRQf\r\njVncjRAcnmioCSiO8XZxqAb9BOXnJOjAAMzOv+jR3Xwo9U0fFfrJjZXh8NpU\r\nQYsdeLj2TM/BYIyHohwyNlXarX+XhqMapv8EQyIaqZPViNr2GGXHrbbajdM4\r\nhc6LxXxY5odYzTsFqEVS3w+t7iZseV/qcJhL7TviVRT0h41VEv0MYuV4Mrde\r\nlbbqhd2rnjs8vyPl9rDDhctRs0HWXmva6pg=\r\n=JEsu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCnWIELAZQERZUC2fTtn3ZBd9k/oDePSNzpa+SSkg++pQIgA31WQczPP6j49jjXxZgbA4qKnGhZhJ19NVWI4JKtqrw="}]},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_7.2.0_1646134246277_0.6429315541833049"},"_hasShrinkwrap":false},"8.0.0":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"8.0.0","description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"4.0.1","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","@ungap/structured-clone":"0.3.4"},"devDependencies":{"@types/node":"16.11.26","express":"4.17.2","@deno/shim-deno-test":"~0.3.2","@types/chloride":"2.4.0","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/node-fetch":"2.5.12"},"gitHead":"62f710b3f8414b63b3372eea241be65464f4e24f","_id":"earthstar@8.0.0","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-0agVfC1lRuNNMU5MKnXaAkUkd5ltCP1s+fLbzU44jhraHfagK0eRKWwGYE8tUhp/r2ZKmruUAevoTqexm9ic4A==","shasum":"4e4243aa5ca76f441ba6e44a90d6d74562167d0f","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-8.0.0.tgz","fileCount":156,"unpackedSize":546507,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiH5GfACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpK8BAAhU+j+KVmERt7Mi5+GbvkoI/z4b4Syy+PWC7WLIgSSI+nj5O7\r\nqOjbGedQ6hOXls/jFjx0JorRtUUpiTTWmgqi4mKfvC5n4ZNZVhrA6jd+v0uZ\r\n/tWg/Vy+jrqGe3tVk1uGkRjLK9BPeUvXavwrqNwrbruYS0NZ3tns5pLKW9wM\r\n/BBT0OE0nrLUUHJeNbLoLDoH6WMINw4j9y0hZ1ALAlqWlc0SbfePVsrqHm0R\r\nt1YU/ldff+SpygSvD2p0DeJ/f+LQF+l4vUsdgsgGodw56gyY6iUhvSI/JuNX\r\n+p+4V5SnG95fpXY2Mld88CyFwi8n+jjtNpH5MD5RQSucA8CR0+Di3rYAkIJM\r\nlAu1UjPArCBEo+sMSC4S2MVQ7S+9sYwJIIK+pdsmbLR+w8WWB8Fy6ZxGlsqL\r\nSJqteaubyganszWfxxFSJWrmgpjjy2f7ho7fvqX7IFINuL4koTm9z6aCkPCj\r\nQ7hT+puxGMuqgVkHRoO2AE1xJAy73ZQZ1iNWwMv9f86/Tcll8W9+LI8RgJ4s\r\nRexyYQICmS6Vdo9v1k+wkQz52MfM4EO/0bbPpolj+hZJ3MIWe8552GWSihme\r\nq98OfPUqQcyHifLU34KPMIhpFWRD/vPAopEfpi+HmFiVgB0eBZ2rvBeIoTW2\r\nf0D0x2HO3xM6LLM2ru7osKJXJq74Hl2m/SY=\r\n=iuH9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDjUS0oAHnoA7yzb2YjPumOQab1l/PQB0kXPt/HB6Zc8AiBZoItp8k38ZSQvi3anWn5GchaxvwM6Nh5VyACICCC3JQ=="}]},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_8.0.0_1646236063391_0.7036260461117156"},"_hasShrinkwrap":false},"8.1.0":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"8.1.0","description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"4.0.1","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","@ungap/structured-clone":"0.3.4"},"devDependencies":{"@types/node":"16.11.26","express":"4.17.2","@deno/shim-deno-test":"~0.3.2","@types/chloride":"2.4.0","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/node-fetch":"2.5.12"},"gitHead":"2c2a919f5f51578f45a4f50c154d5aaa0205d99f","_id":"earthstar@8.1.0","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-WZejZMcUOtI+DvHKni4s6nMfIB3QPN+tmCTg3r2sn2QR+RfvgqmPqBx+3Xfsl98O9UqCbVa+dvUEXd6lhsc1fQ==","shasum":"5ff051190bd727abc66ede1f0ae8a497f3af68a1","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-8.1.0.tgz","fileCount":156,"unpackedSize":546992,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiILaQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpteQ/+PuqphdfAUHEVnPGaLQ0zOm8Q+Z353vfkWy7By83GNkwiQPhl\r\nIp0/1xxEmS/JXbSjnZb5qdS/Q4xx5btbxx/IuhLprTCcnwGSkT+/Uy5xw2GR\r\nIL+J3j8Hi433WFYI+oEaUQG841dk+gFGzQpd+xiki+JNenH543oDW6O1fGVS\r\nLv9Y6ZhS/WEYXLhtPsJ/2Rpnx1Xb6Jad5U1d/2CKg9ba5iEYQMh00hetCdqz\r\nrfSaRdb8xajHMbxnYH22P7oxaT/7ytqnayEhBFNp/zd+zW+Tnv7n7nA3j4Wg\r\nVobKLXOVji4k8EhJ6YmEZUUZMjR8JvRgjUiHrkMzTm6Y7BfUDg2Xw6GUjjna\r\n7VGNWU4eePJ+MiCddhsJaPnjZHvsEvgz1BM096HVVbCUf6ld0Uz0KmjDG6aj\r\n0/xkeMLyTQPWvEln93tEEScPdonbVRA/artmW3JspAjT+X9tWpi8M7tqqwMQ\r\nqU94W/0WKJJt+1QrHEkgjm9Q8gpAblxliYqf+o6TKUxK8ex2aBhmhS5oszU1\r\nOZwqqlJVUhoRTbdPWmKcMNctV5bnWw5D6jQ6Xo6PXvZphQVpYB+t1lsLrgGK\r\nTCpYIlmZ5BE8H+mYwjsChbEh0ACOfQNKABObToQzXd7kOOaJ0l9pEa0HdAzY\r\nwXqikK73AP4NQXxLFdk0bFFZPhwGp96PSv0=\r\n=SG0/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB6xBPUuuXasxpTECK7oRY6Hbl+PGtkwUOdXOhWjvlRKAiAxjiOdRgNoLXTK7hG3rk4hsfAa/9tsPGH8ogTntNAzog=="}]},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_8.1.0_1646311056762_0.1685375546483867"},"_hasShrinkwrap":false},"8.1.1":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"8.1.1","description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"4.0.1","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","@ungap/structured-clone":"0.3.4"},"devDependencies":{"@types/node":"16.11.26","express":"4.17.2","@deno/shim-deno-test":"~0.3.2","@types/chloride":"2.4.0","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/node-fetch":"2.5.12"},"gitHead":"acbb2e90fe20013ec97fb75b8a412f52b16d699b","_id":"earthstar@8.1.1","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-PaUD7cuD8oqjyyP+hHsLOCIEw6U4rXzUrBFmwPITsAt3indcSWW2RSD+P8D5KF06X6eV+3qQBiK+zm5QZy9YJg==","shasum":"7a35a0ec563c7a5204abe8334e5c9cb99e3fab6c","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-8.1.1.tgz","fileCount":156,"unpackedSize":547038,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiIOjFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoGEQ//a3u/4fKtYgDGOaNWtfveVPjqFxri50FVM71bcdI59h5D2E2S\r\nDl7G1mGlxuhJy2urAO9V+Gv3cp97akS9Icg0NnjtppP+kv0pLqacI5q+Vou/\r\nmX5hUYa7ha9MkLw2DJpH4/IqR45V2gF3YhGKMiqYxVrOGvzAB6/27OSviVxN\r\nq5efRMn6ZSl9GmUiscMJlkiq2Eo6CwTAfkvoxrg39MIDbioBm6/A6pB5Hthy\r\nfNmJT+8ShtdH648o9zOqthrbo1XTvikpXFjyJzgNXs6qjzFesE3YCSEgnUf3\r\nb5mZsZQArj2I3qtbslbmEro66Ko8MXMjfvvIva99Zty9gJq9PXT+kTyKbd9j\r\niJ4Zz80tG79olt2osyGJffcx0lJxu77La9rKQiFobvVs7Ft1/xMn7LYeixqv\r\ns2IvrGk1wtdbx5Yv83e8Z4jVlUHu3fcOYw6bmMDTkFAGuEiw6ludFRjfu/JU\r\nzQl58FegDwpMUHI51d2yKxetVNlBY3jYZ5kS8Z8oIxTW0y/+vGfAcVLiqif6\r\nRXPZZQbxZ7kBHwrBiT5xA707T6JIcT3h3d4xXFwdUMWMLcDUXYlXxqctg6xy\r\nRhl5dA/CWVkwwXv4jUzui5xB+6DQawLXcMrvHZD9p7mqWNQnZTCsOiD+HWmC\r\nzQXqbY4vP+rK9dlXjWt2711t+7GQibMJuvE=\r\n=InyQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC+GWjIH2/IHyIg8gysIzHDjJkwzDeVPsKAGMfm+qqwsAIgCFHUEN4cmk/kgqDRvUdSU7aznsnOje0+TXvGZlOJswA="}]},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_8.1.1_1646323909024_0.6300540206357312"},"_hasShrinkwrap":false},"8.1.2":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"8.1.2","description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"4.0.1","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","@ungap/structured-clone":"0.3.4"},"devDependencies":{"@types/node":"16.11.26","express":"4.17.2","@deno/shim-deno-test":"~0.3.2","@types/chloride":"2.4.0","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/node-fetch":"2.5.12"},"gitHead":"51c56be8996c1fe505b8f662052e2dd591e1af1e","_id":"earthstar@8.1.2","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-jvLOnlvIDS8wBD9MBiKEWZyWin+gQ5G+FNTiPQk/HaXjhUnzyFoq5dJgtjOPJEM+oAZHJt59RNm7VRQFy+NElg==","shasum":"60ad7aa91baf1d9196f74a6f6c7de8ba669ee2ea","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-8.1.2.tgz","fileCount":156,"unpackedSize":547386,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiIRc5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr7OA//YEKWdlbF71WPxDr7BSWUdL8XrxltthDdbC+reZpxrlwoV1xV\r\ncDScYslxZndB8MBFDbx5S5MsgvOo+laf7lME5As443ghKk7nL+B7HSHkDfN8\r\nRDh3RrRWH28y+zFRn26HAqKBORUbjH0HakzrZ0/++I4iEH2YJ1pQjvASoxVf\r\nraSKAcJD8sdx+OC6GW4zLiMFYXXqr9vX6oWZLmlKYCG+wsMrNzTfby9HLk0E\r\n9trHKXk9hGddf/0ZmBwyqmEr/rQl/y7tgFBWpVIB2ml4xvx/egNWkvlcY3N/\r\niwI9g501yD7SZMVKVYEvgTvd4rmy+Rspobx3qBt7OKQ9qcEmZ8EbULs7I63H\r\nQNp8B0Lmx4Or6P/P0kIzIGTs86BpLIjl0PBlSv2ajz+t9vXhQAzF7QpRLOBD\r\n1kN+GzoK4xgOAFrLjgCEsdbW52/K9GXZJ59DpGj8nPyO/Arika2mAei/r05g\r\nQA42oCNoRUsTICOpmlUNWOZjmE9MlLEFZoByYLPT562ZutQb7NZxX/yBW/EL\r\nUaE2LVY1PA8R4SwxxEVVmqgSTwvrObGfPkKLUis/u8aafv0tYKG/xCVXnTv3\r\nCGUV0rLG3k+pQSuDOQ1az6IM+umMErNEMSkDgVVc2qSl6v5ECCP0nLxmWvyh\r\nr9MZQr4iyuRYlr1TVLcS5OoyhoRxUYoaq0s=\r\n=OoQi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICgk8oH/a6CMSqkPcZWqZtzmRBuucQOOy40p5Xf3rTXyAiEAt0C7PCfJC8/coch1aTtrLe6ojdkMQvx/l3t1a5JXR04="}]},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_8.1.2_1646335801335_0.697959234824101"},"_hasShrinkwrap":false},"8.1.3":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"8.1.3","description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"4.0.1","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","@ungap/structured-clone":"0.3.4"},"devDependencies":{"@types/node":"16.11.26","express":"4.17.2","@deno/shim-deno-test":"~0.3.2","@types/chloride":"2.4.0","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/node-fetch":"2.5.12"},"gitHead":"4f099c77d8050fd938c328cec8563e7f10535dbd","_id":"earthstar@8.1.3","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-pfLBLXl1moY8yCNtW1195PMsxTZkviD2ISb0LL2qRslmBqkLt9r+6yCkufTzHRC9my1yxSkU8p0XjV/r9TCMaQ==","shasum":"f68cefcd1556e5872b648325445f5059f5172719","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-8.1.3.tgz","fileCount":156,"unpackedSize":547402,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiIRlpACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq+0BAAnuzRRukjLMONvdGNA8WAGbG1CxDZ9B44ZzanGRFoC3BflHgU\r\nqFNz9mTEQ7rGCxd7TaVus5sLXuihiI+5RXTLO9tr/uo+VkOE4f6SNXFgt9PA\r\nAlU+/bvvi3oxq85AY+qnqJWfDpsN7e/1C6ALECCnGFtK+y1Bpd/GS8Sno3pw\r\nbAEU7jK5xEHzfNNbCXJ1x0ObILc9rlygzCf2Jr/xs+KioQ//K/vMOYLGMqzN\r\n96aK+AZue4/2vPeLV7JFTz5o/twYyjmVx1AjMO6wBMhGR9EpErAjl3AqSj7I\r\nqQTz012oGVggs1JlOOuYV2HrHhR0mtG/QgAYKQsZ7g2XlIhoe687EDro6vuV\r\nM9Z45KLPoQtwG4tn5EKmRGMPemykIH1/DwVDx0LbPp3ToYODTG3YDicIMCua\r\nQN22aMrsKj39ryqhGe1kgZYdQ8e9CGYRIzeWCms3yA+oiLTW2AI4c1lx2+bm\r\nm6a18SMq8zoptEa2hoiH+E+n56NlR39NlX+xVs1mJ+4gbV1ZDD7lID2I4z91\r\nrZgMrF1+DWLoUThJOndpTq9WfxtJyvSZ3vVBj7DiORtikAVYijkF6sP+XEy5\r\nSANIJgQLHIXYd7Crcuh6Z9CwyLVKacCqA5wNn+/MJxDbKbNg5ClzY8eNRkF9\r\n+4zhwR+lKdbxc5V8ns+NlSyNS3woANXR5Xg=\r\n=WKy3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICXJu7gYeXlvwceEV0E0ei8oxIm4IquPgQpZ49SE1fAtAiAposs22Pa8kI7MSll2RJvHXc4/tlnpV2fxKR1r/Znv3Q=="}]},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_8.1.3_1646336361467_0.9518420885611631"},"_hasShrinkwrap":false},"8.1.4":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"8.1.4","description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"4.0.1","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0"},"devDependencies":{"@types/node":"16.11.26","express":"4.17.2","@deno/shim-deno-test":"~0.3.2","@types/chloride":"2.4.0","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/node-fetch":"2.5.12"},"gitHead":"87ae793ff23989643a310c5951bdd1468a63a80f","_id":"earthstar@8.1.4","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-ipPRtBxgPw+KblE1tjWzMmB23jMf5ekhDp+NpTxuj2n+sQKnYdu64Le9uDqB26H82Nbyt92oPcJ1v9R+8DHm1A==","shasum":"9406711b859a583a7d67e9a9953bc172c1a75ba7","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-8.1.4.tgz","fileCount":159,"unpackedSize":548537,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiIeY7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoNPRAAniCpq/JF1pL0OWjMyhuisWLchZBoGDz5FTYufeJioi5LZ8og\r\nrO3JGlnTBIyzE79adwaSeQZd7oAWSbKvOOepobM3npn4J5O9i/hm30Hy8VHf\r\nVRw7ow+qnXYgh9V7NmY9ixtoBa1q20/L5f1eaaqFxClQkjL/zH9hgtzVolBJ\r\n69vOthLH0F5YzXkHmv2xe39bscYiKL4jPgYi0Z4Cjf9xh0+NHpioZzM0Eqt1\r\np4dj5q5WBxqOs5RaxtASptwl5+tthBgIudAW6YNgrQxrNvoMBIVdJhfxymEj\r\nc6/fbPWOJkVWUdZOwUqNm8MLGcGNAlpNepauFXtCrnCW0941UMO+zwuCQEqh\r\nTBcMcrMDfOpPqC7pWzr9vlEN1c67sli2jTRDPfgNu8yVkXqONYAw9Io29K4L\r\nWdR8Ps+sNP07iYunXSsQTzCehC4KkpjaYCx82g/9Lz6UXx6zPbSeyBb/kIDd\r\nrGE2pGMQ6UAUldPBF1ZFzIIMeJU5yjkijyKJ08iW//p58b9hSUiEH2idFVag\r\nQEuXtEGSgiV22ARNu+GyQKJgH+/lDUTXiM9RW/GqmlpxOoxFNOUNpMygI2L+\r\niUSdnIpk92tCgQspV+BM469JCAToSI9HnZxBaj13en4g7lm1iECpqcGv/M5s\r\n1oJ8+2fpdWl2wO+pmd7HhNyD2U6fCmOnFtQ=\r\n=d+83\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD4HLg4s5WhNpY1WsNpKy1u2OYeM0rZVkeYPqXHh6IyjQIhAI99baocaO+ebVudAZMizue6/+kjj4Pr0vkQR8oran8N"}]},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_8.1.4_1646388795410_0.3858247612069625"},"_hasShrinkwrap":false},"8.2.0":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"8.2.0","description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"4.0.1","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0"},"devDependencies":{"@types/node":"16.11.26","express":"4.17.2","@deno/shim-deno-test":"~0.3.2","@types/chloride":"2.4.0","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/node-fetch":"2.5.12"},"gitHead":"1262ecf3c631937338fd0712d1738f3d42bc7696","_id":"earthstar@8.2.0","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-+qW/fumNaFgv8EryXROtM/dGPlEEwtOD6TQtMgd8HFyXbH1wbFLYENUezv8mYBFJ7ZGaFOCc5CUoQLEZk3NORg==","shasum":"ca61f98a4e09dfb67f98471beac38b6ff21d1ecb","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-8.2.0.tgz","fileCount":159,"unpackedSize":556478,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiIhZAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr1KBAAnQ1QJ9sbnRPSGuUYhaL6GNt0UhcEKg2jC4zuOnf/VHBo5ilf\r\n21KtaHdxWx4VelOL0XgnKS14XOD+U0gqLCLueqDbQ3yy3x0tWIedbb1Ai50K\r\nOrTPz30MYC7F1HE8IGyJ15rZ6Rn+LDXrTIsa3XEmW9lK4sfG5lHkuffcqEmh\r\nMXjQHK3NnT4tyC0Buksne37GPgP5MDCrMrswFLr6cXAiUQsLD13t5w6YvYSR\r\nHAGsFcTYJHBUFbxyBkxpovp0YepkVtev0tHG8KmtQHeImKtlfKt0a54GoYjE\r\nehC9PvdA+FFvw/zI+DeMFBDor/C0BnsaOcN6X45gAooR0l1TezVrck6+i1nj\r\nxrOlDNyhxu6Z3hYpz/YneWdmpRuP1tBu1z3vLKkSHQSsqrUTOVR2P+rIIVm+\r\nnLandsIYRMFBQYUM5kR4ZmpLZLySUzAqthgThUDJZJSZUY0svf+IrALzyvuX\r\nx1WTBfltZQyEEEvmTe7M3fkM2FdPTVYIAqvPmKLwIn59o4Qfzy/gyz+BEHl/\r\nfbx2j76/G/ZbmFyx06+wPSeOpzyfMxa8nqa3CJKmuNMIXDmQpVJORj1QIuDW\r\ncCxN+tt/cZiGesgO7j8Xo24tJaB1ozKF3Whnarzrvk9IVHvqPwsM22cDKwTC\r\n71K+C38OmafKNxtRYWxSaynK38IdnBsL4Jc=\r\n=f3+/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDU96xm2dEyXazDgDAWIRaDUSLDAbRdL1B8A+gr7elQnQIgB0OyIIjOCsnLJ5pg6yYPc8ho5S7Vqif7DZb4585cXj8="}]},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_8.2.0_1646401088455_0.9684183562128115"},"_hasShrinkwrap":false},"8.2.1":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"8.2.1","description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"4.0.1","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0"},"devDependencies":{"@types/node":"16.11.26","express":"4.17.2","@deno/shim-deno-test":"~0.3.2","@types/chloride":"2.4.0","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/node-fetch":"2.5.12"},"gitHead":"b6de340d9d6f2d50b27ccd2c6f131b01b22d393c","_id":"earthstar@8.2.1","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-X5YBqF9NmR89NfHhZAcl4j6AFy1ms5bvbo6nAonar1513LTx23dsACfTsocrmHHqMMYTj/2m+z0TTQO72GslzA==","shasum":"bb33bc01368ba0b61479cb0647aa125bca7f7a24","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-8.2.1.tgz","fileCount":159,"unpackedSize":560511,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiKefTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpfexAApCSpip0ZlycQ4f7NDyF6vKez1dZU4VWOsPMy0NrjMz8X61iO\r\nKCbr6u9ZDcN6zEuFRiqtJCgn7XWJWzXtk/bDQ5MCHhLJeDtwY+MxgZ/T3m5D\r\nOh0aMWKOrhtPCDxnplT55iMYq7JOnwbx/UF79mLts/MxS3JwnZAV2GwMasY8\r\nVZMTOSNQ2tHebbS/hY6Hfq09Qo/wjqHQ3atzBh91UlFhKH/rj1BrKBZk8BAk\r\n081+xK4Wmvrv+NY4CNS1kk0zawOse2n5RE2YIRMBcWUKU1anyZZ8EbLaLGBt\r\n7Hx+nCIE2jlmCvIKCREzdCc4ySifMCTq+nqA6d3pCFGadCdFz/LF362UAXfu\r\nt7Nw1BMa61LcDelqRm9E6C5kON57HsTRqL5AlNOwlKYiYzf8xvfAsCBGafyH\r\nti1FD+BnXCo8Cbjig+FBaWugPbRkh3g5oR3agO/XBmcLHOMR0I8u+BbHEzFX\r\nMPbDF29iHvm93+5Ndes0aw6I4989O5pDkps96HaWn+zdwTyRzyfZcsmIeohZ\r\nMrG28f8dwlQe8UyZwS0pNK1u1tdYDWTV8K6ZdWnZ0y2iBRAtRxLabqrlLvtr\r\nIXjevXF6ZqCH6+WSMCZdyGARO5z+WiZkph6S26OlYYJ/LaodxxEnlue3lSBu\r\n1aB3yApTfKSQN+rWXKPwOiWs5T/UVznnWy0=\r\n=YMnc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA1+Ma54S2bBWokbyU3v71qLGKpa4zFSH2P8oJ0pROyNAiEAudNv5vFYPLcOql0y0xzjpV5TrnFNCFpVcYr0SLX0guc="}]},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_8.2.1_1646913491672_0.7527721126721514"},"_hasShrinkwrap":false},"8.2.2":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"8.2.2","description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"4.0.1","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0"},"devDependencies":{"@types/node":"16.11.26","express":"4.17.2","@deno/shim-deno-test":"~0.3.2","@types/chloride":"2.4.0","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/node-fetch":"2.5.12"},"gitHead":"21a6055cfa82f1e411b187112508f7d8d1d3a940","_id":"earthstar@8.2.2","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-gqBYd8ICLEj5nSOritsdqZVwuBY2YhrlSkDaxe4vio+JeBvz2IjOYW5e11UEwWbflKJWxzxpR6oMYydsEDBdcw==","shasum":"5d9fa2f31056b1c85636c489d6ad5e75ef571028","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-8.2.2.tgz","fileCount":159,"unpackedSize":561263,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiKh/6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmphyQ//aNrF8deCcVP+v3stLnFhIfqp2LtA24GKKCexNJZ1MziA3bZC\r\n6e8q4e7+XltcvFWr7PiV8DK2xXX8/YNYKrRg922l6jHzciqLyzaO38qAiNq8\r\nvSAAw7h9mmYxJj5jjDu11RXs41W2BkcDICE8Ap3GwT26b+a8tB3vcU2R+JNV\r\nCWIJ+e9JKbj/kz9QpkhBVgdHZImvv91gl856hGZ7TtGNsHOJ2oe0rzwCfBft\r\npAz0kLwJdIRklj1nCCqApEwQ73fk2ZzQpFl9BodwrB5sDF48pka/H5ag4vj6\r\nVG4izFE4zKloLGQTbDUt4nQ2mdc2e0dKoJTAGRLz4un2qinJqMavSBtdB7h+\r\nPL/gX0YXzgnjX/zyAsZWeMzol1vVY5RgVQPqCtywRHwQFtOZ/+LpB2QCFj4h\r\nZCVxUYTIJgYlcqfwyHg0MYjgfw8msVAKt+7Tprsi3n9uZKjs2DeLeZYxY36x\r\n7DDCOw9V7t69Y7spPgbub3rIb8QAj5O7p3M4ZfCAlQFPHtZosejKvqKwxm+Z\r\nkCk6EZ8gYdOFTxvs/7FmeQMwdmDWqNNWy8a3H7QTy5qppBTyvCIanbxggH6R\r\nyOPa/szr+wPyaQrz+XI3ddHjk47AK5dvAsKYNy/uWZMQUrbn0hTPkV7OsTkm\r\nb4s8fqtFqmIj4t3Dk+RW9XxkJpi204X4XCo=\r\n=Crpp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF+MTF5tUBTpzCmJxXXJ44+Rp6Cyy5FLp25jJPzThOUuAiEAl03E8GsaMxHZz67t+mrCDy8sV43YLSkfPm0sdNglR/c="}]},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_8.2.2_1646927866300_0.06092142073672857"},"_hasShrinkwrap":false},"8.2.3":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"8.2.3","description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"4.0.1","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0"},"devDependencies":{"@types/node":"16.11.26","express":"4.17.2","@deno/shim-deno-test":"~0.3.2","@types/chloride":"2.4.0","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/node-fetch":"2.5.12"},"gitHead":"21a6055cfa82f1e411b187112508f7d8d1d3a940","_id":"earthstar@8.2.3","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-YzgGehCI/I7U3izJwd8L+SoWTzKc8RCnPXKNml98WTUX6td6x8gMbVRjNZxmPYLzV2b3IiLz8f1Zg0DnPmzp8g==","shasum":"4ac26b03a214205b64b42b281445b65818926c73","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-8.2.3.tgz","fileCount":159,"unpackedSize":562190,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiKx09ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoc9A//RDRH4HR74Q54FVaOaUsT3P6+e4pXvbhrKTQgXfdOedqh+ScJ\r\nOEw4gkdtDaTazAkjrQYyEFWM3550xQWLdV69MLofOj8htjWBWzLY6MsWYxoZ\r\nqZpudLWai/eSaH5ebK8gltkGrPrYyVba23bdRNtyJfJwKL3QnMu2TnUG/nPo\r\n5QfgGqoFUwIFGOh5dyVErKLO5Mg6lYSRjTJU7GMe4G33tut/Z9u4UNobeW4+\r\nnHMomERpvGMePQyXe7cNN7dF2gLvh9V0V5qOVEdu+VqwAZ1UeXkV55Gdpp1R\r\ny8HiBTXZZETJDRyzce55n15RqgWHLlgBlt7WLrVMYVVBNDkejcs5eo3NrMQd\r\n0NIGHDEFAVtLpVF5zH0anwRj3BqHHgFOfgXIRdOU44TSEqHzFKDAcyVzcDYh\r\nihZ/46zzHiL90PxR9oVJBjwDZtZITJt/jv98XI/GgHTMqkSvNdmhDWK0+RVb\r\ns4E4aQznMx2i9tTo8b0YExVOWBy6TkBGnJ4vEOocBnTsIsp99sh+oyWP9U1A\r\ngWYGhinscyTksuenD+AOyy8Or7G5Zffx4gg3LngcrgEbPUbEdkDphykiFvyc\r\nOkERTf3EXD70TuA+EcN8096ZPkE7HJ6p9XGrNz/oYboJrqrmPQAtMUa3VpPX\r\nY7qge7k8iqJvfkoWVr7QZbNyqXktCmhDvjc=\r\n=eEaw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDfbh2s8s2qsNR4a5R09YPDuNZk4b/10YZLB91eN1IgRgIgNxT/B0ceFsZDIZ59YWACW01jq2TlaTBa9rVi8Sfm+qU="}]},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_8.2.3_1646992700954_0.4119152660730474"},"_hasShrinkwrap":false},"8.2.4":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"8.2.4","description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"4.0.1","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0"},"devDependencies":{"@types/node":"16.11.26","express":"4.17.2","@deno/shim-deno-test":"~0.3.2","@types/chloride":"2.4.0","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/node-fetch":"2.5.12"},"gitHead":"059e9cbfaf6faf5abdfe8d5c2d788f694fc6e4c6","_id":"earthstar@8.2.4","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-ehC4LbLyiInF1kBJOsAJZItJ8IUkmLTqnS4uWcvk5BNDkMJYDepFoO5Jbivft0du8voYCCrQuOU9G9GfhAhCsg==","shasum":"54942467be1755f6e56d7c296c4da9c1188db9b9","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-8.2.4.tgz","fileCount":159,"unpackedSize":562621,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiKyQ+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoyZA/+J2utpd1845+tVarwpFAww9WqN90NCc3BbleVjmE9sVyYvyzG\r\n2B5b1vdjYN9H8ezKLq/hnECfnJrK9ZpJZn+w1ImHzHESUzLJ/c0lKUn2/DNL\r\nhJ4yYB5tz5v4wEGkOMJVtwxo7DVGPMujnV+rPaMoC5d3qGNgg9dtGwaK4w34\r\nbusWfBGRPKr5YfTVJd+MoSK6g3b0KEVlpDZyD7HxHQxiiicTrnM6f/uyJ7mR\r\njcXMnb7Rok2kRus0DFET0B7uzp8icPZzIqc0PYWOg9hd5WIu4aMd+NnIKPTu\r\niqMARq4M1C7NNr7qEUccQaXkvuzJ4rjz1683rZ6hWrbKS6YfVdULTC+gXcJ9\r\nj2oU0/cN6rWLaQfv7IjXzv50A8MQgubE/J9FEUFL+NpwEi6Bwtl0uWWNV4oE\r\nh3v4oSx1ZX5dpeqMUWjR+4/bq187LAHG/kMFg3binZSlw93/eclbNqL98MTp\r\nt45o41ZQWS/D/1w9YWbL68T5UI2WSdWzXzbpQQugOn8D0aHHDM+guhArS6Rl\r\nomsztYWaEqwyFu/xRpRBzYj25NcycKIaWMmFZPMV4eTXeIac4UWw9Djbsgzz\r\n8x52mzLVbQOQPjV34yTiQdJIxaiRLQmNtIdjXvQIB28oxItACl1Kzc4jBaWq\r\nwsGzz25Usz0bXzWp11SxKvbvcr8ZVpPsMxk=\r\n=ZJVl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCxPnhB7aPsaLDmJ886hFFsHJwOmHRgc13U5Qv+q9lmcQIhAOD3m3fyJyve6I254vviyqQUsiwNrjaQRgKjbce8J+zg"}]},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_8.2.4_1646994494241_0.5721026890935401"},"_hasShrinkwrap":false},"9.0.0":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"9.0.0","engines":{"node":">=14.19.1"},"description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"4.0.3","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0"},"devDependencies":{"@types/node":"16.11.26","express":"4.17.2","@deno/shim-deno-test":"~0.3.2","@types/chloride":"2.4.0","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/node-fetch":"2.5.12"},"_id":"earthstar@9.0.0","_nodeVersion":"14.18.2","_npmVersion":"6.14.15","dist":{"integrity":"sha512-kHol5uXsmfwkUeWuNgpbxNgqjoi15+LTpp+L/nqyVriJp9tRUfj3nB3/soD0WN8fBpwxhxot+11RAZtcWqwW7w==","shasum":"9816baf5ed51aa60e6b9b803fa195a3d0a404a99","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-9.0.0.tgz","fileCount":159,"unpackedSize":581325,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICFJmGU45E4of7kBKjfocVMT+P92jDmUJQ4cOQ5yAaToAiB9JnK7lFGkvM2VPcPj6bzN7HnmGTtWr8lJghTbHQ3VHA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiVsZ0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmowsA//XZPqnbr2RMUPuwdqMKurM4Da6UpNRSFF9vN1cDN+9ovww5LF\r\nHmIaHsnmWMDqCHtvYZoejcs8RA/Fj+Tqq0QQn2fbNMtlERxOKJQelz+4A9Dh\r\n1AnAmGxwFotPSrINj5RGJIEPdVAn1KSStVJrKkTwKWZP3NMeJRqemJ4ABJOo\r\n5Iwmtjp8nia4IYPsxFiZqm96DoR2Bo7Q3bzRjv601yWYx0vQy7e9uJFHhb+w\r\n/llHW8mWcoCD/OugXtUjrhImA042N1HIkPzAXizmkXEVKzSIpoKhq9SLc7s3\r\nURQhG94zzBkM+VJW3fwAwp3OES1r25itnVcLMfoqwzr/I7atjiD0ZsLK5QUT\r\nl0sF/vcskbwJtnAw0AwKzVVav/coU52To4xkyBoI5+9+2tP19uLFRBvWeCCe\r\nrZMWLr6gw88+uUUvYH7rl9nQns3QuY67/E/IY956TIhF/ILS2RI1Tf+x16ky\r\nmoDRm+lSYDEghmltf09Fm8pKZfV5AaYFnPoLa1mX6p3O6JL5Sifh4HOnhYkx\r\nPXNurfIA1AaA7TRaz1F/9AHYWkGVtmkW7+DGZIJFj+abeNKIdLoWwiYnh6GQ\r\nIdHIQvX/ENT4gvS46pD480m1BDcpkfvT5uiMFUJcL0ltm7U+EVAPAj1swTqb\r\nFqku7hwGRRF9okNIddKYB5tZnJjJuK+RfxU=\r\n=2bdi\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_9.0.0_1649854068375_0.8432990434790131"},"_hasShrinkwrap":false},"9.0.1":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"9.0.1","engines":{"node":">=14.19.1"},"description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"4.0.3","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0"},"devDependencies":{"@types/node":"16.11.26","express":"4.17.2","@deno/shim-deno-test":"~0.3.2","@types/chloride":"2.4.0","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/node-fetch":"2.5.12"},"gitHead":"15234747a15d3ec6945c7e988e6b252447eac385","_id":"earthstar@9.0.1","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-IHTlL0dykhFkaLsJpZdPw35ACubiawtCkcKIxWVbaXkP1aKkvjA8oeAMDgisEnR5u/NJTozIhLbcq6NiFCCzSw==","shasum":"d4ff3e5fa625936febf7962eaeb2968590372823","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-9.0.1.tgz","fileCount":159,"unpackedSize":580871,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD/vSOShc/mBaR4OwBmOyMprYFmHEkh8jSbyjVr4vMCMwIhAIQAg8D2GAi6rkBUTs6NOyhEtRdRL7wSrryUjJggdNw/"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiVs9xACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrcOg//U7zN5V/Q4sCLr99G/5WdILoq7PqVXMkRAhN6HLyFp4dMl8gL\r\nt1ZvNTh846gvkEUCAqc1nEBPdPtr4r07OGNAiMXPPUA7mRTe9Nz04lw+TvPq\r\nPcE+/lknIgks3BkrGEIxxHC3OeJCft3dFBdjcWljx6cKjyVc8zuHqIGYMYZu\r\nlGXhpKJRsO8KlcpTYk1gojn2DSt1l6QjgZkvUytXFocahQbGHx5X/PPRNcol\r\nc/x0xcKsOzhvUc7ZhvJj6GfombCKgAsPES/Ni1K/Q42bWDNe0v8KWtNUKkbO\r\nTJyq1B716Qcnn+e9VF7pA8sfbOaphLl/J5EUSl5nLdkuDzMAJ9RQhL36A/DW\r\nG83lquM19V5uzZzBjaswWhnERwQW3XamZReFhjT5bnbvsgIvQDrDOa/7LjrC\r\nBcJRXdyVj27v5sVT3kw94+BBf6iBRqiqaRMvLKSkIr+dfzmwljeF+fxaxZ17\r\nJtO0LgexUVP55L3DeQznrqvdSkJauBcjbdSroQDkK/1VVL/RIWeRRDXSl6fc\r\nJW7PHXyA+R5SkQzB8ohRh3RPbuXJboJwspzN5oDLbT7TyppxMDBu4bROBrg9\r\nox5iiMp8e/nX6mxnUPYkLgQGU1151CADLtPvIS3LDvVDc7yZZjVTeb3viLwj\r\nC30nYTN5PF7qJa4AUu37kKUkyDVHtr3qBh8=\r\n=LbyO\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_9.0.1_1649856369253_0.9385754339333141"},"_hasShrinkwrap":false},"9.0.2":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"9.0.2","engines":{"node":">=14.19.1"},"description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"4.0.3","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0"},"devDependencies":{"@types/node":"16.11.26","express":"4.17.2","@deno/shim-deno-test":"~0.3.2","@types/chloride":"2.4.0","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/node-fetch":"2.5.12"},"gitHead":"eff7fbdb6fc3b8f0b377522ae70da4d612df819a","_id":"earthstar@9.0.2","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-nu3IdDzUlqk1ivLyC25WzyPKxf3X4g/y9jNeN50EK0dl6o5njhyALy8CBAyhFh6Ad6X/i+25E0oRdv+FxjrmpA==","shasum":"458573fc50a772a8f090cb4399c55ae4bcb06d9f","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-9.0.2.tgz","fileCount":159,"unpackedSize":579973,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDxjw/t3oYU3iZxb7Senf0Zqq8r5QIzoQ3w/fsu0FiYegIhANSt5emn//1kV3nU6SKBql4sknOy+8LKXgzStQNGATXP"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiVu/6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqOLw/6AtAIzry7LSQpv7Avxai8y2LGYbiFQJdDFwS2Jd3pvp/IEACi\r\nJ7unwmBpLX6Ch2pBlDCuexfn6hiXwL62TWfkt4AiwqM9WeREuSTnyJJUwCA1\r\n1cbLrJAefdGMG9phAP7j2b0nsB0lkyXhl8Samn2zaSW7wxIi+FLGwvOlLzcb\r\nJRMfeM63W9uMMM10GxGaHdLqWpbzj4KDItJTTSndc0vdzNbfPCIDpLDEKGdK\r\nqQiXzHXegjaaoDcfV9eZO7qXwqea0lCgV5NVVlcZSwmFmGAAspUL3i6vfhv2\r\n7zX9LmDQM+0Y485dirX6hjcalJCNC5dyc7YqaydCW4ei+bEjnMZF9RcbG3Vb\r\n+BQzEhbOA2FXMnouCbbjrAjj15eYWhxopNPQAuBtnsUfd9+ULeb1bE4vZEDi\r\nNdoAPERt93K/tv6rosMNdDLdoBdnfpM5h+f+ICstShCNc70axmv4MSRlebCk\r\nqG1Xll9LyMJ7HnJ+5WbxV8sx+isfJNT8S9JhO6as/fxT7Sm1iHZsP2QZWS7V\r\nCEbYUo+rXduLtEVzsaM28AuwsxSD8f/l3BjAOItgWV8mPU8c1/Xh1mnKRu54\r\nCtfCdzhNgIcaGdZld5BFrmyAxa4p6NjfqbKIFAvs/Mi80GMN9/MoEc3eesWR\r\n818egejmay8aTWHPlLdegqYCn9v/ohoKyvI=\r\n=2uri\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_9.0.2_1649864697880_0.25597917168696127"},"_hasShrinkwrap":false},"9.3.0":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"9.3.0","engines":{"node":">=14.19.1"},"description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"4.0.3","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0"},"devDependencies":{"@types/node":"16.11.26","express":"4.17.2","@deno/shim-deno-test":"~0.3.2","@types/chloride":"2.4.0","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/node-fetch":"2.5.12"},"gitHead":"d012ef54011f436c8eb1b06b49cec42529d94bcd","_id":"earthstar@9.3.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-YWGnQW5TIVDF+9aG407/wjTZRr4NaL217+HLk3X51pUYV7m4jX1ByAq7hZW1clfN3AN+65WrvJBYmXiA+NkVZQ==","shasum":"e8e4a228dbda26ac17c860f2d9f63d0133862e83","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-9.3.0.tgz","fileCount":159,"unpackedSize":589540,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE/rUlnTYkymJaCSWwsMkpbv5Yg1RPz7RZj+cOHhKWdCAiEA1ihLe1rWNlWPX1BYwE1QjXu+0Q5MH1ayT+hkNCiVNhE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiXXRcACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq1Sg//X3g2nJDS9MSCiLfboFTf5GnjZ2ehDvIMNpYF8tJKJHo70E4T\r\nE5IGDanpZ/RkAunnmzEjaC4CM5KLKJL7dneV75P3oAgWYwM79cmu4pZ0HC6z\r\nYiQE57x2LMEfmSz6WGUn8m77NeWnUlxL0+XgPaKvmeLM/KLScjI/l+nR8wAD\r\nByZqWTl7D95xru5a0/cWPKlLhVoITcjPQBwEWIJG1J3YBLyXQvICb+CDFaol\r\nLtJ6mtLZZdftZ8k0Jr4oxJcIWfn2+7Lnipdqa4eyqYaePGIohg87P+cGf0BY\r\nFMDn47HsJoD1A04XPkQhDLm/a5YqlCE8Yab14ltylxy5GAgdsgMd6Nc0Nmaq\r\n1XCBppXyTjW8zBSSuJ3NHmAeK70/tZ2BTV9/juwTiLpi11wHjT2E+VqhG20m\r\n0tiC27Y1xgobKLYzF3z6fzQtaoQs6Hq8Yn957SYBKSXkqiBA9KidtxAe7A3F\r\n3QddqFTi5R0Ar2XYrPYlTpO7LDHC0X8oMTLPrnJXSu9c1qRgdKUKw1ny05+x\r\n+sxgPTx/fdOAi9zhq6YkLcbauZeIbiTPtSa7Ii6CDms5ro1cT3xhsmcBjcYi\r\nKPKhczkqmFxOPGTa5AuBaS5MFPXtRgpTh5+R99SSaBEkc2YUZwjcFZtffi5D\r\nCn9j+VgIKxj1/lUnHUUXy/QzBwkehjCKoHk=\r\n=K48q\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_9.3.0_1650291804774_0.1793203725060919"},"_hasShrinkwrap":false},"9.3.1":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"9.3.1","engines":{"node":">=14.19.1"},"description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"16.11.26","express":"4.17.2","@deno/shim-deno-test":"~0.3.2","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/chloride":"2.4.0","@types/node-fetch":"2.5.12"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"5.0.0","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0"},"gitHead":"2cb61e8c40e63bb1dbbaf9ca9615b6b8d3185e4d","_id":"earthstar@9.3.1","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-GOgjM119Viph3p2RMiHD3yrixoghoa+m4Lyjm7vfSlhQGZZ/DIup+pKmT7dtkpA7Zsh151IM13ybzxOzis5wPg==","shasum":"7857957fae88f8a1b704f103337ea57da6f7d9d8","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-9.3.1.tgz","fileCount":159,"unpackedSize":589539,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCByCh9XtGGaoOgmAiCNnH3DmRrqKWzrjgbLmfzl353jAIhAPH4Ksgijnz5eYVeWrFIiUVTKXD6f5PnWvsTuNE7t/Lj"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiXt6PACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqzCA/9G++PoVdIvv8UmDnfM6gpoQz4GMFkP/m2AQkISQMWh4teUWFo\r\nkId8qnUDuJEAhnPWYcqYOHkATG6g7nKbjf19/DWheRKoN3gy6OM02+hTm54l\r\n2M/sD3+d1vmWNaRIwQkR87kZXa3tluff253qLe5r9uY9CSmZNViyFnZhqx0e\r\nirndVA99af/Ix86G6XKp6ZlgAjAulcIc4qKPrDQ19BNB+7lyfSfxZuYEV7Lw\r\nwvfkiomzVgEteRGbinDBe/amrnq7SipqXNyC7C8dYtws3p4IRGAXjvT/pEhU\r\n0isvtInzGRHGdiS6wpW0g0q5NPo3XDQPYLfu+CcwbuO94HMVMAAmXHSnYAq0\r\nfnQK7bClSM/fXT8xusIT578ABeZt9OJYoT81IwmwureCAW5JpRPhywTNv+42\r\nqnRmk9d9MMqHyXEVyFOQd8YaqIgqgMeAHGcaGwB6pNJfJ6LV6qK4apRyck/v\r\nrW0jBVBZla39K4vrMT211o32wvUyjMdTmd/tLnTVbfQ8uN0dp1IppsGrbRuS\r\nrICAjHg0c84FePL36a8sbJ/Xx1zCexYo4PB79vqi2omfWAiPr7v3AP0c899A\r\nilBsf+1snE+PZmOShFiefnI+tm22aW3c7/xJJvmA7YwdKnWdrvalPBPOyFvD\r\nY2ZhYct/Q87J5pSc4KQkzbqTrJFPfqM0sh4=\r\n=lQYj\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_9.3.1_1650384527776_0.7634314476489754"},"_hasShrinkwrap":false},"9.3.2":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"9.3.2","engines":{"node":">=14.19.1"},"description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"16.11.26","express":"4.17.2","@deno/shim-deno-test":"~0.3.2","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/chloride":"2.4.0","@types/node-fetch":"2.5.12"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chalk":"4.1.2","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"5.0.1","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0"},"gitHead":"02fdd9b530b47ff6049469bcda5600cb3c8fb37a","_id":"earthstar@9.3.2","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-cXD2iOpZJGNfeDBrjxDt5HQcCHjTYGmZT90avYDscxMx+vR8OgH0bbDhSanLAKZvUZrLwtRgOtBGZgPu4sLXtg==","shasum":"093a01e13d7ff2628f888f8920a0e164fc624478","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-9.3.2.tgz","fileCount":159,"unpackedSize":589539,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICStv0bMERJ43nYSC4l8xmYTFvhCQnutw7Js44m0mi5jAiEA8U7wP3p0bYKLiyfOVXO85PN1zbhPRpuTPSXlLuvl21o="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiX9zhACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoBMxAAiEM9VeunIyiOwYF9+GfiCxjxLgpyOwlGJ8yhIxhizDLJlvvv\r\nhK/b6nqeAdvWLkuOPQ1cjT/LuSpTjd0UZOnEdInJ/Z5jRs50yvux+z4dL6e9\r\nPuhx9SNvYj13Bt+Qc9Ft8QSg9Q9NIA+R/f5m39f/mrUisjrTQGo3GjotHUuc\r\nWOAmggcnvfPeWvXiolo0hYGiT3hZm/yP5xICUR7Gmz6sALpEgdqTTGw5QXoG\r\nWsnxvYx9F0Ftv0q148bx5gegG5g126PxZjq1PuDlXrNygbMWlu/jp9r7gESq\r\nXvVHlyTAePlHPftMUACq61fytIyuNOhNKmufjsWOhZhIJVOSVL9bMsV1dVqs\r\n4gM/peZuDOR/10CRHkc3lpPI4pF8vCOHvgk0b66J1d8Se38g3DsfxxfujaHg\r\n/+7HXJcx8ir2bvr6VVj1KchQsYUPwISE4uUSwbCdne3D74qWCTpZPqBMr7bK\r\nqzcKUDeDppuFVRIz/l13uR5C1CXxa8h5xeCH8bv4i8y3wlMplEO6Qlicx5GD\r\nMti7Zih/piR3I+64XeqjnENtym1zRgjTGe2woZmTDsgjHDegeweO6GjW0GFe\r\nRwTh9SfnJBs2+QzBSktimFZ881DZ8vEJEezuMkz0LIh40HBKW/qRDx3Iv4H8\r\nRuXGXXCQHq8/L3DibP9gV6NIQb4KH0U3YNk=\r\n=3pjb\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_9.3.2_1650449633148_0.6400305090222802"},"_hasShrinkwrap":false},"0.0.0-experimental-bqbpfplmfj3e4vfw":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","engines":{"node":">=16.14.2"},"version":"0.0.0-experimental-bqbpfplmfj3e4vfw","description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"16.11.37","chalk":"4.1.2","path-to-regexp":"6.2.1","@types/ws":"^8.5.3","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/node-fetch":"2.5.12"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-deno":"~0.8.0","@deno/shim-crypto":"~0.3.1","@deno/shim-timers":"~0.1.0","undici":"^5.8.0","@deno/sham-weakref":"~0.1.0","ws":"^8.5.0"},"readme":"# Earthstar\n\nSync stuff you care about with people you know. A specification and Javascript\nlibrary for building online tools you can truly call your own.Build\noffline-first, decentralised, and private network applications in the browser,\nserver, or command-line.\n\n**Clearly there's a lot to unpack, so check out\n[Earthstar's website](https://earthstar-project.org) for an introduction to\nEarthstar's concepts, an API tour, technical documentation, videos, and more!**\n\n## Usage\n\nTo use in Deno, add the following:\n\n```ts\nimport * as Earthstar from \"https://deno.land/x/earthstar/mod.ts\";\n```\n\nTo use with Node or apps built with NPM dependencies:\n\n```\nnpm i earthstar\n```\n\nAnd then import in your code:\n\n```ts\nimport * as Earthstar from \"earthstar\";\n```\n\n## Development\n\n### Setup\n\nYou will need Deno installed.\n[Instructions for installation can be found here](https://deno.land/#installation).\nYou may also want type-checking and linting from Deno for your IDE, which you\ncan get with extensions\n[like this one for VSCode](https://deno.land/manual@v1.17.2/vscode_deno).\n\nTo check that you've got everything set up correctly:\n\n`make example`\n\nThis will run the example script at `example-app.ts`, and you will see a lot of\ncolourful log messages from the app.\n\n### Scripts\n\nScripts are run with the `make` command.\n\n- `make test` - Run all tests\n- `make test-watch` - Run all tests in watch mode\n- `make fmt` - Format all code in the codebase\n- `make npm` - Create a NPM package in `npm` and run tests against it (requires\n  Node v14 or v16 to be installed).\n- `make bundle` - Create a bundled browser script at `earthstar.bundle.js`\n- `make depchart` - Regenerate the dependency chart images\n- `make coverage` - Generate code test coverage statistics\n- `make clean` - Delete generated files\n\n### Orientation\n\n- The entry for the package can be found at `mod.ts`.\n- Most external dependencies can be found in `deps.ts`. All other files import\n  external dependencies from this file.\n- Script definitions can be found in `Makefile`.\n- Tests are all in `src/test/`\n- The script for building the NPM package can be found in `scripts/build_npm.ts`\n\n### Uint8Arrays and Buffers\n\nWe use Uint8Arrays throughout the code to maximize platform support. Some of the\nnode-specific drivers use Buffers internally but the Buffers are converted to\nUint8Arrays before leaving those drivers.\n\nFor convenience, variables that hold Uint8Arrays are called \"bytes\", like\n`bytesToHash` instead of `uint8ArrayToHash`.\n\n`util/bytes.ts` has a bunch of helper code to do common operations on\nUint8Arrays and to convert them back and forth to strings and to Buffers.\n\n### Platform-specific tests\n\nDrivers are tested against the runtimes they're intended for. When tests are\nrun, they pull the correct scenarios from 'src/test/test-scenarios.ts', where\nthe current runtime is inferred during runtime.\n\n### Classes\n\nThe `Replica` is the main star of the show. Classes to the right are used\ninternally for its implementation. Classes to the left stack on top of an\n`Replica` to do extra things to it (subscribe to changes, cache data, etc).\n\nEach `Replica` holds the Docs for one Share.\n\n![](classes.png)\n\nNames starting with `I` are interfaces; there are one or multiple actual classes\nthat implement those interfaces.\n\nThe orange classes are \"drivers\" which have multiple implementations to choose\nfrom, for different platforms (node, browser, etc).\n\nBlue arrows show which functions call each other.\n\nThick black arrows show which classes have pointers to other classes when\nthey're running.\n\n### Source code dependency chart\n\nA --> B means \"file A imports file B\".\n\nFor readability this hides `/test/` and `/util/` and `*-types.ts`.\n\n![](depchart/depchart-no-types.png)\n\nAnd again with 3rd party dependencies as brown boxes with dotted lines, and\nincluding `*-types.ts`\n\n![](depchart/depchart-deps.png)\n\nRun `yarn depchart` to regenerate this. You'll need graphviz installed.\n\n### Platform-specific drivers\n\nThere are two parts of stone-soup which are swappable to support different\nplatforms or backends: `IReplica` and `IReplicaDriver`. Everything else should\nwork on all platforms.\n\nCrypto drivers:\n\n- `ReplicaDriverChloride` - only in browser, Node\n- `ReplicaDriverNode` - only in Node\n- `ReplicaDriverNoble` - universal\n\nStorage drivers:\n\n- `ReplicaDriverMemory` - univeral\n- `ReplicaDriverLocalStorage` - browser\n- `ReplicaDriverIndexedDB` - browser\n- `ReplicaDriverSqlite` - Node, Deno\n\nUsers of this library have to decide which of these drivers to import and use in\ntheir app.\n\n### Documentation\n\nWe use JSDoc for user documentation. You can view docs for the whole codebase at\nhttps://doc.deno.land/https://deno.land/x/stone_soup@v8.0.0/mod.ts, or by\nrunning the following from the root of the project:\n\n```\ndeno doc mod.ts\n```\n\nJSDocs are intended for end-users of the library. Comments for contributors\nworking with the codebase — e.g. notes on how something is implemented — are\nbetter as standard JS comments.\n\nIf possible, use a single line for the JSDoc. Example:\n\n```ts\n/** Does something great */\nexport function doSomething() {\n  // ...\n}\n```\n\nYou can use markdown inside of JSDoc block. While markdown supports HTML tags,\nit is forbidden in JSDoc blocks.\n\nCode string literals should be braced with the back-tick (\\`) instead of quotes.\nFor example:\n\n```ts\n/** Import something from the `earthstar` module. */\n```\n\nIt's not necessary to document function arguments unless an extra explanation is\nwarranted. Therefore `@param` should generally not be used. If `@param` is used,\nit should not include the `type` as TypeScript is already strongly typed.\n\n```ts\n/**\n * Function with non obvious param.\n * @param nonObvious Description of non obvious parameter.\n */\n```\n\nCode examples should utilize markdown format, like so:\n\n````ts\n/** A straight forward comment and an example:\n * ```ts\n * import { Crypto } from \"stone-soup\";\n * const keypair = Crypto.generateAuthorKeypair(\"suzy\");\n * ```\n */\n````\n\nCode examples should not contain additional comments and must not be indented.\nIt is already inside a comment. If it needs further comments it is not a good\nexample.\n\nExported functions should use the `function` keyword, and not be defined as\ninline functions assigned to variables. The main reason for this being that they\nare then correctly categorised as functions.\n\n### Publishing to NPM\n\n1. Run `make VERSION=\"version.number.here\" npm`, where `version.number.here` is\n   the desired version number for the package.\n2. `cd npm`\n3. `npm publish`\n\n## Changes from Earthstar v1\n\n### Splitting `Storage` into `Replica` and `ReplicaDriver` classes\n\nThink of this as `IStorageNiceAPIFullOfComplexity` and\n`IStorageSimpleLowLevelDriver`.\n\nI want to make it easier to add new kinds of storage so I'm splitting IStorage\ninto two parts:\n\nThe Storage does:\n\n- the complex annoying stuff we only want to write once\n- `set():` sign and add a document\n- `ingest():` validate and accept a document from the outside\n- user-friendly helper functions, getters, setters\n- an event bus that other things can subscribe to, like QueryFollowers\n\nThe StorageDriver does:\n\n- simple stuff, so we can make lots of drivers\n- query for documents (this is actually pretty complicated)\n- maintain indexes for querying (hopefully provided by the underlying storage\n  technology)\n- simple upsert of a document with no smartness\n\nPossibly even you can have multiple Storages for one Driver, for example when\nyou're using multiple tabs with indexedDb or localStorage.\n\n### \"Reliable indexing / streaming\"\n\nThis shows an implementation of the \"reliable indexing\" idea discussed in\n[this issue](https://github.com/earthstar-project/earthstar/issues/66).\n\n#### The problem\n\nWe have livestreaming now, over the network and also to local subscribers, all\nbased on `onWrite` events.\n\nIf you miss some events, you can't recover -- you have to do a full batch\ndownload of every document.\n\nEvents also don't tell you what was overwritten, which you might need to know to\nupdate a Layer or index.\n\n#### The solution: `localIndex`\n\nEach Storage keeps track of the order that it receives documents, and assignes\neach doc a `localIndex` value which starts at 1 and increments from there with\nevery newly written doc.\n\nThis puts the documents in a nice stable linear order that can be used to\nreliably stream, and resume streaming, from the Storage.\n\nWhen we get a new version of a document, it gets a new `localIndex` and goes at\nthe end of the sequence, and the old version vanishes, leaving a gap in the\nsequence. It's ok that there are gaps.\n\nThe `localIndex` is particular to a certain IStorage. It's kept in the `Doc`\nobject but it's not really part of it; it's not included in the signature. It's\nthis IStorage's metadata about that document. When syncing, it's sent as one of\nthe \"extra fields\"\n[(newly added to the specification)](https://earthstar-docs.netlify.app/docs/reference/earthstar-specification/#extra-fields-for-syncing),\nobserved by the receiving peer, then discarded and overwritten with the\nreceiving peer's own latest `localIndex` number.\n\n#### Use cases\n\n1. Streaming sync between peers, which can be interrupted and resumed\n1. Layers and indexes that use a QueryFollower to subscribe to changes in a\n   Storage. These might store their indexes in localStorage, for example, and\n   would therefore want to resume indexing instead of starting over from\n   scratch.\n1. React components that need to know when to re-render\n\nFor use cases where the listener will never have any downtime, they don't really\nneed to be able to resume, they can just listen for events from the Storage\ninstead and it may be more efficient. For example a React component could listen\nfor events about a particular document instead of making a whole QueryFollower\nthat has to go through every single change to find changes to that particular\ndocument.\n\n#### Properties of the `localIndex` sequence\n\nThe docs, sorted by `localIndex` on a particular peer, have these properties:\n\n**Properties**\n\n1. The docs are in a stable order that does not change, except:\n1. Newly added or changed docs go at the end, increasing the highest\n   `localIndex` by 1.\n1. When a doc is updated (same author and same path, but newer timestamp), we\n   discard the old version. So we leave a gap in the sequence where the old\n   verison used to be, and the new version goes on the end of the sequence.\n1. The first doc has a `localIndex` of zero, unless it was later changed, in\n   which case there will be a gap at zero.\n\nWhy do all this? The goal is to be able to catch up to changes since the last\ntime we looked at a Storage. We can do that by remembering the highest\n`localIndex` we saw last time, and now getting all the docs later than that in\nthe sequence. We always read this sequence from old to new (in increasing order\nof `localIndex`.\n\nThere are not really any other nice properties about this sequence:\n\n**Downsides**\n\n1. The `localIndex` order is not sorted by `path`, `timestamp`, `author`, or any\n   other useful property. The order is jumbled because docs can be received in\n   any order during a sync, perhaps with multiple other peers simultaneously,\n   perhaps some using Sync Filters to only get some docs...\n1. The order is different on every peer (that's why it's \"local\").\n1. The history docs for a certain path will be in a jumbled order in the\n   `localIndex` sequence. The Latest doc for a path can be before or after the\n   other history docs. User of QueryFollowers will need some bookeeping to\n   remember which version is the Latest for each path, if they care (e.g. if\n   it's being used as an index and not just a sync mechanism between peers).\n1. When a doc is modified and the old one is deleted, leaving a gap, you do not\n   get notified about the gap. There is no pointer back to the gap, or anything.\n   Users of QueryFollowers are expected to have some kind of index so they can\n   notice that the new doc overwrites the old one, and delete the old one.\n1. When an ephemeral doc expires, it leaves a gap in the sequence but nothing is\n   added to the end of the sequence. Users of QueryFollowers are expected to pay\n   attention to expiration dates and delete ephemeral docs themselves. We may\n   also add an event on the Storage when a doc expires, but you could miss this\n   event if you were not listening at that moment, so you'll still have to check\n   for your own expired docs from time to time.\n1. QueryFollowers should always progress in the direction of increasing\n   `localIndex`. (They can start at 0, or the latest number, or anywhere in\n   between). This makes it simple to keep track of where to resume next time.\n   However this means we always process the oldest-received docs first, but the\n   user probably cares more about the recently-received docs.\n   - It would be possible with fancier bookeeping to make QueryFollowers that\n     track which intervals of the sequence they've visited, so they can work\n     from newest-to-oldest. But sometimes the oldest-received docs are the most\n     important (like usernames)...\n\n#### Querying by `localIndex`\n\nThis lets you easily resume where you left off. You can get batches of N docs at\na time if you want, using the `limit` option.\n\n```ts\nstorage.getDocsSinceLocalIndex(\n    startAt: LocalIndex,\n    limit?: number): Doc[];\n```\n\nThis is also how you tell a QueryFollower where to start in the sequence.\nQueryFollowers ignore the `limit` property though.\n\n(You can also still look up documents by path in the usual old way.)\n\n### Reliable streaming over the network, when syncing\n\n(Not implemented in this code yet)\n\nWhen we send docs over the network we will send the `localIndex` to help the\nother side track where they are in our own sequence. The other side will then\ndiscard the property and put their own `localIndex` on the document when they\nstore it.\n\nPeers will remember, for each other peer, which is the latest `localIndex`\nthey've seen from that peer, so they can resume syncing from there.\n\nThis is similar to how append-only logs are synced in Scuttlebutt and Hyper,\nexcept our logs have gaps.\n\n### Slightly different querying\n\nQuerying has been made more organized -- see the Query type in `types.ts`. It\nlooks a bit more like an SQL query but the pieces are written in the order they\nactually happen, so it's easier to understand.\n\nThe order is:\n\n- history (all or latest only)\n- orderBy\n- startAt (continue from a certain point)\n- filter - the same options, timestamp, pathStartswith, etc etc\n- limit\n\nAlso, the `cleanUpQuery` function is fancier and will also figure out if the\nquery will match `all`, `some`, or `nothing` documents. This helps with\noptimizations elsewhere.\n\n## Problems left to solve\n\n- Ephemeral documents disappear without leaving a trace, do we need events for\n  that?\n- An IStorage might significantly change or start over, by deleting most of its\n  local documents and choosing a different sync query. Then we'd need to tell\n  subscribers and peers that we're effectively a different IStorage now.\n  - localIndex could be a tuple `[generation, localIndex]` where generation is\n    an integer that increments on each big change like that\n  - or give each IStorage a UUID which gets randomly changed when big changes\n    happen. This would be helpful for other reasons too (to prevent echoing back\n    documents to the storage that just gave them back to us, we need to track\n    who gave them to us)\n- Syncing by `localIndex` doesn't work very well when you also have a sync\n  query, because you have to scan the entire sequence to find the couple of docs\n  you care about. We probably still want another way of efficient syncing that\n  goes in path order and uses hashing in some clever way, sort of like a Merkle\n  tree but not.\n\n## Other small improvements\n\n- The `Document` type is now named `Doc` to avoid collision with an existing\n  built-in Typescript type\n","readmeFilename":"README.md","gitHead":"0d9a98b15b0444d2f93cfb0f51a22845c25dabcf","_id":"earthstar@0.0.0-experimental-bqbpfplmfj3e4vfw","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-Vc5d36Q15uLR6+YnW3kNHBuz6oFaLzVKduv4aaOGfUezZnvtlN1FBR/oGC2gBPsiYH3FPVdRqTRwB4ioVkvYxA==","shasum":"a4e14d215e38e98877b502084f5dad18dc5ba508","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-0.0.0-experimental-bqbpfplmfj3e4vfw.tgz","fileCount":195,"unpackedSize":859661,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC92sHmG7aUWA44CogruZFwsPnQqXjW6obNyCYG5BeRogIgMzJz2DMSdVhwyjiH872blJ5w7F0+fSstkgd9x3qmQrQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi7TKEACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp5IBAAo2oZnNacfROf753LN7K78WiaNqQnZFU/LvDgXMLACCZAXTiw\r\n54dsLGiLQbiEFbMz9tDtm0zmNwDdyfENA8MQ0KmLyq+yy6oSttT+fUCyopTb\r\nX4RCKHFiJEbBGqResQIVrTbFXzOEbe4GwG5kx/ovB+pD/CmrKOi+00Uf6EAO\r\nSE8wrL2ONzTsOZQP4A/WRA4iWAcb9/y8aTJaV5z3toV1yRdJxwccp4Svmah9\r\nCBuZZVWLvGRo0d5bCCS2WRWGGMQfACWeaeTMN7PE6W00oUc4jA4T9m+GCRYA\r\nAeAa6+elmyz+rC5+MqvG+zp2mTC4dLvjwe18HR1cUgGWFOvicv0tdayU3Fod\r\nx2OFqcJ5oh4DPBuESUqlfosmh3DDZk8RjYhAq6WB4e3YHVqoHM26llvAlAtF\r\ncdP4MnpWjDncjnlhGW4Csw6+ig17c4nAtRNrrawo1ZrOvZOOli+uhM4NbwcP\r\nmFYo5W2hLbQJ6MxZ5a+yQ9JAVLg7cwbUc/LjrWw14c58iFWuFdnnvOV48V+7\r\nkEVmLdvoEJ00/oPyf4SEmPXHqFzLfF6f+V0ZGzuB0ummsATqZQemD8Txakag\r\nFmYs1XRsHdUvq7lKyRscKkEn8ghKnuxvECU2GZB1jEAI2smLGVAOMEU2gqj3\r\ns/IPhWfxL4zIBZN1lT4rPTeyAXUQ4xOx8hs=\r\n=wVcu\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_0.0.0-experimental-bqbpfplmfj3e4vfw_1659712132397_0.45427584828351186"},"_hasShrinkwrap":false},"0.0.0-experimental-bxe4cbj6a3fit":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"0.0.0-experimental-bxe4cbj6a3fit","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks. ","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"16.11.37","chalk":"4.1.2","path-to-regexp":"6.2.1","@types/ws":"^8.5.3","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-deno":"~0.8.0","@deno/shim-crypto":"~0.3.1","@deno/shim-timers":"~0.1.0","undici":"^5.8.0","@deno/sham-weakref":"~0.1.0","ws":"^8.5.0"},"readme":"# Earthstar\n\nSync stuff you care about with people you know. A specification and Javascript\nlibrary for building online tools you can truly call your own.Build\noffline-first, decentralised, and private network applications in the browser,\nserver, or command-line.\n\n**Clearly there's a lot to unpack, so check out\n[Earthstar's website](https://earthstar-project.org) for an introduction to\nEarthstar's concepts, an API tour, technical documentation, videos, and more!**\n\n## Usage\n\nTo use in Deno, add the following:\n\n```ts\nimport * as Earthstar from \"https://deno.land/x/earthstar/mod.ts\";\n```\n\nTo use with Node or apps built with NPM dependencies:\n\n```\nnpm i earthstar\n```\n\nAnd then import in your code:\n\n```ts\nimport * as Earthstar from \"earthstar\";\n```\n\n## Development\n\n### Setup\n\nYou will need Deno installed.\n[Instructions for installation can be found here](https://deno.land/#installation).\nYou may also want type-checking and linting from Deno for your IDE, which you\ncan get with extensions\n[like this one for VSCode](https://deno.land/manual@v1.17.2/vscode_deno).\n\nTo check that you've got everything set up correctly:\n\n`make example`\n\nThis will run the example script at `example-app.ts`, and you will see a lot of\ncolourful log messages from the app.\n\n### Scripts\n\nScripts are run with the `make` command.\n\n- `make test` - Run all tests\n- `make test-watch` - Run all tests in watch mode\n- `make fmt` - Format all code in the codebase\n- `make npm` - Create a NPM package in `npm` and run tests against it (requires\n  Node v14 or v16 to be installed).\n- `make bundle` - Create a bundled browser script at `earthstar.bundle.js`\n- `make depchart` - Regenerate the dependency chart images\n- `make coverage` - Generate code test coverage statistics\n- `make clean` - Delete generated files\n\n### Orientation\n\n- The entry for the package can be found at `mod.ts`.\n- Most external dependencies can be found in `deps.ts`. All other files import\n  external dependencies from this file.\n- Script definitions can be found in `Makefile`.\n- Tests are all in `src/test/`\n- The script for building the NPM package can be found in `scripts/build_npm.ts`\n\n### Uint8Arrays and Buffers\n\nWe use Uint8Arrays throughout the code to maximize platform support. Some of the\nnode-specific drivers use Buffers internally but the Buffers are converted to\nUint8Arrays before leaving those drivers.\n\nFor convenience, variables that hold Uint8Arrays are called \"bytes\", like\n`bytesToHash` instead of `uint8ArrayToHash`.\n\n`util/bytes.ts` has a bunch of helper code to do common operations on\nUint8Arrays and to convert them back and forth to strings and to Buffers.\n\n### Platform-specific tests\n\nDrivers are tested against the runtimes they're intended for. When tests are\nrun, they pull the correct scenarios from 'src/test/test-scenarios.ts', where\nthe current runtime is inferred during runtime.\n\n### Classes\n\nThe `Replica` is the main star of the show. Classes to the right are used\ninternally for its implementation. Classes to the left stack on top of an\n`Replica` to do extra things to it (subscribe to changes, cache data, etc).\n\nEach `Replica` holds the Docs for one Share.\n\n![](classes.png)\n\nNames starting with `I` are interfaces; there are one or multiple actual classes\nthat implement those interfaces.\n\nThe orange classes are \"drivers\" which have multiple implementations to choose\nfrom, for different platforms (node, browser, etc).\n\nBlue arrows show which functions call each other.\n\nThick black arrows show which classes have pointers to other classes when\nthey're running.\n\n### Source code dependency chart\n\nA --> B means \"file A imports file B\".\n\nFor readability this hides `/test/` and `/util/` and `*-types.ts`.\n\n![](depchart/depchart-no-types.png)\n\nAnd again with 3rd party dependencies as brown boxes with dotted lines, and\nincluding `*-types.ts`\n\n![](depchart/depchart-deps.png)\n\nRun `yarn depchart` to regenerate this. You'll need graphviz installed.\n\n### Platform-specific drivers\n\nThere are two parts of stone-soup which are swappable to support different\nplatforms or backends: `IReplica` and `IReplicaDriver`. Everything else should\nwork on all platforms.\n\nCrypto drivers:\n\n- `ReplicaDriverChloride` - only in browser, Node\n- `ReplicaDriverNode` - only in Node\n- `ReplicaDriverNoble` - universal\n\nStorage drivers:\n\n- `ReplicaDriverMemory` - univeral\n- `ReplicaDriverLocalStorage` - browser\n- `ReplicaDriverIndexedDB` - browser\n- `ReplicaDriverSqlite` - Node, Deno\n\nUsers of this library have to decide which of these drivers to import and use in\ntheir app.\n\n### Documentation\n\nWe use JSDoc for user documentation. You can view docs for the whole codebase at\nhttps://doc.deno.land/https://deno.land/x/stone_soup@v8.0.0/mod.ts, or by\nrunning the following from the root of the project:\n\n```\ndeno doc mod.ts\n```\n\nJSDocs are intended for end-users of the library. Comments for contributors\nworking with the codebase — e.g. notes on how something is implemented — are\nbetter as standard JS comments.\n\nIf possible, use a single line for the JSDoc. Example:\n\n```ts\n/** Does something great */\nexport function doSomething() {\n  // ...\n}\n```\n\nYou can use markdown inside of JSDoc block. While markdown supports HTML tags,\nit is forbidden in JSDoc blocks.\n\nCode string literals should be braced with the back-tick (\\`) instead of quotes.\nFor example:\n\n```ts\n/** Import something from the `earthstar` module. */\n```\n\nIt's not necessary to document function arguments unless an extra explanation is\nwarranted. Therefore `@param` should generally not be used. If `@param` is used,\nit should not include the `type` as TypeScript is already strongly typed.\n\n```ts\n/**\n * Function with non obvious param.\n * @param nonObvious Description of non obvious parameter.\n */\n```\n\nCode examples should utilize markdown format, like so:\n\n````ts\n/** A straight forward comment and an example:\n * ```ts\n * import { Crypto } from \"stone-soup\";\n * const keypair = Crypto.generateAuthorKeypair(\"suzy\");\n * ```\n */\n````\n\nCode examples should not contain additional comments and must not be indented.\nIt is already inside a comment. If it needs further comments it is not a good\nexample.\n\nExported functions should use the `function` keyword, and not be defined as\ninline functions assigned to variables. The main reason for this being that they\nare then correctly categorised as functions.\n\n### Publishing to NPM\n\n1. Run `make VERSION=\"version.number.here\" npm`, where `version.number.here` is\n   the desired version number for the package.\n2. `cd npm`\n3. `npm publish`\n\n## Changes from Earthstar v1\n\n### Splitting `Storage` into `Replica` and `ReplicaDriver` classes\n\nThink of this as `IStorageNiceAPIFullOfComplexity` and\n`IStorageSimpleLowLevelDriver`.\n\nI want to make it easier to add new kinds of storage so I'm splitting IStorage\ninto two parts:\n\nThe Storage does:\n\n- the complex annoying stuff we only want to write once\n- `set():` sign and add a document\n- `ingest():` validate and accept a document from the outside\n- user-friendly helper functions, getters, setters\n- an event bus that other things can subscribe to, like QueryFollowers\n\nThe StorageDriver does:\n\n- simple stuff, so we can make lots of drivers\n- query for documents (this is actually pretty complicated)\n- maintain indexes for querying (hopefully provided by the underlying storage\n  technology)\n- simple upsert of a document with no smartness\n\nPossibly even you can have multiple Storages for one Driver, for example when\nyou're using multiple tabs with indexedDb or localStorage.\n\n### \"Reliable indexing / streaming\"\n\nThis shows an implementation of the \"reliable indexing\" idea discussed in\n[this issue](https://github.com/earthstar-project/earthstar/issues/66).\n\n#### The problem\n\nWe have livestreaming now, over the network and also to local subscribers, all\nbased on `onWrite` events.\n\nIf you miss some events, you can't recover -- you have to do a full batch\ndownload of every document.\n\nEvents also don't tell you what was overwritten, which you might need to know to\nupdate a Layer or index.\n\n#### The solution: `localIndex`\n\nEach Storage keeps track of the order that it receives documents, and assignes\neach doc a `localIndex` value which starts at 1 and increments from there with\nevery newly written doc.\n\nThis puts the documents in a nice stable linear order that can be used to\nreliably stream, and resume streaming, from the Storage.\n\nWhen we get a new version of a document, it gets a new `localIndex` and goes at\nthe end of the sequence, and the old version vanishes, leaving a gap in the\nsequence. It's ok that there are gaps.\n\nThe `localIndex` is particular to a certain IStorage. It's kept in the `Doc`\nobject but it's not really part of it; it's not included in the signature. It's\nthis IStorage's metadata about that document. When syncing, it's sent as one of\nthe \"extra fields\"\n[(newly added to the specification)](https://earthstar-docs.netlify.app/docs/reference/earthstar-specification/#extra-fields-for-syncing),\nobserved by the receiving peer, then discarded and overwritten with the\nreceiving peer's own latest `localIndex` number.\n\n#### Use cases\n\n1. Streaming sync between peers, which can be interrupted and resumed\n1. Layers and indexes that use a QueryFollower to subscribe to changes in a\n   Storage. These might store their indexes in localStorage, for example, and\n   would therefore want to resume indexing instead of starting over from\n   scratch.\n1. React components that need to know when to re-render\n\nFor use cases where the listener will never have any downtime, they don't really\nneed to be able to resume, they can just listen for events from the Storage\ninstead and it may be more efficient. For example a React component could listen\nfor events about a particular document instead of making a whole QueryFollower\nthat has to go through every single change to find changes to that particular\ndocument.\n\n#### Properties of the `localIndex` sequence\n\nThe docs, sorted by `localIndex` on a particular peer, have these properties:\n\n**Properties**\n\n1. The docs are in a stable order that does not change, except:\n1. Newly added or changed docs go at the end, increasing the highest\n   `localIndex` by 1.\n1. When a doc is updated (same author and same path, but newer timestamp), we\n   discard the old version. So we leave a gap in the sequence where the old\n   verison used to be, and the new version goes on the end of the sequence.\n1. The first doc has a `localIndex` of zero, unless it was later changed, in\n   which case there will be a gap at zero.\n\nWhy do all this? The goal is to be able to catch up to changes since the last\ntime we looked at a Storage. We can do that by remembering the highest\n`localIndex` we saw last time, and now getting all the docs later than that in\nthe sequence. We always read this sequence from old to new (in increasing order\nof `localIndex`.\n\nThere are not really any other nice properties about this sequence:\n\n**Downsides**\n\n1. The `localIndex` order is not sorted by `path`, `timestamp`, `author`, or any\n   other useful property. The order is jumbled because docs can be received in\n   any order during a sync, perhaps with multiple other peers simultaneously,\n   perhaps some using Sync Filters to only get some docs...\n1. The order is different on every peer (that's why it's \"local\").\n1. The history docs for a certain path will be in a jumbled order in the\n   `localIndex` sequence. The Latest doc for a path can be before or after the\n   other history docs. User of QueryFollowers will need some bookeeping to\n   remember which version is the Latest for each path, if they care (e.g. if\n   it's being used as an index and not just a sync mechanism between peers).\n1. When a doc is modified and the old one is deleted, leaving a gap, you do not\n   get notified about the gap. There is no pointer back to the gap, or anything.\n   Users of QueryFollowers are expected to have some kind of index so they can\n   notice that the new doc overwrites the old one, and delete the old one.\n1. When an ephemeral doc expires, it leaves a gap in the sequence but nothing is\n   added to the end of the sequence. Users of QueryFollowers are expected to pay\n   attention to expiration dates and delete ephemeral docs themselves. We may\n   also add an event on the Storage when a doc expires, but you could miss this\n   event if you were not listening at that moment, so you'll still have to check\n   for your own expired docs from time to time.\n1. QueryFollowers should always progress in the direction of increasing\n   `localIndex`. (They can start at 0, or the latest number, or anywhere in\n   between). This makes it simple to keep track of where to resume next time.\n   However this means we always process the oldest-received docs first, but the\n   user probably cares more about the recently-received docs.\n   - It would be possible with fancier bookeeping to make QueryFollowers that\n     track which intervals of the sequence they've visited, so they can work\n     from newest-to-oldest. But sometimes the oldest-received docs are the most\n     important (like usernames)...\n\n#### Querying by `localIndex`\n\nThis lets you easily resume where you left off. You can get batches of N docs at\na time if you want, using the `limit` option.\n\n```ts\nstorage.getDocsSinceLocalIndex(\n    startAt: LocalIndex,\n    limit?: number): Doc[];\n```\n\nThis is also how you tell a QueryFollower where to start in the sequence.\nQueryFollowers ignore the `limit` property though.\n\n(You can also still look up documents by path in the usual old way.)\n\n### Reliable streaming over the network, when syncing\n\n(Not implemented in this code yet)\n\nWhen we send docs over the network we will send the `localIndex` to help the\nother side track where they are in our own sequence. The other side will then\ndiscard the property and put their own `localIndex` on the document when they\nstore it.\n\nPeers will remember, for each other peer, which is the latest `localIndex`\nthey've seen from that peer, so they can resume syncing from there.\n\nThis is similar to how append-only logs are synced in Scuttlebutt and Hyper,\nexcept our logs have gaps.\n\n### Slightly different querying\n\nQuerying has been made more organized -- see the Query type in `types.ts`. It\nlooks a bit more like an SQL query but the pieces are written in the order they\nactually happen, so it's easier to understand.\n\nThe order is:\n\n- history (all or latest only)\n- orderBy\n- startAt (continue from a certain point)\n- filter - the same options, timestamp, pathStartswith, etc etc\n- limit\n\nAlso, the `cleanUpQuery` function is fancier and will also figure out if the\nquery will match `all`, `some`, or `nothing` documents. This helps with\noptimizations elsewhere.\n\n## Problems left to solve\n\n- Ephemeral documents disappear without leaving a trace, do we need events for\n  that?\n- An IStorage might significantly change or start over, by deleting most of its\n  local documents and choosing a different sync query. Then we'd need to tell\n  subscribers and peers that we're effectively a different IStorage now.\n  - localIndex could be a tuple `[generation, localIndex]` where generation is\n    an integer that increments on each big change like that\n  - or give each IStorage a UUID which gets randomly changed when big changes\n    happen. This would be helpful for other reasons too (to prevent echoing back\n    documents to the storage that just gave them back to us, we need to track\n    who gave them to us)\n- Syncing by `localIndex` doesn't work very well when you also have a sync\n  query, because you have to scan the entire sequence to find the couple of docs\n  you care about. We probably still want another way of efficient syncing that\n  goes in path order and uses hashing in some clever way, sort of like a Merkle\n  tree but not.\n\n## Other small improvements\n\n- The `Document` type is now named `Doc` to avoid collision with an existing\n  built-in Typescript type\n","readmeFilename":"README.md","gitHead":"1e232082e219f7c96c49670a1d0a244d7445d5ce","_id":"earthstar@0.0.0-experimental-bxe4cbj6a3fit","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-cvmwZgMkTeUiWJAs8V7gqhT31zZGesJ2+JfvHSKG1nf235QaVHCoTmOvfI+gjSs5+Hh7/BeYw2tuarRwTRKMug==","shasum":"87df91e1f9d5ff714d6ed57468f83f84423cc3a9","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-0.0.0-experimental-bxe4cbj6a3fit.tgz","fileCount":210,"unpackedSize":957901,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAF1hbFxjBOtlVSmuhpx40KblTyPsR3XJJqx8SQXvggxAiBIdFjZpo1oO5igMbMUhA5RMQTNoSI5Vtedlxhr3oOX5Q=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi/2zaACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqyig/9Ea5ElPZSJUe0ZSLa47RPKV/PIs3kKBWoG2EIuQHGuNDnjyUA\r\nspCV2Wgir8CBGtdqw6zDA88PDIMUSmVzZSTqKvHGhczbkGxi2Mt35fhTIN+1\r\nkND+QCcM8lodM5DSsYr+H9eTU7ACVVvwc9KyfKLvj5MpWJlM6WykuzrZYINc\r\nuzD6mMh7YAOxKnZFncw0Xdd63Yd/M9yzxnVwziZKMS2Dx026HCxgXiBJAUPK\r\nB2lD9qjoEl+B0/Er80nBcdq1T97IaIaGRDGy982KXiSwf0xfNR5Lj4iyKgXM\r\n5geQ7mdb9XQg7mWjPtuNdf9TfrlThBjXa8NdID+swe1ITtQOMi5kVlJ7BQFH\r\noxNtbu1orGh3FpotOiKGlLjkgGujfMJek2HmIhQDJQ/p7F/zeUg0HrP4oLd3\r\neTimQdiBKUyy86THSFNM37O7hdIEbmoJwruqMRuRQ9qpTKlhlyvOAMVmFzTT\r\n71eMHgf4avsvwDwWh9XPKac7PA91E0mZ+Z8cU8jb1jcy1eCt9xxPSSmp5ah/\r\nasWpCMFdwARMhW+fUT8hGnp1PxoVqkvSp3WmhEAbr2L7hN0vzhpeDAgXTYQm\r\nyd+k5oEdO/D4lJorrIvxTMIfqgIImQUkz29bqYq2SVcMfhJ3ibaELcWNohLi\r\n5dIcujyjMgtLX6zL/mzRXNZCkcrazxFd7ps=\r\n=K22U\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_0.0.0-experimental-bxe4cbj6a3fit_1660906714668_0.903988955550181"},"_hasShrinkwrap":false},"10.0.0-alpha.1":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"10.0.0-alpha.1","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"16.11.37","chalk":"4.1.2","path-to-regexp":"6.2.1","@types/ws":"^8.5.3","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-deno":"~0.9.0","@deno/shim-crypto":"~0.3.1","@deno/shim-timers":"~0.1.0","undici":"^5.8.0","@deno/sham-weakref":"~0.1.0","ws":"^8.5.0"},"readme":"# Earthstar\n\nSync stuff you care about with people you know. A specification and Javascript\nlibrary for building online tools you can truly call your own.Build\noffline-first, decentralised, and private network applications in the browser,\nserver, or command-line.\n\n**Clearly there's a lot to unpack, so check out\n[Earthstar's website](https://earthstar-project.org) for an introduction to\nEarthstar's concepts, an API tour, technical documentation, videos, and more!**\n\n## Usage\n\nTo use in Deno, add the following:\n\n```ts\nimport * as Earthstar from \"https://deno.land/x/earthstar/mod.ts\";\n```\n\nTo use with Node or apps built with NPM dependencies:\n\n```\nnpm i earthstar\n```\n\nAnd then import in your code:\n\n```ts\nimport * as Earthstar from \"earthstar\";\n```\n\n## Development\n\n### Setup\n\nYou will need Deno installed.\n[Instructions for installation can be found here](https://deno.land/#installation).\nYou may also want type-checking and linting from Deno for your IDE, which you\ncan get with extensions\n[like this one for VSCode](https://deno.land/manual@v1.17.2/vscode_deno).\n\nTo check that you've got everything set up correctly:\n\n`make example`\n\nThis will run the example script at `example-app.ts`, and you will see a lot of\ncolourful log messages from the app.\n\n### Scripts\n\nScripts are run with the `make` command.\n\n- `make test` - Run all tests\n- `make test-watch` - Run all tests in watch mode\n- `make fmt` - Format all code in the codebase\n- `make npm` - Create a NPM package in `npm` and run tests against it (requires\n  Node v14 or v16 to be installed).\n- `make bundle` - Create a bundled browser script at `earthstar.bundle.js`\n- `make depchart` - Regenerate the dependency chart images\n- `make coverage` - Generate code test coverage statistics\n- `make clean` - Delete generated files\n\n### Orientation\n\n- The entry for the package can be found at `mod.ts`.\n- Most external dependencies can be found in `deps.ts`. All other files import\n  external dependencies from this file.\n- Script definitions can be found in `Makefile`.\n- Tests are all in `src/test/`\n- The script for building the NPM package can be found in `scripts/build_npm.ts`\n\n### Uint8Arrays and Buffers\n\nWe use Uint8Arrays throughout the code to maximize platform support. Some of the\nnode-specific drivers use Buffers internally but the Buffers are converted to\nUint8Arrays before leaving those drivers.\n\nFor convenience, variables that hold Uint8Arrays are called \"bytes\", like\n`bytesToHash` instead of `uint8ArrayToHash`.\n\n`util/bytes.ts` has a bunch of helper code to do common operations on\nUint8Arrays and to convert them back and forth to strings and to Buffers.\n\n### Platform-specific tests\n\nDrivers are tested against the runtimes they're intended for. When tests are\nrun, they pull the correct scenarios from 'src/test/test-scenarios.ts', where\nthe current runtime is inferred during runtime.\n\n### Classes\n\nThe `Replica` is the main star of the show. Classes to the right are used\ninternally for its implementation. Classes to the left stack on top of an\n`Replica` to do extra things to it (subscribe to changes, cache data, etc).\n\nEach `Replica` holds the Docs for one Share.\n\n![](classes.png)\n\nNames starting with `I` are interfaces; there are one or multiple actual classes\nthat implement those interfaces.\n\nThe orange classes are \"drivers\" which have multiple implementations to choose\nfrom, for different platforms (node, browser, etc).\n\nBlue arrows show which functions call each other.\n\nThick black arrows show which classes have pointers to other classes when\nthey're running.\n\n### Source code dependency chart\n\nA --> B means \"file A imports file B\".\n\nFor readability this hides `/test/` and `/util/` and `*-types.ts`.\n\n![](depchart/depchart-no-types.png)\n\nAnd again with 3rd party dependencies as brown boxes with dotted lines, and\nincluding `*-types.ts`\n\n![](depchart/depchart-deps.png)\n\nRun `yarn depchart` to regenerate this. You'll need graphviz installed.\n\n### Platform-specific drivers\n\nThere are two parts of stone-soup which are swappable to support different\nplatforms or backends: `IReplica` and `IReplicaDriver`. Everything else should\nwork on all platforms.\n\nCrypto drivers:\n\n- `ReplicaDriverChloride` - only in browser, Node\n- `ReplicaDriverNode` - only in Node\n- `ReplicaDriverNoble` - universal\n\nStorage drivers:\n\n- `ReplicaDriverMemory` - univeral\n- `ReplicaDriverLocalStorage` - browser\n- `ReplicaDriverIndexedDB` - browser\n- `ReplicaDriverSqlite` - Node, Deno\n\nUsers of this library have to decide which of these drivers to import and use in\ntheir app.\n\n### Documentation\n\nWe use JSDoc for user documentation. You can view docs for the whole codebase at\nhttps://doc.deno.land/https://deno.land/x/stone_soup@v8.0.0/mod.ts, or by\nrunning the following from the root of the project:\n\n```\ndeno doc mod.ts\n```\n\nJSDocs are intended for end-users of the library. Comments for contributors\nworking with the codebase — e.g. notes on how something is implemented — are\nbetter as standard JS comments.\n\nIf possible, use a single line for the JSDoc. Example:\n\n```ts\n/** Does something great */\nexport function doSomething() {\n  // ...\n}\n```\n\nYou can use markdown inside of JSDoc block. While markdown supports HTML tags,\nit is forbidden in JSDoc blocks.\n\nCode string literals should be braced with the back-tick (\\`) instead of quotes.\nFor example:\n\n```ts\n/** Import something from the `earthstar` module. */\n```\n\nIt's not necessary to document function arguments unless an extra explanation is\nwarranted. Therefore `@param` should generally not be used. If `@param` is used,\nit should not include the `type` as TypeScript is already strongly typed.\n\n```ts\n/**\n * Function with non obvious param.\n * @param nonObvious Description of non obvious parameter.\n */\n```\n\nCode examples should utilize markdown format, like so:\n\n````ts\n/** A straight forward comment and an example:\n * ```ts\n * import { Crypto } from \"stone-soup\";\n * const keypair = Crypto.generateAuthorKeypair(\"suzy\");\n * ```\n */\n````\n\nCode examples should not contain additional comments and must not be indented.\nIt is already inside a comment. If it needs further comments it is not a good\nexample.\n\nExported functions should use the `function` keyword, and not be defined as\ninline functions assigned to variables. The main reason for this being that they\nare then correctly categorised as functions.\n\n### Publishing to NPM\n\n1. Run `make VERSION=\"version.number.here\" npm`, where `version.number.here` is\n   the desired version number for the package.\n2. `cd npm`\n3. `npm publish`\n\n## Changes from Earthstar v1\n\n### Splitting `Storage` into `Replica` and `ReplicaDriver` classes\n\nThink of this as `IStorageNiceAPIFullOfComplexity` and\n`IStorageSimpleLowLevelDriver`.\n\nI want to make it easier to add new kinds of storage so I'm splitting IStorage\ninto two parts:\n\nThe Storage does:\n\n- the complex annoying stuff we only want to write once\n- `set():` sign and add a document\n- `ingest():` validate and accept a document from the outside\n- user-friendly helper functions, getters, setters\n- an event bus that other things can subscribe to, like QueryFollowers\n\nThe StorageDriver does:\n\n- simple stuff, so we can make lots of drivers\n- query for documents (this is actually pretty complicated)\n- maintain indexes for querying (hopefully provided by the underlying storage\n  technology)\n- simple upsert of a document with no smartness\n\nPossibly even you can have multiple Storages for one Driver, for example when\nyou're using multiple tabs with indexedDb or localStorage.\n\n### \"Reliable indexing / streaming\"\n\nThis shows an implementation of the \"reliable indexing\" idea discussed in\n[this issue](https://github.com/earthstar-project/earthstar/issues/66).\n\n#### The problem\n\nWe have livestreaming now, over the network and also to local subscribers, all\nbased on `onWrite` events.\n\nIf you miss some events, you can't recover -- you have to do a full batch\ndownload of every document.\n\nEvents also don't tell you what was overwritten, which you might need to know to\nupdate a Layer or index.\n\n#### The solution: `localIndex`\n\nEach Storage keeps track of the order that it receives documents, and assignes\neach doc a `localIndex` value which starts at 1 and increments from there with\nevery newly written doc.\n\nThis puts the documents in a nice stable linear order that can be used to\nreliably stream, and resume streaming, from the Storage.\n\nWhen we get a new version of a document, it gets a new `localIndex` and goes at\nthe end of the sequence, and the old version vanishes, leaving a gap in the\nsequence. It's ok that there are gaps.\n\nThe `localIndex` is particular to a certain IStorage. It's kept in the `Doc`\nobject but it's not really part of it; it's not included in the signature. It's\nthis IStorage's metadata about that document. When syncing, it's sent as one of\nthe \"extra fields\"\n[(newly added to the specification)](https://earthstar-docs.netlify.app/docs/reference/earthstar-specification/#extra-fields-for-syncing),\nobserved by the receiving peer, then discarded and overwritten with the\nreceiving peer's own latest `localIndex` number.\n\n#### Use cases\n\n1. Streaming sync between peers, which can be interrupted and resumed\n1. Layers and indexes that use a QueryFollower to subscribe to changes in a\n   Storage. These might store their indexes in localStorage, for example, and\n   would therefore want to resume indexing instead of starting over from\n   scratch.\n1. React components that need to know when to re-render\n\nFor use cases where the listener will never have any downtime, they don't really\nneed to be able to resume, they can just listen for events from the Storage\ninstead and it may be more efficient. For example a React component could listen\nfor events about a particular document instead of making a whole QueryFollower\nthat has to go through every single change to find changes to that particular\ndocument.\n\n#### Properties of the `localIndex` sequence\n\nThe docs, sorted by `localIndex` on a particular peer, have these properties:\n\n**Properties**\n\n1. The docs are in a stable order that does not change, except:\n1. Newly added or changed docs go at the end, increasing the highest\n   `localIndex` by 1.\n1. When a doc is updated (same author and same path, but newer timestamp), we\n   discard the old version. So we leave a gap in the sequence where the old\n   verison used to be, and the new version goes on the end of the sequence.\n1. The first doc has a `localIndex` of zero, unless it was later changed, in\n   which case there will be a gap at zero.\n\nWhy do all this? The goal is to be able to catch up to changes since the last\ntime we looked at a Storage. We can do that by remembering the highest\n`localIndex` we saw last time, and now getting all the docs later than that in\nthe sequence. We always read this sequence from old to new (in increasing order\nof `localIndex`.\n\nThere are not really any other nice properties about this sequence:\n\n**Downsides**\n\n1. The `localIndex` order is not sorted by `path`, `timestamp`, `author`, or any\n   other useful property. The order is jumbled because docs can be received in\n   any order during a sync, perhaps with multiple other peers simultaneously,\n   perhaps some using Sync Filters to only get some docs...\n1. The order is different on every peer (that's why it's \"local\").\n1. The history docs for a certain path will be in a jumbled order in the\n   `localIndex` sequence. The Latest doc for a path can be before or after the\n   other history docs. User of QueryFollowers will need some bookeeping to\n   remember which version is the Latest for each path, if they care (e.g. if\n   it's being used as an index and not just a sync mechanism between peers).\n1. When a doc is modified and the old one is deleted, leaving a gap, you do not\n   get notified about the gap. There is no pointer back to the gap, or anything.\n   Users of QueryFollowers are expected to have some kind of index so they can\n   notice that the new doc overwrites the old one, and delete the old one.\n1. When an ephemeral doc expires, it leaves a gap in the sequence but nothing is\n   added to the end of the sequence. Users of QueryFollowers are expected to pay\n   attention to expiration dates and delete ephemeral docs themselves. We may\n   also add an event on the Storage when a doc expires, but you could miss this\n   event if you were not listening at that moment, so you'll still have to check\n   for your own expired docs from time to time.\n1. QueryFollowers should always progress in the direction of increasing\n   `localIndex`. (They can start at 0, or the latest number, or anywhere in\n   between). This makes it simple to keep track of where to resume next time.\n   However this means we always process the oldest-received docs first, but the\n   user probably cares more about the recently-received docs.\n   - It would be possible with fancier bookeeping to make QueryFollowers that\n     track which intervals of the sequence they've visited, so they can work\n     from newest-to-oldest. But sometimes the oldest-received docs are the most\n     important (like usernames)...\n\n#### Querying by `localIndex`\n\nThis lets you easily resume where you left off. You can get batches of N docs at\na time if you want, using the `limit` option.\n\n```ts\nstorage.getDocsSinceLocalIndex(\n    startAt: LocalIndex,\n    limit?: number): Doc[];\n```\n\nThis is also how you tell a QueryFollower where to start in the sequence.\nQueryFollowers ignore the `limit` property though.\n\n(You can also still look up documents by path in the usual old way.)\n\n### Reliable streaming over the network, when syncing\n\n(Not implemented in this code yet)\n\nWhen we send docs over the network we will send the `localIndex` to help the\nother side track where they are in our own sequence. The other side will then\ndiscard the property and put their own `localIndex` on the document when they\nstore it.\n\nPeers will remember, for each other peer, which is the latest `localIndex`\nthey've seen from that peer, so they can resume syncing from there.\n\nThis is similar to how append-only logs are synced in Scuttlebutt and Hyper,\nexcept our logs have gaps.\n\n### Slightly different querying\n\nQuerying has been made more organized -- see the Query type in `types.ts`. It\nlooks a bit more like an SQL query but the pieces are written in the order they\nactually happen, so it's easier to understand.\n\nThe order is:\n\n- history (all or latest only)\n- orderBy\n- startAt (continue from a certain point)\n- filter - the same options, timestamp, pathStartswith, etc etc\n- limit\n\nAlso, the `cleanUpQuery` function is fancier and will also figure out if the\nquery will match `all`, `some`, or `nothing` documents. This helps with\noptimizations elsewhere.\n\n## Problems left to solve\n\n- Ephemeral documents disappear without leaving a trace, do we need events for\n  that?\n- An IStorage might significantly change or start over, by deleting most of its\n  local documents and choosing a different sync query. Then we'd need to tell\n  subscribers and peers that we're effectively a different IStorage now.\n  - localIndex could be a tuple `[generation, localIndex]` where generation is\n    an integer that increments on each big change like that\n  - or give each IStorage a UUID which gets randomly changed when big changes\n    happen. This would be helpful for other reasons too (to prevent echoing back\n    documents to the storage that just gave them back to us, we need to track\n    who gave them to us)\n- Syncing by `localIndex` doesn't work very well when you also have a sync\n  query, because you have to scan the entire sequence to find the couple of docs\n  you care about. We probably still want another way of efficient syncing that\n  goes in path order and uses hashing in some clever way, sort of like a Merkle\n  tree but not.\n\n## Other small improvements\n\n- The `Document` type is now named `Doc` to avoid collision with an existing\n  built-in Typescript type\n","readmeFilename":"README.md","gitHead":"c30f7d8534eab67273d2be89aebea2c03a40d313","_id":"earthstar@10.0.0-alpha.1","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-CAsY4yo87mOhcwx2wzktJUdIh+nZKkTSNwybX2ISSA7TIOuAR4Y+gP7z4IZ3IahT3xPcHHpqzzeSP6U2lAq8Iw==","shasum":"021a4092261f3eac686cfba0714e4b9f440364ab","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.0.0-alpha.1.tgz","fileCount":342,"unpackedSize":3317804,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC+11+A6frEsfQsQ3W8ZBd9Y+xvtu2y0cugVyHP81sx6AIhAM87HnaZIXZSUrCupMa7MGtC05gMPPihREZAn8DzZDLt"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjFzmFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpmoA//Ye47cKmOnobqP3DBB0gHbUfjR9llqdUVvznu1vSeYRgpyykg\r\nRmfzhIVfpsh7lAG9qnsyir9eYTT8plotx9p93KhxG6H+l1LyAHfrKeQSBN9o\r\nfSKIZKJVRgyLFXZBa4s3sjCfeBaaIicE2vM3KVmKbSqrdxaySFWgKPPa+Dly\r\nMyC2KvEAGep3GmGpgOjt8AVa0qFjjUAekmJxh+Zh5C7/nUC/c2KTEurymL5X\r\nC9z69C0XgKfOdiAGl6kfQCgMgzEQijwZWdYyPn1x7l/tZE+Ya/HV/3AIj9Hq\r\nIbX0Q02z4mOuMxmrIEbih8BxUjIq3RIIqBcIC734TNgMAqnJEk6RM6+yqWIn\r\nVxZJ7KksLyFyax6h82a79bar1dyTtlcjGMBiaG5S+NePyuE5ezG5EsYKsXeZ\r\nlcAHaj8VHRBgI2buzIsq746nCROS6a8cg41yjKGF3yE7WmHO6noLsNIAehIk\r\nKKBo6PM7l+fVol/nI7tiw+lz4dH/yWe3lCQG/18QbAzHcGcJy74qOuT5pQbb\r\n0kXXW90dDj+bTQZBbvHx7p/AMzzUhTPlaohRGtMQvppj4gwa/d1SaJ9Uy07/\r\naeAy/XIqpRjj/zAj3L64ubhXjt1je8+6S7nuTuIfnlYRAVWe8keA7MEeShB1\r\n5MeCXShGewt0RB2Aw8MhquOQcPSL9uWY3vc=\r\n=0BWg\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.0.0-alpha.1_1662466437732_0.9107092277746582"},"_hasShrinkwrap":false},"10.0.0-alpha.2":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"10.0.0-alpha.2","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"16.11.37","chalk":"4.1.2","path-to-regexp":"6.2.1","ws":"8.8.1","@deno/shim-deno":"~0.9.0","@deno/shim-crypto":"~0.3.1","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/ws":"8.5.3"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","isomorphic-blob":"1.0.1","isomorphic-undici-ponyfill":"1.0.0","@sgwilym/isomorphic-streams":"1.0.4","isomorphic-ws":"5.0.0","textencoder-ponyfill":"1.0.2"},"readme":"# Earthstar\n\nSync stuff you care about with people you know. A specification and Javascript\nlibrary for building online tools you can truly call your own.Build\noffline-first, decentralised, and private network applications in the browser,\nserver, or command-line.\n\n**Clearly there's a lot to unpack, so check out\n[Earthstar's website](https://earthstar-project.org) for an introduction to\nEarthstar's concepts, an API tour, technical documentation, videos, and more!**\n\n## Usage\n\nTo use in Deno, add the following:\n\n```ts\nimport * as Earthstar from \"https://deno.land/x/earthstar/mod.ts\";\n```\n\nTo use with Node or apps built with NPM dependencies:\n\n```\nnpm i earthstar\n```\n\nAnd then import in your code:\n\n```ts\nimport * as Earthstar from \"earthstar\";\n```\n\n## Development\n\n### Setup\n\nYou will need Deno installed.\n[Instructions for installation can be found here](https://deno.land/#installation).\nYou may also want type-checking and linting from Deno for your IDE, which you\ncan get with extensions\n[like this one for VSCode](https://deno.land/manual@v1.17.2/vscode_deno).\n\nTo check that you've got everything set up correctly:\n\n`make example`\n\nThis will run the example script at `example-app.ts`, and you will see a lot of\ncolourful log messages from the app.\n\n### Scripts\n\nScripts are run with the `make` command.\n\n- `make test` - Run all tests\n- `make test-watch` - Run all tests in watch mode\n- `make fmt` - Format all code in the codebase\n- `make npm` - Create a NPM package in `npm` and run tests against it (requires\n  Node v14 or v16 to be installed).\n- `make bundle` - Create a bundled browser script at `earthstar.bundle.js`\n- `make depchart` - Regenerate the dependency chart images\n- `make coverage` - Generate code test coverage statistics\n- `make clean` - Delete generated files\n\n### Orientation\n\n- The entry for the package can be found at `mod.ts`.\n- Most external dependencies can be found in `deps.ts`. All other files import\n  external dependencies from this file.\n- Script definitions can be found in `Makefile`.\n- Tests are all in `src/test/`\n- The script for building the NPM package can be found in `scripts/build_npm.ts`\n\n### Uint8Arrays and Buffers\n\nWe use Uint8Arrays throughout the code to maximize platform support. Some of the\nnode-specific drivers use Buffers internally but the Buffers are converted to\nUint8Arrays before leaving those drivers.\n\nFor convenience, variables that hold Uint8Arrays are called \"bytes\", like\n`bytesToHash` instead of `uint8ArrayToHash`.\n\n`util/bytes.ts` has a bunch of helper code to do common operations on\nUint8Arrays and to convert them back and forth to strings and to Buffers.\n\n### Platform-specific tests\n\nDrivers are tested against the runtimes they're intended for. When tests are\nrun, they pull the correct scenarios from 'src/test/test-scenarios.ts', where\nthe current runtime is inferred during runtime.\n\n### Classes\n\nThe `Replica` is the main star of the show. Classes to the right are used\ninternally for its implementation. Classes to the left stack on top of an\n`Replica` to do extra things to it (subscribe to changes, cache data, etc).\n\nEach `Replica` holds the Docs for one Share.\n\n![](classes.png)\n\nNames starting with `I` are interfaces; there are one or multiple actual classes\nthat implement those interfaces.\n\nThe orange classes are \"drivers\" which have multiple implementations to choose\nfrom, for different platforms (node, browser, etc).\n\nBlue arrows show which functions call each other.\n\nThick black arrows show which classes have pointers to other classes when\nthey're running.\n\n### Source code dependency chart\n\nA --> B means \"file A imports file B\".\n\nFor readability this hides `/test/` and `/util/` and `*-types.ts`.\n\n![](depchart/depchart-no-types.png)\n\nAnd again with 3rd party dependencies as brown boxes with dotted lines, and\nincluding `*-types.ts`\n\n![](depchart/depchart-deps.png)\n\nRun `yarn depchart` to regenerate this. You'll need graphviz installed.\n\n### Platform-specific drivers\n\nThere are two parts of stone-soup which are swappable to support different\nplatforms or backends: `IReplica` and `IReplicaDriver`. Everything else should\nwork on all platforms.\n\nCrypto drivers:\n\n- `ReplicaDriverChloride` - only in browser, Node\n- `ReplicaDriverNode` - only in Node\n- `ReplicaDriverNoble` - universal\n\nStorage drivers:\n\n- `ReplicaDriverMemory` - univeral\n- `ReplicaDriverLocalStorage` - browser\n- `ReplicaDriverIndexedDB` - browser\n- `ReplicaDriverSqlite` - Node, Deno\n\nUsers of this library have to decide which of these drivers to import and use in\ntheir app.\n\n### Documentation\n\nWe use JSDoc for user documentation. You can view docs for the whole codebase at\nhttps://doc.deno.land/https://deno.land/x/stone_soup@v8.0.0/mod.ts, or by\nrunning the following from the root of the project:\n\n```\ndeno doc mod.ts\n```\n\nJSDocs are intended for end-users of the library. Comments for contributors\nworking with the codebase — e.g. notes on how something is implemented — are\nbetter as standard JS comments.\n\nIf possible, use a single line for the JSDoc. Example:\n\n```ts\n/** Does something great */\nexport function doSomething() {\n  // ...\n}\n```\n\nYou can use markdown inside of JSDoc block. While markdown supports HTML tags,\nit is forbidden in JSDoc blocks.\n\nCode string literals should be braced with the back-tick (\\`) instead of quotes.\nFor example:\n\n```ts\n/** Import something from the `earthstar` module. */\n```\n\nIt's not necessary to document function arguments unless an extra explanation is\nwarranted. Therefore `@param` should generally not be used. If `@param` is used,\nit should not include the `type` as TypeScript is already strongly typed.\n\n```ts\n/**\n * Function with non obvious param.\n * @param nonObvious Description of non obvious parameter.\n */\n```\n\nCode examples should utilize markdown format, like so:\n\n````ts\n/** A straight forward comment and an example:\n * ```ts\n * import { Crypto } from \"stone-soup\";\n * const keypair = Crypto.generateAuthorKeypair(\"suzy\");\n * ```\n */\n````\n\nCode examples should not contain additional comments and must not be indented.\nIt is already inside a comment. If it needs further comments it is not a good\nexample.\n\nExported functions should use the `function` keyword, and not be defined as\ninline functions assigned to variables. The main reason for this being that they\nare then correctly categorised as functions.\n\n### Publishing to NPM\n\n1. Run `make VERSION=\"version.number.here\" npm`, where `version.number.here` is\n   the desired version number for the package.\n2. `cd npm`\n3. `npm publish`\n\n## Changes from Earthstar v1\n\n### Splitting `Storage` into `Replica` and `ReplicaDriver` classes\n\nThink of this as `IStorageNiceAPIFullOfComplexity` and\n`IStorageSimpleLowLevelDriver`.\n\nI want to make it easier to add new kinds of storage so I'm splitting IStorage\ninto two parts:\n\nThe Storage does:\n\n- the complex annoying stuff we only want to write once\n- `set():` sign and add a document\n- `ingest():` validate and accept a document from the outside\n- user-friendly helper functions, getters, setters\n- an event bus that other things can subscribe to, like QueryFollowers\n\nThe StorageDriver does:\n\n- simple stuff, so we can make lots of drivers\n- query for documents (this is actually pretty complicated)\n- maintain indexes for querying (hopefully provided by the underlying storage\n  technology)\n- simple upsert of a document with no smartness\n\nPossibly even you can have multiple Storages for one Driver, for example when\nyou're using multiple tabs with indexedDb or localStorage.\n\n### \"Reliable indexing / streaming\"\n\nThis shows an implementation of the \"reliable indexing\" idea discussed in\n[this issue](https://github.com/earthstar-project/earthstar/issues/66).\n\n#### The problem\n\nWe have livestreaming now, over the network and also to local subscribers, all\nbased on `onWrite` events.\n\nIf you miss some events, you can't recover -- you have to do a full batch\ndownload of every document.\n\nEvents also don't tell you what was overwritten, which you might need to know to\nupdate a Layer or index.\n\n#### The solution: `localIndex`\n\nEach Storage keeps track of the order that it receives documents, and assignes\neach doc a `localIndex` value which starts at 1 and increments from there with\nevery newly written doc.\n\nThis puts the documents in a nice stable linear order that can be used to\nreliably stream, and resume streaming, from the Storage.\n\nWhen we get a new version of a document, it gets a new `localIndex` and goes at\nthe end of the sequence, and the old version vanishes, leaving a gap in the\nsequence. It's ok that there are gaps.\n\nThe `localIndex` is particular to a certain IStorage. It's kept in the `Doc`\nobject but it's not really part of it; it's not included in the signature. It's\nthis IStorage's metadata about that document. When syncing, it's sent as one of\nthe \"extra fields\"\n[(newly added to the specification)](https://earthstar-docs.netlify.app/docs/reference/earthstar-specification/#extra-fields-for-syncing),\nobserved by the receiving peer, then discarded and overwritten with the\nreceiving peer's own latest `localIndex` number.\n\n#### Use cases\n\n1. Streaming sync between peers, which can be interrupted and resumed\n1. Layers and indexes that use a QueryFollower to subscribe to changes in a\n   Storage. These might store their indexes in localStorage, for example, and\n   would therefore want to resume indexing instead of starting over from\n   scratch.\n1. React components that need to know when to re-render\n\nFor use cases where the listener will never have any downtime, they don't really\nneed to be able to resume, they can just listen for events from the Storage\ninstead and it may be more efficient. For example a React component could listen\nfor events about a particular document instead of making a whole QueryFollower\nthat has to go through every single change to find changes to that particular\ndocument.\n\n#### Properties of the `localIndex` sequence\n\nThe docs, sorted by `localIndex` on a particular peer, have these properties:\n\n**Properties**\n\n1. The docs are in a stable order that does not change, except:\n1. Newly added or changed docs go at the end, increasing the highest\n   `localIndex` by 1.\n1. When a doc is updated (same author and same path, but newer timestamp), we\n   discard the old version. So we leave a gap in the sequence where the old\n   verison used to be, and the new version goes on the end of the sequence.\n1. The first doc has a `localIndex` of zero, unless it was later changed, in\n   which case there will be a gap at zero.\n\nWhy do all this? The goal is to be able to catch up to changes since the last\ntime we looked at a Storage. We can do that by remembering the highest\n`localIndex` we saw last time, and now getting all the docs later than that in\nthe sequence. We always read this sequence from old to new (in increasing order\nof `localIndex`.\n\nThere are not really any other nice properties about this sequence:\n\n**Downsides**\n\n1. The `localIndex` order is not sorted by `path`, `timestamp`, `author`, or any\n   other useful property. The order is jumbled because docs can be received in\n   any order during a sync, perhaps with multiple other peers simultaneously,\n   perhaps some using Sync Filters to only get some docs...\n1. The order is different on every peer (that's why it's \"local\").\n1. The history docs for a certain path will be in a jumbled order in the\n   `localIndex` sequence. The Latest doc for a path can be before or after the\n   other history docs. User of QueryFollowers will need some bookeeping to\n   remember which version is the Latest for each path, if they care (e.g. if\n   it's being used as an index and not just a sync mechanism between peers).\n1. When a doc is modified and the old one is deleted, leaving a gap, you do not\n   get notified about the gap. There is no pointer back to the gap, or anything.\n   Users of QueryFollowers are expected to have some kind of index so they can\n   notice that the new doc overwrites the old one, and delete the old one.\n1. When an ephemeral doc expires, it leaves a gap in the sequence but nothing is\n   added to the end of the sequence. Users of QueryFollowers are expected to pay\n   attention to expiration dates and delete ephemeral docs themselves. We may\n   also add an event on the Storage when a doc expires, but you could miss this\n   event if you were not listening at that moment, so you'll still have to check\n   for your own expired docs from time to time.\n1. QueryFollowers should always progress in the direction of increasing\n   `localIndex`. (They can start at 0, or the latest number, or anywhere in\n   between). This makes it simple to keep track of where to resume next time.\n   However this means we always process the oldest-received docs first, but the\n   user probably cares more about the recently-received docs.\n   - It would be possible with fancier bookeeping to make QueryFollowers that\n     track which intervals of the sequence they've visited, so they can work\n     from newest-to-oldest. But sometimes the oldest-received docs are the most\n     important (like usernames)...\n\n#### Querying by `localIndex`\n\nThis lets you easily resume where you left off. You can get batches of N docs at\na time if you want, using the `limit` option.\n\n```ts\nstorage.getDocsSinceLocalIndex(\n    startAt: LocalIndex,\n    limit?: number): Doc[];\n```\n\nThis is also how you tell a QueryFollower where to start in the sequence.\nQueryFollowers ignore the `limit` property though.\n\n(You can also still look up documents by path in the usual old way.)\n\n### Reliable streaming over the network, when syncing\n\n(Not implemented in this code yet)\n\nWhen we send docs over the network we will send the `localIndex` to help the\nother side track where they are in our own sequence. The other side will then\ndiscard the property and put their own `localIndex` on the document when they\nstore it.\n\nPeers will remember, for each other peer, which is the latest `localIndex`\nthey've seen from that peer, so they can resume syncing from there.\n\nThis is similar to how append-only logs are synced in Scuttlebutt and Hyper,\nexcept our logs have gaps.\n\n### Slightly different querying\n\nQuerying has been made more organized -- see the Query type in `types.ts`. It\nlooks a bit more like an SQL query but the pieces are written in the order they\nactually happen, so it's easier to understand.\n\nThe order is:\n\n- history (all or latest only)\n- orderBy\n- startAt (continue from a certain point)\n- filter - the same options, timestamp, pathStartswith, etc etc\n- limit\n\nAlso, the `cleanUpQuery` function is fancier and will also figure out if the\nquery will match `all`, `some`, or `nothing` documents. This helps with\noptimizations elsewhere.\n\n## Problems left to solve\n\n- Ephemeral documents disappear without leaving a trace, do we need events for\n  that?\n- An IStorage might significantly change or start over, by deleting most of its\n  local documents and choosing a different sync query. Then we'd need to tell\n  subscribers and peers that we're effectively a different IStorage now.\n  - localIndex could be a tuple `[generation, localIndex]` where generation is\n    an integer that increments on each big change like that\n  - or give each IStorage a UUID which gets randomly changed when big changes\n    happen. This would be helpful for other reasons too (to prevent echoing back\n    documents to the storage that just gave them back to us, we need to track\n    who gave them to us)\n- Syncing by `localIndex` doesn't work very well when you also have a sync\n  query, because you have to scan the entire sequence to find the couple of docs\n  you care about. We probably still want another way of efficient syncing that\n  goes in path order and uses hashing in some clever way, sort of like a Merkle\n  tree but not.\n\n## Other small improvements\n\n- The `Document` type is now named `Doc` to avoid collision with an existing\n  built-in Typescript type\n","readmeFilename":"README.md","gitHead":"938b8fcdbc89f028e7f59949e08f95e6376f8897","_id":"earthstar@10.0.0-alpha.2","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-t9dMX/i8N6CDYN2FbzZPM6kwSv6JIBGdd/4Dj2CtghR7QHo93CUE94I09k1sDTZY057HaF105/r5YMhxN38sRg==","shasum":"2c67bbd1cdad7c846f5ccfbdb4ca8f2e64b1de69","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.0.0-alpha.2.tgz","fileCount":222,"unpackedSize":899888,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIELCtn5MAwsmkQNKYtlU8C9kENuC+2BBRMbn1reeAmTpAiBSsF5nSoAf4OaSyQs3egzm305mrqGU2jIZ1kPbqnXCXw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjGg0sACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqhPg//b3cPv4jemMybymknFHtbm/Ait23aQsvenQ7395ZI9VznBXq/\r\nuX39BDWxwdBHvPzLVR2r7Uz/aOPgnY82XgfVetDC3O9GspD5pA3Tz+Rd2QkM\r\nBAHT/ILiSLjI+5ImQJ0UWh4C5eUZWXJ0+sFBSboWtCKvnPm1gzmDLaBf9CuD\r\noPuZiwEKEe3O1uO8vv1kzItilOTtFzmA2pM29b7xvgUGw6+T14BWNgeDhqDx\r\nje7iMpX+d/vVHkY5pVDorju6sJsfizu84BGE0aPBtj87zPq/eAWVnAI9KLLI\r\nZvWfmlrJ7jKPS1kb7e8bIfsfgoWkTUFD20i4TuGne4a3GzZzHT8aq/jPOI5w\r\nALXg0rHbxJ8cb7QnDlESOyLCyk8Boc7GdsSape+QMvF00uE0lkCFhrmcSllJ\r\ntZQK39GXiq2Ujf8nfHnIXkzYAQV4UknYxqumY8+t/Ldo3jk4J7m/f+3fd3Q6\r\np5rcnKpzfL3ufJ1H6xcdQChyclKvvjMzGJdVoyLF5pqd4C29y9l9oyoGiftG\r\nbe9XLqDEjf5KTIU7binzRoxmPAlRQfgaDWWnHHNRXF1e40iedxK6eQa09zCx\r\nHyTPa4+PKBFCEidu9i5Mt6rW158M09x2DmFi+8Bb+VVOfMAnFjuqFaWgCKb+\r\nacXKh8ZtGhXlcwyriC37LCieCeGWR2f5Olk=\r\n=+0NF\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.0.0-alpha.2_1662651692497_0.15884591207137255"},"_hasShrinkwrap":false},"10.0.0-alpha.3":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"10.0.0-alpha.3","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"16.11.37","chalk":"4.1.2","path-to-regexp":"6.2.1","ws":"8.8.1","@deno/shim-deno":"~0.9.0","@deno/shim-crypto":"~0.3.1","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/ws":"8.5.3"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","isomorphic-blob":"1.0.1","isomorphic-undici-ponyfill":"1.0.0","@sgwilym/isomorphic-streams":"1.0.4","isomorphic-ws":"5.0.0","textencoder-ponyfill":"1.0.2"},"readme":"# Earthstar\n\nSync stuff you care about with people you know. A specification and Javascript\nlibrary for building online tools you can truly call your own.Build\noffline-first, decentralised, and private network applications in the browser,\nserver, or command-line.\n\n**Clearly there's a lot to unpack, so check out\n[Earthstar's website](https://earthstar-project.org) for an introduction to\nEarthstar's concepts, an API tour, technical documentation, videos, and more!**\n\n## Usage\n\nTo use in Deno, add the following:\n\n```ts\nimport * as Earthstar from \"https://deno.land/x/earthstar/mod.ts\";\n```\n\nTo use with Node or apps built with NPM dependencies:\n\n```\nnpm i earthstar\n```\n\nAnd then import in your code:\n\n```ts\nimport * as Earthstar from \"earthstar\";\n```\n\n## Development\n\n### Setup\n\nYou will need Deno installed.\n[Instructions for installation can be found here](https://deno.land/#installation).\nYou may also want type-checking and linting from Deno for your IDE, which you\ncan get with extensions\n[like this one for VSCode](https://deno.land/manual@v1.17.2/vscode_deno).\n\nTo check that you've got everything set up correctly:\n\n`make example`\n\nThis will run the example script at `example-app.ts`, and you will see a lot of\ncolourful log messages from the app.\n\n### Scripts\n\nScripts are run with the `make` command.\n\n- `make test` - Run all tests\n- `make test-watch` - Run all tests in watch mode\n- `make fmt` - Format all code in the codebase\n- `make npm` - Create a NPM package in `npm` and run tests against it (requires\n  Node v14 or v16 to be installed).\n- `make bundle` - Create a bundled browser script at `earthstar.bundle.js`\n- `make depchart` - Regenerate the dependency chart images\n- `make coverage` - Generate code test coverage statistics\n- `make clean` - Delete generated files\n\n### Orientation\n\n- The entry for the package can be found at `mod.ts`.\n- Most external dependencies can be found in `deps.ts`. All other files import\n  external dependencies from this file.\n- Script definitions can be found in `Makefile`.\n- Tests are all in `src/test/`\n- The script for building the NPM package can be found in `scripts/build_npm.ts`\n\n### Uint8Arrays and Buffers\n\nWe use Uint8Arrays throughout the code to maximize platform support. Some of the\nnode-specific drivers use Buffers internally but the Buffers are converted to\nUint8Arrays before leaving those drivers.\n\nFor convenience, variables that hold Uint8Arrays are called \"bytes\", like\n`bytesToHash` instead of `uint8ArrayToHash`.\n\n`util/bytes.ts` has a bunch of helper code to do common operations on\nUint8Arrays and to convert them back and forth to strings and to Buffers.\n\n### Platform-specific tests\n\nDrivers are tested against the runtimes they're intended for. When tests are\nrun, they pull the correct scenarios from 'src/test/test-scenarios.ts', where\nthe current runtime is inferred during runtime.\n\n### Classes\n\nThe `Replica` is the main star of the show. Classes to the right are used\ninternally for its implementation. Classes to the left stack on top of an\n`Replica` to do extra things to it (subscribe to changes, cache data, etc).\n\nEach `Replica` holds the Docs for one Share.\n\n![](classes.png)\n\nNames starting with `I` are interfaces; there are one or multiple actual classes\nthat implement those interfaces.\n\nThe orange classes are \"drivers\" which have multiple implementations to choose\nfrom, for different platforms (node, browser, etc).\n\nBlue arrows show which functions call each other.\n\nThick black arrows show which classes have pointers to other classes when\nthey're running.\n\n### Source code dependency chart\n\nA --> B means \"file A imports file B\".\n\nFor readability this hides `/test/` and `/util/` and `*-types.ts`.\n\n![](depchart/depchart-no-types.png)\n\nAnd again with 3rd party dependencies as brown boxes with dotted lines, and\nincluding `*-types.ts`\n\n![](depchart/depchart-deps.png)\n\nRun `yarn depchart` to regenerate this. You'll need graphviz installed.\n\n### Platform-specific drivers\n\nThere are two parts of stone-soup which are swappable to support different\nplatforms or backends: `IReplica` and `IReplicaDriver`. Everything else should\nwork on all platforms.\n\nCrypto drivers:\n\n- `ReplicaDriverChloride` - only in browser, Node\n- `ReplicaDriverNode` - only in Node\n- `ReplicaDriverNoble` - universal\n\nStorage drivers:\n\n- `ReplicaDriverMemory` - univeral\n- `ReplicaDriverLocalStorage` - browser\n- `ReplicaDriverIndexedDB` - browser\n- `ReplicaDriverSqlite` - Node, Deno\n\nUsers of this library have to decide which of these drivers to import and use in\ntheir app.\n\n### Documentation\n\nWe use JSDoc for user documentation. You can view docs for the whole codebase at\nhttps://doc.deno.land/https://deno.land/x/stone_soup@v8.0.0/mod.ts, or by\nrunning the following from the root of the project:\n\n```\ndeno doc mod.ts\n```\n\nJSDocs are intended for end-users of the library. Comments for contributors\nworking with the codebase — e.g. notes on how something is implemented — are\nbetter as standard JS comments.\n\nIf possible, use a single line for the JSDoc. Example:\n\n```ts\n/** Does something great */\nexport function doSomething() {\n  // ...\n}\n```\n\nYou can use markdown inside of JSDoc block. While markdown supports HTML tags,\nit is forbidden in JSDoc blocks.\n\nCode string literals should be braced with the back-tick (\\`) instead of quotes.\nFor example:\n\n```ts\n/** Import something from the `earthstar` module. */\n```\n\nIt's not necessary to document function arguments unless an extra explanation is\nwarranted. Therefore `@param` should generally not be used. If `@param` is used,\nit should not include the `type` as TypeScript is already strongly typed.\n\n```ts\n/**\n * Function with non obvious param.\n * @param nonObvious Description of non obvious parameter.\n */\n```\n\nCode examples should utilize markdown format, like so:\n\n````ts\n/** A straight forward comment and an example:\n * ```ts\n * import { Crypto } from \"stone-soup\";\n * const keypair = Crypto.generateAuthorKeypair(\"suzy\");\n * ```\n */\n````\n\nCode examples should not contain additional comments and must not be indented.\nIt is already inside a comment. If it needs further comments it is not a good\nexample.\n\nExported functions should use the `function` keyword, and not be defined as\ninline functions assigned to variables. The main reason for this being that they\nare then correctly categorised as functions.\n\n### Publishing to NPM\n\n1. Run `make VERSION=\"version.number.here\" npm`, where `version.number.here` is\n   the desired version number for the package.\n2. `cd npm`\n3. `npm publish`\n\n## Changes from Earthstar v1\n\n### Splitting `Storage` into `Replica` and `ReplicaDriver` classes\n\nThink of this as `IStorageNiceAPIFullOfComplexity` and\n`IStorageSimpleLowLevelDriver`.\n\nI want to make it easier to add new kinds of storage so I'm splitting IStorage\ninto two parts:\n\nThe Storage does:\n\n- the complex annoying stuff we only want to write once\n- `set():` sign and add a document\n- `ingest():` validate and accept a document from the outside\n- user-friendly helper functions, getters, setters\n- an event bus that other things can subscribe to, like QueryFollowers\n\nThe StorageDriver does:\n\n- simple stuff, so we can make lots of drivers\n- query for documents (this is actually pretty complicated)\n- maintain indexes for querying (hopefully provided by the underlying storage\n  technology)\n- simple upsert of a document with no smartness\n\nPossibly even you can have multiple Storages for one Driver, for example when\nyou're using multiple tabs with indexedDb or localStorage.\n\n### \"Reliable indexing / streaming\"\n\nThis shows an implementation of the \"reliable indexing\" idea discussed in\n[this issue](https://github.com/earthstar-project/earthstar/issues/66).\n\n#### The problem\n\nWe have livestreaming now, over the network and also to local subscribers, all\nbased on `onWrite` events.\n\nIf you miss some events, you can't recover -- you have to do a full batch\ndownload of every document.\n\nEvents also don't tell you what was overwritten, which you might need to know to\nupdate a Layer or index.\n\n#### The solution: `localIndex`\n\nEach Storage keeps track of the order that it receives documents, and assignes\neach doc a `localIndex` value which starts at 1 and increments from there with\nevery newly written doc.\n\nThis puts the documents in a nice stable linear order that can be used to\nreliably stream, and resume streaming, from the Storage.\n\nWhen we get a new version of a document, it gets a new `localIndex` and goes at\nthe end of the sequence, and the old version vanishes, leaving a gap in the\nsequence. It's ok that there are gaps.\n\nThe `localIndex` is particular to a certain IStorage. It's kept in the `Doc`\nobject but it's not really part of it; it's not included in the signature. It's\nthis IStorage's metadata about that document. When syncing, it's sent as one of\nthe \"extra fields\"\n[(newly added to the specification)](https://earthstar-docs.netlify.app/docs/reference/earthstar-specification/#extra-fields-for-syncing),\nobserved by the receiving peer, then discarded and overwritten with the\nreceiving peer's own latest `localIndex` number.\n\n#### Use cases\n\n1. Streaming sync between peers, which can be interrupted and resumed\n1. Layers and indexes that use a QueryFollower to subscribe to changes in a\n   Storage. These might store their indexes in localStorage, for example, and\n   would therefore want to resume indexing instead of starting over from\n   scratch.\n1. React components that need to know when to re-render\n\nFor use cases where the listener will never have any downtime, they don't really\nneed to be able to resume, they can just listen for events from the Storage\ninstead and it may be more efficient. For example a React component could listen\nfor events about a particular document instead of making a whole QueryFollower\nthat has to go through every single change to find changes to that particular\ndocument.\n\n#### Properties of the `localIndex` sequence\n\nThe docs, sorted by `localIndex` on a particular peer, have these properties:\n\n**Properties**\n\n1. The docs are in a stable order that does not change, except:\n1. Newly added or changed docs go at the end, increasing the highest\n   `localIndex` by 1.\n1. When a doc is updated (same author and same path, but newer timestamp), we\n   discard the old version. So we leave a gap in the sequence where the old\n   verison used to be, and the new version goes on the end of the sequence.\n1. The first doc has a `localIndex` of zero, unless it was later changed, in\n   which case there will be a gap at zero.\n\nWhy do all this? The goal is to be able to catch up to changes since the last\ntime we looked at a Storage. We can do that by remembering the highest\n`localIndex` we saw last time, and now getting all the docs later than that in\nthe sequence. We always read this sequence from old to new (in increasing order\nof `localIndex`.\n\nThere are not really any other nice properties about this sequence:\n\n**Downsides**\n\n1. The `localIndex` order is not sorted by `path`, `timestamp`, `author`, or any\n   other useful property. The order is jumbled because docs can be received in\n   any order during a sync, perhaps with multiple other peers simultaneously,\n   perhaps some using Sync Filters to only get some docs...\n1. The order is different on every peer (that's why it's \"local\").\n1. The history docs for a certain path will be in a jumbled order in the\n   `localIndex` sequence. The Latest doc for a path can be before or after the\n   other history docs. User of QueryFollowers will need some bookeeping to\n   remember which version is the Latest for each path, if they care (e.g. if\n   it's being used as an index and not just a sync mechanism between peers).\n1. When a doc is modified and the old one is deleted, leaving a gap, you do not\n   get notified about the gap. There is no pointer back to the gap, or anything.\n   Users of QueryFollowers are expected to have some kind of index so they can\n   notice that the new doc overwrites the old one, and delete the old one.\n1. When an ephemeral doc expires, it leaves a gap in the sequence but nothing is\n   added to the end of the sequence. Users of QueryFollowers are expected to pay\n   attention to expiration dates and delete ephemeral docs themselves. We may\n   also add an event on the Storage when a doc expires, but you could miss this\n   event if you were not listening at that moment, so you'll still have to check\n   for your own expired docs from time to time.\n1. QueryFollowers should always progress in the direction of increasing\n   `localIndex`. (They can start at 0, or the latest number, or anywhere in\n   between). This makes it simple to keep track of where to resume next time.\n   However this means we always process the oldest-received docs first, but the\n   user probably cares more about the recently-received docs.\n   - It would be possible with fancier bookeeping to make QueryFollowers that\n     track which intervals of the sequence they've visited, so they can work\n     from newest-to-oldest. But sometimes the oldest-received docs are the most\n     important (like usernames)...\n\n#### Querying by `localIndex`\n\nThis lets you easily resume where you left off. You can get batches of N docs at\na time if you want, using the `limit` option.\n\n```ts\nstorage.getDocsSinceLocalIndex(\n    startAt: LocalIndex,\n    limit?: number): Doc[];\n```\n\nThis is also how you tell a QueryFollower where to start in the sequence.\nQueryFollowers ignore the `limit` property though.\n\n(You can also still look up documents by path in the usual old way.)\n\n### Reliable streaming over the network, when syncing\n\n(Not implemented in this code yet)\n\nWhen we send docs over the network we will send the `localIndex` to help the\nother side track where they are in our own sequence. The other side will then\ndiscard the property and put their own `localIndex` on the document when they\nstore it.\n\nPeers will remember, for each other peer, which is the latest `localIndex`\nthey've seen from that peer, so they can resume syncing from there.\n\nThis is similar to how append-only logs are synced in Scuttlebutt and Hyper,\nexcept our logs have gaps.\n\n### Slightly different querying\n\nQuerying has been made more organized -- see the Query type in `types.ts`. It\nlooks a bit more like an SQL query but the pieces are written in the order they\nactually happen, so it's easier to understand.\n\nThe order is:\n\n- history (all or latest only)\n- orderBy\n- startAt (continue from a certain point)\n- filter - the same options, timestamp, pathStartswith, etc etc\n- limit\n\nAlso, the `cleanUpQuery` function is fancier and will also figure out if the\nquery will match `all`, `some`, or `nothing` documents. This helps with\noptimizations elsewhere.\n\n## Problems left to solve\n\n- Ephemeral documents disappear without leaving a trace, do we need events for\n  that?\n- An IStorage might significantly change or start over, by deleting most of its\n  local documents and choosing a different sync query. Then we'd need to tell\n  subscribers and peers that we're effectively a different IStorage now.\n  - localIndex could be a tuple `[generation, localIndex]` where generation is\n    an integer that increments on each big change like that\n  - or give each IStorage a UUID which gets randomly changed when big changes\n    happen. This would be helpful for other reasons too (to prevent echoing back\n    documents to the storage that just gave them back to us, we need to track\n    who gave them to us)\n- Syncing by `localIndex` doesn't work very well when you also have a sync\n  query, because you have to scan the entire sequence to find the couple of docs\n  you care about. We probably still want another way of efficient syncing that\n  goes in path order and uses hashing in some clever way, sort of like a Merkle\n  tree but not.\n\n## Other small improvements\n\n- The `Document` type is now named `Doc` to avoid collision with an existing\n  built-in Typescript type\n","readmeFilename":"README.md","gitHead":"33d604942fa26ae5cdde30c1238b78cd32522387","_id":"earthstar@10.0.0-alpha.3","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-jsieSIs+NHDYwSpzWVu93BNp5qaBB/aIvobqFxVrk57zThVUhHyfrVvnsELuROaIgf6npu4+AvUqZY+5uocb3A==","shasum":"e4f0a644ac112aee2170443009c94eba767606f0","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.0.0-alpha.3.tgz","fileCount":225,"unpackedSize":911606,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDO4QoNVV9yeTbt7LXea+ig4ef/ndKUZJqydyObCRdcIAiEAl5PGYqsS53oSqJMu+ZME2CxqsPN4cXfjFuG9JJphgHM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjMuuDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqQMg/9EMXkerb3KwqwBGEDvltIm+BmxkrAH1pI6FFBhR5mJ9JUwbwd\r\n4a1gROMvRxg8r1ZsslH88pjEGMRYKqoFAYHelTfKVHhIcEyy2tQItW0nV+gF\r\nGcm4i+Msya+X4Kun+xosP1UYbzDYnox+OJvdUJs0kps7KAjLCaz3qsYrcRet\r\npaRD3boos0nQg3bd43CuOhE67p8H0tsDAHFb6lSp/tqKRl4jcfGpmR+4EIHm\r\njfkVbjbhhsuSjSdPp2X7m/5jCVSFUp2Pob+KASPrDqO82U9iID5d20oed6/V\r\n3+4BfAhautatV1QSKorSINkfckXGqMYD4Qa2d+vOSSCQhyn6SWvaDbqL39O4\r\nu5EQGiWnpgJ4Pdy6tMUMFQZG7NtGFnQi3TLGts34Dhe20TyFt4XOmLOl3kSZ\r\nl/szwHSTQNAzhei4DD15aVZRYIJCkVK5tkHmx11k6fIh+pc78y16BrEjkIvX\r\ni+ogXwDibtF605TRuiJYcrUTieae2+bljoJr603Yq5cGQPSD0nqVSPWNgzy3\r\nTqsbxxHDLN+oA7IED7P/eMYKeirmHQ9rnde8BYmfhpnc67ihWhE7Nb4l75di\r\nbrhJLnXPK4TCNnQJGNfx3pYGRQX7fADW+/9PyRh8X8AbulTL4EbK+HgsXire\r\nzBftk1UgNLD/77BiT0Ei1HtdbN8/LWLW0/s=\r\n=GRxW\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.0.0-alpha.3_1664281474841_0.010818795036646067"},"_hasShrinkwrap":false},"9.3.3":{"version":"9.3.3","module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","engines":{"node":">=14.19.1"},"description":"Earthstar is a specification and Javascript library for building online tools you can truly call your own.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"16.11.26","chalk":"4.1.2","express":"4.17.2","@deno/shim-deno-test":"~0.3.2","@types/better-sqlite3":"7.4.2","@types/express":"4.17.13","@types/chloride":"2.4.0","@types/node-fetch":"2.5.12"},"exports":{".":{"import":"./esm/src/entries/universal.js","require":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"./node":{"import":"./esm/src/entries/node.js","require":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"./browser":{"import":"./esm/src/entries/browser.js","require":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.4.0","better-sqlite3":"7.5.0","chloride":"2.4.1","concurrency-friends":"5.2.0","earthstar-streaming-rpc":"5.0.1","fast-deep-equal":"3.1.3","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0"},"gitHead":"54860154e8f85528f1a533f1b56604c20ad00860","_id":"earthstar@9.3.3","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-ZQ+4z9As+zJwJmJlP10B4j7McFUz6mBamlrJT6lVFdlhGtuPT1l97bz3G1cXqmntUfmtsdjJAmOjJh+j4dlB2Q==","shasum":"74d814c2776d0ace13ab7c91d7da510f0cef6181","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-9.3.3.tgz","fileCount":159,"unpackedSize":589275,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD9pX5T50YlbpQ2nfjXz+eeso8rSd6qoVS7/CDF6QKuBQIgboU9gMwdzmZUR9mXTB+zIqZgkueD89AkrzvWSgRiD9o="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjOqQNACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqd1w//YznsIzxlWUvCmo1fxegvHBddcDDfyTN+wfmBueVv/R36QrrY\r\nGevACKQTfEDIz2sG0x86Nvljj84TCwKtdz8yciHmnmq3eYMtR2lzsoF//ij+\r\n82nvIMlzlsa3F+hcWiW+5aDOaMye5QwMxWUN3fiNvkv0258RVB9Pkv88bH+r\r\nrkF60e4H3H7mrCEXbcycq6s05LdJS52MUCFnrA7uHxattpafewBrDMuImcSv\r\nNujobhmyNKEb1bKixDNjfBJj6rOvLSjhLUzb/1LfgAtsNUpd/bggtzxXAUCp\r\n+WRdKBUNX6kSD0w2cMoYBXQPHLIGHmYk6o5JyEs5cQKKaxhaTHY1e6H9kfmu\r\nEk4ywT72hnJspQx+hyPozucBsK15hViQE7sWX4nx09UwNBIXsGfehuesdQb7\r\nbspqgqXU3Emkug/YQDi+pKE0DH3NJXYEhFEEvsp7g0KTMx/xQxVF3/M0TeQm\r\nhtnO/Ht1i/LiJx8p5lK+jHtSqeV5FCv35Lv33o+5PpL3kLNH1MYYLtKZwX9W\r\nWRcSjLdLZXXkm4HaI/GmaY3PZM3TLRNIU39qL+uaIjUUv1gDxTcVbTtxXazY\r\nkHnzyGZdeGnmtMukqv3Vhi4xO64CEK2p4HO9O6fHW7NKKufGWzGBE0sUji1B\r\nq7aaK+YLWezInc48Zl+Slia98VqZ5fkeObM=\r\n=Ctow\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_9.3.3_1664787469071_0.02551083560009304"},"_hasShrinkwrap":false},"10.0.0-alpha.4":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"10.0.0-alpha.4","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"16.11.37","chalk":"4.1.2","get-port":"5.1.1","path-to-regexp":"6.2.1","ws":"8.8.1","@deno/shim-deno":"~0.10.0","@deno/shim-crypto":"~0.3.1","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/ws":"8.5.3"},"exports":{".":{"import":{"default":"./esm/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"require":{"default":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"}},"./node":{"import":{"default":"./esm/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"require":{"default":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"}},"./browser":{"import":{"default":"./esm/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"},"require":{"default":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","isomorphic-blob":"1.0.1","isomorphic-undici-ponyfill":"1.0.0","@sgwilym/isomorphic-streams":"1.0.4","isomorphic-ws":"5.0.0","textencoder-ponyfill":"1.0.2"},"readme":"# Earthstar\n\nSync stuff you care about with people you know. A specification and Javascript\nlibrary for building online tools you can truly call your own.Build\noffline-first, decentralised, and private network applications in the browser,\nserver, or command-line.\n\n**Clearly there's a lot to unpack, so check out\n[Earthstar's website](https://earthstar-project.org) for an introduction to\nEarthstar's concepts, an API tour, technical documentation, videos, and more!**\n\n## Usage\n\nTo use in Deno, add the following:\n\n```ts\nimport * as Earthstar from \"https://deno.land/x/earthstar/mod.ts\";\n```\n\nTo use with Node or apps built with NPM dependencies:\n\n```\nnpm i earthstar\n```\n\nAnd then import in your code:\n\n```ts\nimport * as Earthstar from \"earthstar\";\n```\n\n## Development\n\n### Setup\n\nYou will need Deno installed.\n[Instructions for installation can be found here](https://deno.land/#installation).\nYou may also want type-checking and linting from Deno for your IDE, which you\ncan get with extensions\n[like this one for VSCode](https://deno.land/manual@v1.17.2/vscode_deno).\n\nTo check that you've got everything set up correctly:\n\n`make example`\n\nThis will run the example script at `example-app.ts`, and you will see a lot of\ncolourful log messages from the app.\n\n### Scripts\n\nScripts are run with the `make` command.\n\n- `make test` - Run all tests\n- `make test-watch` - Run all tests in watch mode\n- `make fmt` - Format all code in the codebase\n- `make npm` - Create a NPM package in `npm` and run tests against it (requires\n  Node v14 or v16 to be installed).\n- `make bundle` - Create a bundled browser script at `earthstar.bundle.js`\n- `make depchart` - Regenerate the dependency chart images\n- `make coverage` - Generate code test coverage statistics\n- `make clean` - Delete generated files\n\n### Orientation\n\n- The entry for the package can be found at `mod.ts`.\n- Most external dependencies can be found in `deps.ts`. All other files import\n  external dependencies from this file.\n- Script definitions can be found in `Makefile`.\n- Tests are all in `src/test/`\n- The script for building the NPM package can be found in `scripts/build_npm.ts`\n\n### Uint8Arrays and Buffers\n\nWe use Uint8Arrays throughout the code to maximize platform support. Some of the\nnode-specific drivers use Buffers internally but the Buffers are converted to\nUint8Arrays before leaving those drivers.\n\nFor convenience, variables that hold Uint8Arrays are called \"bytes\", like\n`bytesToHash` instead of `uint8ArrayToHash`.\n\n`util/bytes.ts` has a bunch of helper code to do common operations on\nUint8Arrays and to convert them back and forth to strings and to Buffers.\n\n### Platform-specific tests\n\nDrivers are tested against the runtimes they're intended for. When tests are\nrun, they pull the correct scenarios from 'src/test/test-scenarios.ts', where\nthe current runtime is inferred during runtime.\n\n### Classes\n\nThe `Replica` is the main star of the show. Classes to the right are used\ninternally for its implementation. Classes to the left stack on top of an\n`Replica` to do extra things to it (subscribe to changes, cache data, etc).\n\nEach `Replica` holds the Docs for one Share.\n\n![](classes.png)\n\nNames starting with `I` are interfaces; there are one or multiple actual classes\nthat implement those interfaces.\n\nThe orange classes are \"drivers\" which have multiple implementations to choose\nfrom, for different platforms (node, browser, etc).\n\nBlue arrows show which functions call each other.\n\nThick black arrows show which classes have pointers to other classes when\nthey're running.\n\n### Source code dependency chart\n\nA --> B means \"file A imports file B\".\n\nFor readability this hides `/test/` and `/util/` and `*-types.ts`.\n\n![](depchart/depchart-no-types.png)\n\nAnd again with 3rd party dependencies as brown boxes with dotted lines, and\nincluding `*-types.ts`\n\n![](depchart/depchart-deps.png)\n\nRun `yarn depchart` to regenerate this. You'll need graphviz installed.\n\n### Platform-specific drivers\n\nThere are two parts of stone-soup which are swappable to support different\nplatforms or backends: `IReplica` and `IReplicaDriver`. Everything else should\nwork on all platforms.\n\nCrypto drivers:\n\n- `ReplicaDriverChloride` - only in browser, Node\n- `ReplicaDriverNode` - only in Node\n- `ReplicaDriverNoble` - universal\n\nStorage drivers:\n\n- `ReplicaDriverMemory` - univeral\n- `ReplicaDriverLocalStorage` - browser\n- `ReplicaDriverIndexedDB` - browser\n- `ReplicaDriverSqlite` - Node, Deno\n\nUsers of this library have to decide which of these drivers to import and use in\ntheir app.\n\n### Documentation\n\nWe use JSDoc for user documentation. You can view docs for the whole codebase at\nhttps://doc.deno.land/https://deno.land/x/stone_soup@v8.0.0/mod.ts, or by\nrunning the following from the root of the project:\n\n```\ndeno doc mod.ts\n```\n\nJSDocs are intended for end-users of the library. Comments for contributors\nworking with the codebase — e.g. notes on how something is implemented — are\nbetter as standard JS comments.\n\nIf possible, use a single line for the JSDoc. Example:\n\n```ts\n/** Does something great */\nexport function doSomething() {\n  // ...\n}\n```\n\nYou can use markdown inside of JSDoc block. While markdown supports HTML tags,\nit is forbidden in JSDoc blocks.\n\nCode string literals should be braced with the back-tick (\\`) instead of quotes.\nFor example:\n\n```ts\n/** Import something from the `earthstar` module. */\n```\n\nIt's not necessary to document function arguments unless an extra explanation is\nwarranted. Therefore `@param` should generally not be used. If `@param` is used,\nit should not include the `type` as TypeScript is already strongly typed.\n\n```ts\n/**\n * Function with non obvious param.\n * @param nonObvious Description of non obvious parameter.\n */\n```\n\nCode examples should utilize markdown format, like so:\n\n````ts\n/** A straight forward comment and an example:\n * ```ts\n * import { Crypto } from \"stone-soup\";\n * const keypair = Crypto.generateAuthorKeypair(\"suzy\");\n * ```\n */\n````\n\nCode examples should not contain additional comments and must not be indented.\nIt is already inside a comment. If it needs further comments it is not a good\nexample.\n\nExported functions should use the `function` keyword, and not be defined as\ninline functions assigned to variables. The main reason for this being that they\nare then correctly categorised as functions.\n\n### Publishing to NPM\n\n1. Run `make VERSION=\"version.number.here\" npm`, where `version.number.here` is\n   the desired version number for the package.\n2. `cd npm`\n3. `npm publish`\n\n## Changes from Earthstar v1\n\n### Splitting `Storage` into `Replica` and `ReplicaDriver` classes\n\nThink of this as `IStorageNiceAPIFullOfComplexity` and\n`IStorageSimpleLowLevelDriver`.\n\nI want to make it easier to add new kinds of storage so I'm splitting IStorage\ninto two parts:\n\nThe Storage does:\n\n- the complex annoying stuff we only want to write once\n- `set():` sign and add a document\n- `ingest():` validate and accept a document from the outside\n- user-friendly helper functions, getters, setters\n- an event bus that other things can subscribe to, like QueryFollowers\n\nThe StorageDriver does:\n\n- simple stuff, so we can make lots of drivers\n- query for documents (this is actually pretty complicated)\n- maintain indexes for querying (hopefully provided by the underlying storage\n  technology)\n- simple upsert of a document with no smartness\n\nPossibly even you can have multiple Storages for one Driver, for example when\nyou're using multiple tabs with indexedDb or localStorage.\n\n### \"Reliable indexing / streaming\"\n\nThis shows an implementation of the \"reliable indexing\" idea discussed in\n[this issue](https://github.com/earthstar-project/earthstar/issues/66).\n\n#### The problem\n\nWe have livestreaming now, over the network and also to local subscribers, all\nbased on `onWrite` events.\n\nIf you miss some events, you can't recover -- you have to do a full batch\ndownload of every document.\n\nEvents also don't tell you what was overwritten, which you might need to know to\nupdate a Layer or index.\n\n#### The solution: `localIndex`\n\nEach Storage keeps track of the order that it receives documents, and assignes\neach doc a `localIndex` value which starts at 1 and increments from there with\nevery newly written doc.\n\nThis puts the documents in a nice stable linear order that can be used to\nreliably stream, and resume streaming, from the Storage.\n\nWhen we get a new version of a document, it gets a new `localIndex` and goes at\nthe end of the sequence, and the old version vanishes, leaving a gap in the\nsequence. It's ok that there are gaps.\n\nThe `localIndex` is particular to a certain IStorage. It's kept in the `Doc`\nobject but it's not really part of it; it's not included in the signature. It's\nthis IStorage's metadata about that document. When syncing, it's sent as one of\nthe \"extra fields\"\n[(newly added to the specification)](https://earthstar-docs.netlify.app/docs/reference/earthstar-specification/#extra-fields-for-syncing),\nobserved by the receiving peer, then discarded and overwritten with the\nreceiving peer's own latest `localIndex` number.\n\n#### Use cases\n\n1. Streaming sync between peers, which can be interrupted and resumed\n1. Layers and indexes that use a QueryFollower to subscribe to changes in a\n   Storage. These might store their indexes in localStorage, for example, and\n   would therefore want to resume indexing instead of starting over from\n   scratch.\n1. React components that need to know when to re-render\n\nFor use cases where the listener will never have any downtime, they don't really\nneed to be able to resume, they can just listen for events from the Storage\ninstead and it may be more efficient. For example a React component could listen\nfor events about a particular document instead of making a whole QueryFollower\nthat has to go through every single change to find changes to that particular\ndocument.\n\n#### Properties of the `localIndex` sequence\n\nThe docs, sorted by `localIndex` on a particular peer, have these properties:\n\n**Properties**\n\n1. The docs are in a stable order that does not change, except:\n1. Newly added or changed docs go at the end, increasing the highest\n   `localIndex` by 1.\n1. When a doc is updated (same author and same path, but newer timestamp), we\n   discard the old version. So we leave a gap in the sequence where the old\n   verison used to be, and the new version goes on the end of the sequence.\n1. The first doc has a `localIndex` of zero, unless it was later changed, in\n   which case there will be a gap at zero.\n\nWhy do all this? The goal is to be able to catch up to changes since the last\ntime we looked at a Storage. We can do that by remembering the highest\n`localIndex` we saw last time, and now getting all the docs later than that in\nthe sequence. We always read this sequence from old to new (in increasing order\nof `localIndex`.\n\nThere are not really any other nice properties about this sequence:\n\n**Downsides**\n\n1. The `localIndex` order is not sorted by `path`, `timestamp`, `author`, or any\n   other useful property. The order is jumbled because docs can be received in\n   any order during a sync, perhaps with multiple other peers simultaneously,\n   perhaps some using Sync Filters to only get some docs...\n1. The order is different on every peer (that's why it's \"local\").\n1. The history docs for a certain path will be in a jumbled order in the\n   `localIndex` sequence. The Latest doc for a path can be before or after the\n   other history docs. User of QueryFollowers will need some bookeeping to\n   remember which version is the Latest for each path, if they care (e.g. if\n   it's being used as an index and not just a sync mechanism between peers).\n1. When a doc is modified and the old one is deleted, leaving a gap, you do not\n   get notified about the gap. There is no pointer back to the gap, or anything.\n   Users of QueryFollowers are expected to have some kind of index so they can\n   notice that the new doc overwrites the old one, and delete the old one.\n1. When an ephemeral doc expires, it leaves a gap in the sequence but nothing is\n   added to the end of the sequence. Users of QueryFollowers are expected to pay\n   attention to expiration dates and delete ephemeral docs themselves. We may\n   also add an event on the Storage when a doc expires, but you could miss this\n   event if you were not listening at that moment, so you'll still have to check\n   for your own expired docs from time to time.\n1. QueryFollowers should always progress in the direction of increasing\n   `localIndex`. (They can start at 0, or the latest number, or anywhere in\n   between). This makes it simple to keep track of where to resume next time.\n   However this means we always process the oldest-received docs first, but the\n   user probably cares more about the recently-received docs.\n   - It would be possible with fancier bookeeping to make QueryFollowers that\n     track which intervals of the sequence they've visited, so they can work\n     from newest-to-oldest. But sometimes the oldest-received docs are the most\n     important (like usernames)...\n\n#### Querying by `localIndex`\n\nThis lets you easily resume where you left off. You can get batches of N docs at\na time if you want, using the `limit` option.\n\n```ts\nstorage.getDocsSinceLocalIndex(\n    startAt: LocalIndex,\n    limit?: number): Doc[];\n```\n\nThis is also how you tell a QueryFollower where to start in the sequence.\nQueryFollowers ignore the `limit` property though.\n\n(You can also still look up documents by path in the usual old way.)\n\n### Reliable streaming over the network, when syncing\n\n(Not implemented in this code yet)\n\nWhen we send docs over the network we will send the `localIndex` to help the\nother side track where they are in our own sequence. The other side will then\ndiscard the property and put their own `localIndex` on the document when they\nstore it.\n\nPeers will remember, for each other peer, which is the latest `localIndex`\nthey've seen from that peer, so they can resume syncing from there.\n\nThis is similar to how append-only logs are synced in Scuttlebutt and Hyper,\nexcept our logs have gaps.\n\n### Slightly different querying\n\nQuerying has been made more organized -- see the Query type in `types.ts`. It\nlooks a bit more like an SQL query but the pieces are written in the order they\nactually happen, so it's easier to understand.\n\nThe order is:\n\n- history (all or latest only)\n- orderBy\n- startAt (continue from a certain point)\n- filter - the same options, timestamp, pathStartswith, etc etc\n- limit\n\nAlso, the `cleanUpQuery` function is fancier and will also figure out if the\nquery will match `all`, `some`, or `nothing` documents. This helps with\noptimizations elsewhere.\n\n## Problems left to solve\n\n- Ephemeral documents disappear without leaving a trace, do we need events for\n  that?\n- An IStorage might significantly change or start over, by deleting most of its\n  local documents and choosing a different sync query. Then we'd need to tell\n  subscribers and peers that we're effectively a different IStorage now.\n  - localIndex could be a tuple `[generation, localIndex]` where generation is\n    an integer that increments on each big change like that\n  - or give each IStorage a UUID which gets randomly changed when big changes\n    happen. This would be helpful for other reasons too (to prevent echoing back\n    documents to the storage that just gave them back to us, we need to track\n    who gave them to us)\n- Syncing by `localIndex` doesn't work very well when you also have a sync\n  query, because you have to scan the entire sequence to find the couple of docs\n  you care about. We probably still want another way of efficient syncing that\n  goes in path order and uses hashing in some clever way, sort of like a Merkle\n  tree but not.\n\n## Other small improvements\n\n- The `Document` type is now named `Doc` to avoid collision with an existing\n  built-in Typescript type\n","readmeFilename":"README.md","gitHead":"c1426e932b638ef5ece2cb220c1c32cac9a00b01","_id":"earthstar@10.0.0-alpha.4","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-egdNwzMzlmNB9FL3a/awts71aFpUz3iG05aXYTH3Of8EtIaQLa0gxtUHgPxrPzO+/dEww7BXOL2MDmRFzT8xDw==","shasum":"896bbce5733311f40d6c329b69d4d7a3b4cecc64","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.0.0-alpha.4.tgz","fileCount":279,"unpackedSize":1120192,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICUYgUXf9Gt9jvdr2jvCbweVHoQ6sEadOKIUpAJUkrd5AiAT+Ujl0e1jOa6otUS47+LQ/FxmJvXl+W2FEsumSAAmRw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjd3++ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoOFA//TONSY1MqSkHBNMDmAGUZG414jBynx7FbMeg/JuPnRPVqQBor\r\nU0D7ZtI2ritSktGBGIWKHVCaFLrwEp3957ixEJAZg1ygT45zOdPMjYJKAK1p\r\nPMt7L+ozyfmz7I8uff0zfsiFPuRrkFPDRLh5vT43T1g8iHOIngy5pHr34IAR\r\nGXZVrCsfZiDqyNcqQYt3OHR69rXNFhfD0yLBxYE/1zrIxTSDkSrgIaosNR0+\r\nso1QRNojsZRdJ/qDfgmKMfp7OHHudThUEifNaCtRxgGlvW5FHX14OfrmJt3I\r\nlklThi4QWRMDBAGQtEtlzzwsn9bYmSe1bF3eDlNH/Rxax5rN7OiNc/9+LrN5\r\nQUaDZSEXfuN/OH/oHVkyobpofRmDGj1JewhCBx1uiqTIdPogu8y782KPwKUb\r\nWaZgzYccTBmhAyOxVIZvo0rdsIN5CuLJsGHmjSNowTUBd4m7BvJLMu0WFWv/\r\nyGLXvIavHJO6x3pYcM06onADXirpu4SjHOruwWtcDt0S7lBGDbRssHUH6B8/\r\npJmntou12H5D/Esty3BgrSsXLsJoNBYYXliKxjf+WTW3cLiC681S8X3NjdG7\r\n4FuqrPwuuTY6Dw3pBuhR5ZxLqtPqtKvY9nk7GrnDrEydaeTMFDKhFg6Btl6N\r\nFF8MU2Cu9a+bGEmEFefth9a84FIjoB8w10k=\r\n=gENB\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.0.0-alpha.4_1668775870748_0.02110451620501519"},"_hasShrinkwrap":false},"10.0.0-beta.1":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"10.0.0-beta.1","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"16.11.37","chalk":"4.1.2","get-port":"5.1.1","path-to-regexp":"6.2.1","ws":"8.8.1","@deno/shim-deno":"~0.10.0","@deno/shim-crypto":"~0.3.1","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/ws":"8.5.3"},"exports":{".":{"import":{"default":"./esm/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"require":{"default":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"}},"./node":{"import":{"default":"./esm/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"require":{"default":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"}},"./browser":{"import":{"default":"./esm/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"},"require":{"default":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","isomorphic-blob":"1.0.1","isomorphic-undici-ponyfill":"1.0.0","@sgwilym/isomorphic-streams":"1.0.4","isomorphic-ws":"5.0.0","textencoder-ponyfill":"1.0.2"},"readme":"# Earthstar\n\nSync stuff you care about with people you know. A specification and Javascript\nlibrary for building online tools you can truly call your own.Build\noffline-first, decentralised, and private network applications in the browser,\nserver, or command-line.\n\n**Clearly there's a lot to unpack, so check out\n[Earthstar's website](https://earthstar-project.org) for an introduction to\nEarthstar's concepts, an API tour, technical documentation, videos, and more!**\n\n## Usage\n\nTo use in Deno, add the following:\n\n```ts\nimport * as Earthstar from \"https://deno.land/x/earthstar/mod.ts\";\n```\n\nTo use with Node or apps built with NPM dependencies:\n\n```\nnpm i earthstar\n```\n\nAnd then import in your code:\n\n```ts\nimport * as Earthstar from \"earthstar\";\n```\n\n## Development\n\n### Setup\n\nYou will need Deno installed.\n[Instructions for installation can be found here](https://deno.land/#installation).\nYou may also want type-checking and linting from Deno for your IDE, which you\ncan get with extensions\n[like this one for VSCode](https://deno.land/manual@v1.17.2/vscode_deno).\n\nTo check that you've got everything set up correctly:\n\n`make example`\n\nThis will run the example script at `example-app.ts`, and you will see a lot of\ncolourful log messages from the app.\n\n### Scripts\n\nScripts are run with the `make` command.\n\n- `make test` - Run all tests\n- `make test-watch` - Run all tests in watch mode\n- `make fmt` - Format all code in the codebase\n- `make npm` - Create a NPM package in `npm` and run tests against it (requires\n  Node v14 or v16 to be installed).\n- `make bundle` - Create a bundled browser script at `earthstar.bundle.js`\n- `make depchart` - Regenerate the dependency chart images\n- `make coverage` - Generate code test coverage statistics\n- `make clean` - Delete generated files\n\n### Orientation\n\n- The entry for the package can be found at `mod.ts`.\n- Most external dependencies can be found in `deps.ts`. All other files import\n  external dependencies from this file.\n- Script definitions can be found in `Makefile`.\n- Tests are all in `src/test/`\n- The script for building the NPM package can be found in `scripts/build_npm.ts`\n\n### Uint8Arrays and Buffers\n\nWe use Uint8Arrays throughout the code to maximize platform support. Some of the\nnode-specific drivers use Buffers internally but the Buffers are converted to\nUint8Arrays before leaving those drivers.\n\nFor convenience, variables that hold Uint8Arrays are called \"bytes\", like\n`bytesToHash` instead of `uint8ArrayToHash`.\n\n`util/bytes.ts` has a bunch of helper code to do common operations on\nUint8Arrays and to convert them back and forth to strings and to Buffers.\n\n### Platform-specific tests\n\nDrivers are tested against the runtimes they're intended for. When tests are\nrun, they pull the correct scenarios from 'src/test/test-scenarios.ts', where\nthe current runtime is inferred during runtime.\n\n### Classes\n\nThe `Replica` is the main star of the show. Classes to the right are used\ninternally for its implementation. Classes to the left stack on top of an\n`Replica` to do extra things to it (subscribe to changes, cache data, etc).\n\nEach `Replica` holds the Docs for one Share.\n\n![](classes.png)\n\nNames starting with `I` are interfaces; there are one or multiple actual classes\nthat implement those interfaces.\n\nThe orange classes are \"drivers\" which have multiple implementations to choose\nfrom, for different platforms (node, browser, etc).\n\nBlue arrows show which functions call each other.\n\nThick black arrows show which classes have pointers to other classes when\nthey're running.\n\n### Source code dependency chart\n\nA --> B means \"file A imports file B\".\n\nFor readability this hides `/test/` and `/util/` and `*-types.ts`.\n\n![](depchart/depchart-no-types.png)\n\nAnd again with 3rd party dependencies as brown boxes with dotted lines, and\nincluding `*-types.ts`\n\n![](depchart/depchart-deps.png)\n\nRun `yarn depchart` to regenerate this. You'll need graphviz installed.\n\n### Platform-specific drivers\n\nThere are two parts of stone-soup which are swappable to support different\nplatforms or backends: `IReplica` and `IReplicaDriver`. Everything else should\nwork on all platforms.\n\nCrypto drivers:\n\n- `ReplicaDriverChloride` - only in browser, Node\n- `ReplicaDriverNode` - only in Node\n- `ReplicaDriverNoble` - universal\n\nStorage drivers:\n\n- `ReplicaDriverMemory` - univeral\n- `ReplicaDriverLocalStorage` - browser\n- `ReplicaDriverIndexedDB` - browser\n- `ReplicaDriverSqlite` - Node, Deno\n\nUsers of this library have to decide which of these drivers to import and use in\ntheir app.\n\n### Documentation\n\nWe use JSDoc for user documentation. You can view docs for the whole codebase at\nhttps://doc.deno.land/https://deno.land/x/stone_soup@v8.0.0/mod.ts, or by\nrunning the following from the root of the project:\n\n```\ndeno doc mod.ts\n```\n\nJSDocs are intended for end-users of the library. Comments for contributors\nworking with the codebase — e.g. notes on how something is implemented — are\nbetter as standard JS comments.\n\nIf possible, use a single line for the JSDoc. Example:\n\n```ts\n/** Does something great */\nexport function doSomething() {\n  // ...\n}\n```\n\nYou can use markdown inside of JSDoc block. While markdown supports HTML tags,\nit is forbidden in JSDoc blocks.\n\nCode string literals should be braced with the back-tick (\\`) instead of quotes.\nFor example:\n\n```ts\n/** Import something from the `earthstar` module. */\n```\n\nIt's not necessary to document function arguments unless an extra explanation is\nwarranted. Therefore `@param` should generally not be used. If `@param` is used,\nit should not include the `type` as TypeScript is already strongly typed.\n\n```ts\n/**\n * Function with non obvious param.\n * @param nonObvious Description of non obvious parameter.\n */\n```\n\nCode examples should utilize markdown format, like so:\n\n````ts\n/** A straight forward comment and an example:\n * ```ts\n * import { Crypto } from \"stone-soup\";\n * const keypair = Crypto.generateAuthorKeypair(\"suzy\");\n * ```\n */\n````\n\nCode examples should not contain additional comments and must not be indented.\nIt is already inside a comment. If it needs further comments it is not a good\nexample.\n\nExported functions should use the `function` keyword, and not be defined as\ninline functions assigned to variables. The main reason for this being that they\nare then correctly categorised as functions.\n\n### Publishing to NPM\n\n1. Run `make VERSION=\"version.number.here\" npm`, where `version.number.here` is\n   the desired version number for the package.\n2. `cd npm`\n3. `npm publish`\n\n## Changes from Earthstar v1\n\n### Splitting `Storage` into `Replica` and `ReplicaDriver` classes\n\nThink of this as `IStorageNiceAPIFullOfComplexity` and\n`IStorageSimpleLowLevelDriver`.\n\nI want to make it easier to add new kinds of storage so I'm splitting IStorage\ninto two parts:\n\nThe Storage does:\n\n- the complex annoying stuff we only want to write once\n- `set():` sign and add a document\n- `ingest():` validate and accept a document from the outside\n- user-friendly helper functions, getters, setters\n- an event bus that other things can subscribe to, like QueryFollowers\n\nThe StorageDriver does:\n\n- simple stuff, so we can make lots of drivers\n- query for documents (this is actually pretty complicated)\n- maintain indexes for querying (hopefully provided by the underlying storage\n  technology)\n- simple upsert of a document with no smartness\n\nPossibly even you can have multiple Storages for one Driver, for example when\nyou're using multiple tabs with indexedDb or localStorage.\n\n### \"Reliable indexing / streaming\"\n\nThis shows an implementation of the \"reliable indexing\" idea discussed in\n[this issue](https://github.com/earthstar-project/earthstar/issues/66).\n\n#### The problem\n\nWe have livestreaming now, over the network and also to local subscribers, all\nbased on `onWrite` events.\n\nIf you miss some events, you can't recover -- you have to do a full batch\ndownload of every document.\n\nEvents also don't tell you what was overwritten, which you might need to know to\nupdate a Layer or index.\n\n#### The solution: `localIndex`\n\nEach Storage keeps track of the order that it receives documents, and assignes\neach doc a `localIndex` value which starts at 1 and increments from there with\nevery newly written doc.\n\nThis puts the documents in a nice stable linear order that can be used to\nreliably stream, and resume streaming, from the Storage.\n\nWhen we get a new version of a document, it gets a new `localIndex` and goes at\nthe end of the sequence, and the old version vanishes, leaving a gap in the\nsequence. It's ok that there are gaps.\n\nThe `localIndex` is particular to a certain IStorage. It's kept in the `Doc`\nobject but it's not really part of it; it's not included in the signature. It's\nthis IStorage's metadata about that document. When syncing, it's sent as one of\nthe \"extra fields\"\n[(newly added to the specification)](https://earthstar-docs.netlify.app/docs/reference/earthstar-specification/#extra-fields-for-syncing),\nobserved by the receiving peer, then discarded and overwritten with the\nreceiving peer's own latest `localIndex` number.\n\n#### Use cases\n\n1. Streaming sync between peers, which can be interrupted and resumed\n1. Layers and indexes that use a QueryFollower to subscribe to changes in a\n   Storage. These might store their indexes in localStorage, for example, and\n   would therefore want to resume indexing instead of starting over from\n   scratch.\n1. React components that need to know when to re-render\n\nFor use cases where the listener will never have any downtime, they don't really\nneed to be able to resume, they can just listen for events from the Storage\ninstead and it may be more efficient. For example a React component could listen\nfor events about a particular document instead of making a whole QueryFollower\nthat has to go through every single change to find changes to that particular\ndocument.\n\n#### Properties of the `localIndex` sequence\n\nThe docs, sorted by `localIndex` on a particular peer, have these properties:\n\n**Properties**\n\n1. The docs are in a stable order that does not change, except:\n1. Newly added or changed docs go at the end, increasing the highest\n   `localIndex` by 1.\n1. When a doc is updated (same author and same path, but newer timestamp), we\n   discard the old version. So we leave a gap in the sequence where the old\n   verison used to be, and the new version goes on the end of the sequence.\n1. The first doc has a `localIndex` of zero, unless it was later changed, in\n   which case there will be a gap at zero.\n\nWhy do all this? The goal is to be able to catch up to changes since the last\ntime we looked at a Storage. We can do that by remembering the highest\n`localIndex` we saw last time, and now getting all the docs later than that in\nthe sequence. We always read this sequence from old to new (in increasing order\nof `localIndex`.\n\nThere are not really any other nice properties about this sequence:\n\n**Downsides**\n\n1. The `localIndex` order is not sorted by `path`, `timestamp`, `author`, or any\n   other useful property. The order is jumbled because docs can be received in\n   any order during a sync, perhaps with multiple other peers simultaneously,\n   perhaps some using Sync Filters to only get some docs...\n1. The order is different on every peer (that's why it's \"local\").\n1. The history docs for a certain path will be in a jumbled order in the\n   `localIndex` sequence. The Latest doc for a path can be before or after the\n   other history docs. User of QueryFollowers will need some bookeeping to\n   remember which version is the Latest for each path, if they care (e.g. if\n   it's being used as an index and not just a sync mechanism between peers).\n1. When a doc is modified and the old one is deleted, leaving a gap, you do not\n   get notified about the gap. There is no pointer back to the gap, or anything.\n   Users of QueryFollowers are expected to have some kind of index so they can\n   notice that the new doc overwrites the old one, and delete the old one.\n1. When an ephemeral doc expires, it leaves a gap in the sequence but nothing is\n   added to the end of the sequence. Users of QueryFollowers are expected to pay\n   attention to expiration dates and delete ephemeral docs themselves. We may\n   also add an event on the Storage when a doc expires, but you could miss this\n   event if you were not listening at that moment, so you'll still have to check\n   for your own expired docs from time to time.\n1. QueryFollowers should always progress in the direction of increasing\n   `localIndex`. (They can start at 0, or the latest number, or anywhere in\n   between). This makes it simple to keep track of where to resume next time.\n   However this means we always process the oldest-received docs first, but the\n   user probably cares more about the recently-received docs.\n   - It would be possible with fancier bookeeping to make QueryFollowers that\n     track which intervals of the sequence they've visited, so they can work\n     from newest-to-oldest. But sometimes the oldest-received docs are the most\n     important (like usernames)...\n\n#### Querying by `localIndex`\n\nThis lets you easily resume where you left off. You can get batches of N docs at\na time if you want, using the `limit` option.\n\n```ts\nstorage.getDocsSinceLocalIndex(\n    startAt: LocalIndex,\n    limit?: number): Doc[];\n```\n\nThis is also how you tell a QueryFollower where to start in the sequence.\nQueryFollowers ignore the `limit` property though.\n\n(You can also still look up documents by path in the usual old way.)\n\n### Reliable streaming over the network, when syncing\n\n(Not implemented in this code yet)\n\nWhen we send docs over the network we will send the `localIndex` to help the\nother side track where they are in our own sequence. The other side will then\ndiscard the property and put their own `localIndex` on the document when they\nstore it.\n\nPeers will remember, for each other peer, which is the latest `localIndex`\nthey've seen from that peer, so they can resume syncing from there.\n\nThis is similar to how append-only logs are synced in Scuttlebutt and Hyper,\nexcept our logs have gaps.\n\n### Slightly different querying\n\nQuerying has been made more organized -- see the Query type in `types.ts`. It\nlooks a bit more like an SQL query but the pieces are written in the order they\nactually happen, so it's easier to understand.\n\nThe order is:\n\n- history (all or latest only)\n- orderBy\n- startAt (continue from a certain point)\n- filter - the same options, timestamp, pathStartswith, etc etc\n- limit\n\nAlso, the `cleanUpQuery` function is fancier and will also figure out if the\nquery will match `all`, `some`, or `nothing` documents. This helps with\noptimizations elsewhere.\n\n## Problems left to solve\n\n- Ephemeral documents disappear without leaving a trace, do we need events for\n  that?\n- An IStorage might significantly change or start over, by deleting most of its\n  local documents and choosing a different sync query. Then we'd need to tell\n  subscribers and peers that we're effectively a different IStorage now.\n  - localIndex could be a tuple `[generation, localIndex]` where generation is\n    an integer that increments on each big change like that\n  - or give each IStorage a UUID which gets randomly changed when big changes\n    happen. This would be helpful for other reasons too (to prevent echoing back\n    documents to the storage that just gave them back to us, we need to track\n    who gave them to us)\n- Syncing by `localIndex` doesn't work very well when you also have a sync\n  query, because you have to scan the entire sequence to find the couple of docs\n  you care about. We probably still want another way of efficient syncing that\n  goes in path order and uses hashing in some clever way, sort of like a Merkle\n  tree but not.\n\n## Other small improvements\n\n- The `Document` type is now named `Doc` to avoid collision with an existing\n  built-in Typescript type\n","readmeFilename":"README.md","gitHead":"089915f7abde85d5cc378625bf82a832f33990ea","_id":"earthstar@10.0.0-beta.1","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-LdgIYkvtkE+j7bkN2a3SJ1zAtvo20JYXRlMz0IY0iVH7UFIDg8YoPY5xPs+4lySFbUvGsN4vhVG/N4elnKCVDg==","shasum":"226c74312a990062ec0f664ed50ff1c5224d0211","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.0.0-beta.1.tgz","fileCount":282,"unpackedSize":1143582,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC2ojTl0ToZGH0UDdTlD1tSXn0Qb4Tfce7XiY9PcdTsdwIgMKX/qR46ZairwOc9SAvUV/3xxZ92HQ/gd5FxmQocHOY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjfMnJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoupA/6A7OVWonYa6KK94yvck6MilQQnqvsT+8RlaFyhYlbK50FEwR1\r\ntSlsM2IIsrJrhfClK5De5pYECPaNn6QEdqjVia2+0SlcKBchvhfd/PBJWE8e\r\nGYy4QHJ1E7l7p/rcRB12J63xVDLzeblSq3c0ugc7rqo1MUSM5agYrBYptClZ\r\n7lkl0bb5Zrr4vijkisFp2wIozimH5DHT1GsG3AR+AGEcRmX3CpyfRzndIfKD\r\n5m014MkD/jINQEhwJ2Bfch/e62IDNd7+/JY4Y21HRqhxD7S2sYAtIG2zwTTg\r\nmFc0ZdHvirHWhK0/OKCm7oRm01KFJo2cyWMiY5mQwhD3VxIxy4Eeso2n3atQ\r\nV8Z2mKzZ9KgcA435tYpbDzv9cl7KpTIwN7F0p915hZVMxFIsmE/wHrKuf0Xy\r\n/j/KD6u1Wma78kQSbp8hHL8iBXD3DXYiupIpSsNQXHCsKglN0m6UcQJu93j2\r\nSEF9Atsm5kp5XlSQ4eemHAbDh/SY/tZDmpaNRTbm1Yz93DDIartp0mRza7fK\r\n2cDbuHVKgm6FkJnOsXRXfUnU+9sTIJogU93K7twhG6n4Y8t9ayljAim61eK4\r\nT68b+JVRY/eLG9pHnFXvRQLq4k9QW7RhxKR+5lcCGx7RCVY44XOktkF5i4E7\r\nyn8wFoArzBi6H4KT+wDZlzAExECAFfFIAh4=\r\n=sIyG\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.0.0-beta.1_1669122505570_0.00385596530164789"},"_hasShrinkwrap":false},"10.0.0-beta.2":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"10.0.0-beta.2","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"16.11.37","chalk":"4.1.2","get-port":"5.1.1","path-to-regexp":"6.2.1","ws":"8.8.1","@deno/shim-deno":"~0.10.0","@deno/shim-crypto":"~0.3.1","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/ws":"8.5.3"},"exports":{".":{"import":{"default":"./esm/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"require":{"default":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"}},"./node":{"import":{"default":"./esm/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"require":{"default":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"}},"./browser":{"import":{"default":"./esm/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"},"require":{"default":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","isomorphic-blob":"1.0.1","isomorphic-undici-ponyfill":"1.0.0","@sgwilym/isomorphic-streams":"1.0.4","isomorphic-ws":"5.0.0","textencoder-ponyfill":"1.0.2"},"readme":"# Earthstar\n\nSync stuff you care about with people you know. A specification and Javascript\nlibrary for building online tools you can truly call your own.Build\noffline-first, decentralised, and private network applications in the browser,\nserver, or command-line.\n\n**Clearly there's a lot to unpack, so check out\n[Earthstar's website](https://earthstar-project.org) for an introduction to\nEarthstar's concepts, an API tour, technical documentation, videos, and more!**\n\n## Usage\n\nTo use in Deno, add the following:\n\n```ts\nimport * as Earthstar from \"https://deno.land/x/earthstar/mod.ts\";\n```\n\nTo use with Node or apps built with NPM dependencies:\n\n```\nnpm i earthstar\n```\n\nAnd then import in your code:\n\n```ts\nimport * as Earthstar from \"earthstar\";\n```\n\n## Development\n\n### Setup\n\nYou will need Deno installed.\n[Instructions for installation can be found here](https://deno.land/#installation).\nYou may also want type-checking and linting from Deno for your IDE, which you\ncan get with extensions\n[like this one for VSCode](https://deno.land/manual@v1.17.2/vscode_deno).\n\nTo check that you've got everything set up correctly:\n\n`make example`\n\nThis will run the example script at `example-app.ts`, and you will see a lot of\ncolourful log messages from the app.\n\n### Scripts\n\nScripts are run with the `make` command.\n\n- `make test` - Run all tests\n- `make test-watch` - Run all tests in watch mode\n- `make fmt` - Format all code in the codebase\n- `make npm` - Create a NPM package in `npm` and run tests against it (requires\n  Node v14 or v16 to be installed).\n- `make bundle` - Create a bundled browser script at `earthstar.bundle.js`\n- `make depchart` - Regenerate the dependency chart images\n- `make coverage` - Generate code test coverage statistics\n- `make clean` - Delete generated files\n\n### Orientation\n\n- The entry for the package can be found at `mod.ts`.\n- Most external dependencies can be found in `deps.ts`. All other files import\n  external dependencies from this file.\n- Script definitions can be found in `Makefile`.\n- Tests are all in `src/test/`\n- The script for building the NPM package can be found in `scripts/build_npm.ts`\n\n### Uint8Arrays and Buffers\n\nWe use Uint8Arrays throughout the code to maximize platform support. Some of the\nnode-specific drivers use Buffers internally but the Buffers are converted to\nUint8Arrays before leaving those drivers.\n\nFor convenience, variables that hold Uint8Arrays are called \"bytes\", like\n`bytesToHash` instead of `uint8ArrayToHash`.\n\n`util/bytes.ts` has a bunch of helper code to do common operations on\nUint8Arrays and to convert them back and forth to strings and to Buffers.\n\n### Platform-specific tests\n\nDrivers are tested against the runtimes they're intended for. When tests are\nrun, they pull the correct scenarios from 'src/test/test-scenarios.ts', where\nthe current runtime is inferred during runtime.\n\n### Classes\n\nThe `Replica` is the main star of the show. Classes to the right are used\ninternally for its implementation. Classes to the left stack on top of an\n`Replica` to do extra things to it (subscribe to changes, cache data, etc).\n\nEach `Replica` holds the Docs for one Share.\n\n![](classes.png)\n\nNames starting with `I` are interfaces; there are one or multiple actual classes\nthat implement those interfaces.\n\nThe orange classes are \"drivers\" which have multiple implementations to choose\nfrom, for different platforms (node, browser, etc).\n\nBlue arrows show which functions call each other.\n\nThick black arrows show which classes have pointers to other classes when\nthey're running.\n\n### Source code dependency chart\n\nA --> B means \"file A imports file B\".\n\nFor readability this hides `/test/` and `/util/` and `*-types.ts`.\n\n![](depchart/depchart-no-types.png)\n\nAnd again with 3rd party dependencies as brown boxes with dotted lines, and\nincluding `*-types.ts`\n\n![](depchart/depchart-deps.png)\n\nRun `yarn depchart` to regenerate this. You'll need graphviz installed.\n\n### Platform-specific drivers\n\nThere are two parts of stone-soup which are swappable to support different\nplatforms or backends: `IReplica` and `IReplicaDriver`. Everything else should\nwork on all platforms.\n\nCrypto drivers:\n\n- `ReplicaDriverChloride` - only in browser, Node\n- `ReplicaDriverNode` - only in Node\n- `ReplicaDriverNoble` - universal\n\nStorage drivers:\n\n- `ReplicaDriverMemory` - univeral\n- `ReplicaDriverLocalStorage` - browser\n- `ReplicaDriverIndexedDB` - browser\n- `ReplicaDriverSqlite` - Node, Deno\n\nUsers of this library have to decide which of these drivers to import and use in\ntheir app.\n\n### Documentation\n\nWe use JSDoc for user documentation. You can view docs for the whole codebase at\nhttps://doc.deno.land/https://deno.land/x/stone_soup@v8.0.0/mod.ts, or by\nrunning the following from the root of the project:\n\n```\ndeno doc mod.ts\n```\n\nJSDocs are intended for end-users of the library. Comments for contributors\nworking with the codebase — e.g. notes on how something is implemented — are\nbetter as standard JS comments.\n\nIf possible, use a single line for the JSDoc. Example:\n\n```ts\n/** Does something great */\nexport function doSomething() {\n  // ...\n}\n```\n\nYou can use markdown inside of JSDoc block. While markdown supports HTML tags,\nit is forbidden in JSDoc blocks.\n\nCode string literals should be braced with the back-tick (\\`) instead of quotes.\nFor example:\n\n```ts\n/** Import something from the `earthstar` module. */\n```\n\nIt's not necessary to document function arguments unless an extra explanation is\nwarranted. Therefore `@param` should generally not be used. If `@param` is used,\nit should not include the `type` as TypeScript is already strongly typed.\n\n```ts\n/**\n * Function with non obvious param.\n * @param nonObvious Description of non obvious parameter.\n */\n```\n\nCode examples should utilize markdown format, like so:\n\n````ts\n/** A straight forward comment and an example:\n * ```ts\n * import { Crypto } from \"stone-soup\";\n * const keypair = Crypto.generateAuthorKeypair(\"suzy\");\n * ```\n */\n````\n\nCode examples should not contain additional comments and must not be indented.\nIt is already inside a comment. If it needs further comments it is not a good\nexample.\n\nExported functions should use the `function` keyword, and not be defined as\ninline functions assigned to variables. The main reason for this being that they\nare then correctly categorised as functions.\n\n### Publishing to NPM\n\n1. Run `make VERSION=\"version.number.here\" npm`, where `version.number.here` is\n   the desired version number for the package.\n2. `cd npm`\n3. `npm publish`\n\n## Changes from Earthstar v1\n\n### Splitting `Storage` into `Replica` and `ReplicaDriver` classes\n\nThink of this as `IStorageNiceAPIFullOfComplexity` and\n`IStorageSimpleLowLevelDriver`.\n\nI want to make it easier to add new kinds of storage so I'm splitting IStorage\ninto two parts:\n\nThe Storage does:\n\n- the complex annoying stuff we only want to write once\n- `set():` sign and add a document\n- `ingest():` validate and accept a document from the outside\n- user-friendly helper functions, getters, setters\n- an event bus that other things can subscribe to, like QueryFollowers\n\nThe StorageDriver does:\n\n- simple stuff, so we can make lots of drivers\n- query for documents (this is actually pretty complicated)\n- maintain indexes for querying (hopefully provided by the underlying storage\n  technology)\n- simple upsert of a document with no smartness\n\nPossibly even you can have multiple Storages for one Driver, for example when\nyou're using multiple tabs with indexedDb or localStorage.\n\n### \"Reliable indexing / streaming\"\n\nThis shows an implementation of the \"reliable indexing\" idea discussed in\n[this issue](https://github.com/earthstar-project/earthstar/issues/66).\n\n#### The problem\n\nWe have livestreaming now, over the network and also to local subscribers, all\nbased on `onWrite` events.\n\nIf you miss some events, you can't recover -- you have to do a full batch\ndownload of every document.\n\nEvents also don't tell you what was overwritten, which you might need to know to\nupdate a Layer or index.\n\n#### The solution: `localIndex`\n\nEach Storage keeps track of the order that it receives documents, and assignes\neach doc a `localIndex` value which starts at 1 and increments from there with\nevery newly written doc.\n\nThis puts the documents in a nice stable linear order that can be used to\nreliably stream, and resume streaming, from the Storage.\n\nWhen we get a new version of a document, it gets a new `localIndex` and goes at\nthe end of the sequence, and the old version vanishes, leaving a gap in the\nsequence. It's ok that there are gaps.\n\nThe `localIndex` is particular to a certain IStorage. It's kept in the `Doc`\nobject but it's not really part of it; it's not included in the signature. It's\nthis IStorage's metadata about that document. When syncing, it's sent as one of\nthe \"extra fields\"\n[(newly added to the specification)](https://earthstar-docs.netlify.app/docs/reference/earthstar-specification/#extra-fields-for-syncing),\nobserved by the receiving peer, then discarded and overwritten with the\nreceiving peer's own latest `localIndex` number.\n\n#### Use cases\n\n1. Streaming sync between peers, which can be interrupted and resumed\n1. Layers and indexes that use a QueryFollower to subscribe to changes in a\n   Storage. These might store their indexes in localStorage, for example, and\n   would therefore want to resume indexing instead of starting over from\n   scratch.\n1. React components that need to know when to re-render\n\nFor use cases where the listener will never have any downtime, they don't really\nneed to be able to resume, they can just listen for events from the Storage\ninstead and it may be more efficient. For example a React component could listen\nfor events about a particular document instead of making a whole QueryFollower\nthat has to go through every single change to find changes to that particular\ndocument.\n\n#### Properties of the `localIndex` sequence\n\nThe docs, sorted by `localIndex` on a particular peer, have these properties:\n\n**Properties**\n\n1. The docs are in a stable order that does not change, except:\n1. Newly added or changed docs go at the end, increasing the highest\n   `localIndex` by 1.\n1. When a doc is updated (same author and same path, but newer timestamp), we\n   discard the old version. So we leave a gap in the sequence where the old\n   verison used to be, and the new version goes on the end of the sequence.\n1. The first doc has a `localIndex` of zero, unless it was later changed, in\n   which case there will be a gap at zero.\n\nWhy do all this? The goal is to be able to catch up to changes since the last\ntime we looked at a Storage. We can do that by remembering the highest\n`localIndex` we saw last time, and now getting all the docs later than that in\nthe sequence. We always read this sequence from old to new (in increasing order\nof `localIndex`.\n\nThere are not really any other nice properties about this sequence:\n\n**Downsides**\n\n1. The `localIndex` order is not sorted by `path`, `timestamp`, `author`, or any\n   other useful property. The order is jumbled because docs can be received in\n   any order during a sync, perhaps with multiple other peers simultaneously,\n   perhaps some using Sync Filters to only get some docs...\n1. The order is different on every peer (that's why it's \"local\").\n1. The history docs for a certain path will be in a jumbled order in the\n   `localIndex` sequence. The Latest doc for a path can be before or after the\n   other history docs. User of QueryFollowers will need some bookeeping to\n   remember which version is the Latest for each path, if they care (e.g. if\n   it's being used as an index and not just a sync mechanism between peers).\n1. When a doc is modified and the old one is deleted, leaving a gap, you do not\n   get notified about the gap. There is no pointer back to the gap, or anything.\n   Users of QueryFollowers are expected to have some kind of index so they can\n   notice that the new doc overwrites the old one, and delete the old one.\n1. When an ephemeral doc expires, it leaves a gap in the sequence but nothing is\n   added to the end of the sequence. Users of QueryFollowers are expected to pay\n   attention to expiration dates and delete ephemeral docs themselves. We may\n   also add an event on the Storage when a doc expires, but you could miss this\n   event if you were not listening at that moment, so you'll still have to check\n   for your own expired docs from time to time.\n1. QueryFollowers should always progress in the direction of increasing\n   `localIndex`. (They can start at 0, or the latest number, or anywhere in\n   between). This makes it simple to keep track of where to resume next time.\n   However this means we always process the oldest-received docs first, but the\n   user probably cares more about the recently-received docs.\n   - It would be possible with fancier bookeeping to make QueryFollowers that\n     track which intervals of the sequence they've visited, so they can work\n     from newest-to-oldest. But sometimes the oldest-received docs are the most\n     important (like usernames)...\n\n#### Querying by `localIndex`\n\nThis lets you easily resume where you left off. You can get batches of N docs at\na time if you want, using the `limit` option.\n\n```ts\nstorage.getDocsSinceLocalIndex(\n    startAt: LocalIndex,\n    limit?: number): Doc[];\n```\n\nThis is also how you tell a QueryFollower where to start in the sequence.\nQueryFollowers ignore the `limit` property though.\n\n(You can also still look up documents by path in the usual old way.)\n\n### Reliable streaming over the network, when syncing\n\n(Not implemented in this code yet)\n\nWhen we send docs over the network we will send the `localIndex` to help the\nother side track where they are in our own sequence. The other side will then\ndiscard the property and put their own `localIndex` on the document when they\nstore it.\n\nPeers will remember, for each other peer, which is the latest `localIndex`\nthey've seen from that peer, so they can resume syncing from there.\n\nThis is similar to how append-only logs are synced in Scuttlebutt and Hyper,\nexcept our logs have gaps.\n\n### Slightly different querying\n\nQuerying has been made more organized -- see the Query type in `types.ts`. It\nlooks a bit more like an SQL query but the pieces are written in the order they\nactually happen, so it's easier to understand.\n\nThe order is:\n\n- history (all or latest only)\n- orderBy\n- startAt (continue from a certain point)\n- filter - the same options, timestamp, pathStartswith, etc etc\n- limit\n\nAlso, the `cleanUpQuery` function is fancier and will also figure out if the\nquery will match `all`, `some`, or `nothing` documents. This helps with\noptimizations elsewhere.\n\n## Problems left to solve\n\n- Ephemeral documents disappear without leaving a trace, do we need events for\n  that?\n- An IStorage might significantly change or start over, by deleting most of its\n  local documents and choosing a different sync query. Then we'd need to tell\n  subscribers and peers that we're effectively a different IStorage now.\n  - localIndex could be a tuple `[generation, localIndex]` where generation is\n    an integer that increments on each big change like that\n  - or give each IStorage a UUID which gets randomly changed when big changes\n    happen. This would be helpful for other reasons too (to prevent echoing back\n    documents to the storage that just gave them back to us, we need to track\n    who gave them to us)\n- Syncing by `localIndex` doesn't work very well when you also have a sync\n  query, because you have to scan the entire sequence to find the couple of docs\n  you care about. We probably still want another way of efficient syncing that\n  goes in path order and uses hashing in some clever way, sort of like a Merkle\n  tree but not.\n\n## Other small improvements\n\n- The `Document` type is now named `Doc` to avoid collision with an existing\n  built-in Typescript type\n","readmeFilename":"README.md","gitHead":"a113bf724e8b66cb6771fecb0929e0c8f8fa2044","_id":"earthstar@10.0.0-beta.2","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-+O7DmhxJ76KZpeWRk88yxhLX4Aw0suGZWS90z2E+ONXwm7Axsc54VsctDFAb7Ky+0EJXBa7i9v/8FIINLJ8Lmg==","shasum":"e5bea83de071528729a5f704011c3d9d183dd20e","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.0.0-beta.2.tgz","fileCount":282,"unpackedSize":1144230,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHd83xjbcudP4eaAuGu2eRH98RYpsLpupM7EcPwkSwgzAiBHbi59oDTkDAq6Uo8knGNzjHwc6qIkvdfuaD0xtpz2Sw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjfOVFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq2dw/+MNij3QKhhV61ZJxtxEKDelFaxmZ8iq29fdBbnJGdlPZoTw26\r\neRThwbTFKBVDyg7/FzPN+NL2WJps4f2CJfNBR7/ThHPC/t+3Yn6lTExPLEvp\r\ndEETqU03YQmuZs+onIFUiQ/PQMk6hFXA2//uN+q7WgdqhC6GOqWSNea3Bg0I\r\nCbaUa8aeLYrqM/uwjjleoIyZBZKnykTKKoYtypACTeDqLmai4Fci7fEl3btw\r\n0HdwIjzEci+hm7A5bSBiG8oEzGWMIO0MNEf2lF29s7Tj5haYJikcVvjBifTt\r\nnkekt0ALjk1b3yYUXpqbsQIzo9O3XY2jBLNFgXWls/fcZjXuHrl2khrCMurY\r\nkT4odyOHWz1DN6w8pb05MM4sEFrK9cR74gGdiko4WCPuLkQtvUnP5Xm6Gp+N\r\nIWb+SFsr5L/tQerF+NGCDqiMBHdb41NqSEV9vOywIZLG/QPCX+ggwY2m3DSC\r\neix1Pn1uOVeOrWbwkTGCuywSWiPKQKfVqAaPP6zHxumSO9zZzJmi2Q1Af0Kp\r\nw/EXyEOQGRCsVvVtrxFhJMZCySn33XABkiB++QzNObfAk/CJE6InnEFCl8dQ\r\nv10qLAIiceMUVYfMs1oh4E2cQM5Q33rfSuAUFWs3SFjmPtD9pEuCfJbA9Ot7\r\nzj4ZO1TeQWVb8ygnmU5l3aZ+ZXCRCSPJd/Y=\r\n=k1Lx\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.0.0-beta.2_1669129541324_0.6160197073941649"},"_hasShrinkwrap":false},"10.0.0-beta.3":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"10.0.0-beta.3","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"16.11.37","chalk":"4.1.2","get-port":"5.1.1","path-to-regexp":"6.2.1","ws":"8.8.1","@deno/shim-deno":"~0.10.0","@deno/shim-crypto":"~0.3.1","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/ws":"8.5.3"},"exports":{".":{"import":{"default":"./esm/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"require":{"default":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"}},"./node":{"import":{"default":"./esm/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"require":{"default":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"}},"./browser":{"import":{"default":"./esm/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"},"require":{"default":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","isomorphic-blob":"1.0.1","isomorphic-undici-ponyfill":"1.0.0","@sgwilym/isomorphic-streams":"1.0.4","isomorphic-ws":"5.0.0","textencoder-ponyfill":"1.0.2"},"readme":"# Earthstar\n\nSync stuff you care about with people you know. A specification and Javascript\nlibrary for building online tools you can truly call your own.Build\noffline-first, decentralised, and private network applications in the browser,\nserver, or command-line.\n\n**Clearly there's a lot to unpack, so check out\n[Earthstar's website](https://earthstar-project.org) for an introduction to\nEarthstar's concepts, an API tour, technical documentation, videos, and more!**\n\n## Usage\n\nTo use in Deno, add the following:\n\n```ts\nimport * as Earthstar from \"https://deno.land/x/earthstar/mod.ts\";\n```\n\nTo use with Node or apps built with NPM dependencies:\n\n```\nnpm i earthstar\n```\n\nAnd then import in your code:\n\n```ts\nimport * as Earthstar from \"earthstar\";\n```\n\n## Development\n\n### Setup\n\nYou will need Deno installed.\n[Instructions for installation can be found here](https://deno.land/#installation).\nYou may also want type-checking and linting from Deno for your IDE, which you\ncan get with extensions\n[like this one for VSCode](https://deno.land/manual@v1.17.2/vscode_deno).\n\nTo check that you've got everything set up correctly:\n\n`make example`\n\nThis will run the example script at `example-app.ts`, and you will see a lot of\ncolourful log messages from the app.\n\n### Scripts\n\nScripts are run with the `make` command.\n\n- `make test` - Run all tests\n- `make test-watch` - Run all tests in watch mode\n- `make fmt` - Format all code in the codebase\n- `make npm` - Create a NPM package in `npm` and run tests against it (requires\n  Node v14 or v16 to be installed).\n- `make bundle` - Create a bundled browser script at `earthstar.bundle.js`\n- `make depchart` - Regenerate the dependency chart images\n- `make coverage` - Generate code test coverage statistics\n- `make clean` - Delete generated files\n\n### Orientation\n\n- The entry for the package can be found at `mod.ts`.\n- Most external dependencies can be found in `deps.ts`. All other files import\n  external dependencies from this file.\n- Script definitions can be found in `Makefile`.\n- Tests are all in `src/test/`\n- The script for building the NPM package can be found in `scripts/build_npm.ts`\n\n### Uint8Arrays and Buffers\n\nWe use Uint8Arrays throughout the code to maximize platform support. Some of the\nnode-specific drivers use Buffers internally but the Buffers are converted to\nUint8Arrays before leaving those drivers.\n\nFor convenience, variables that hold Uint8Arrays are called \"bytes\", like\n`bytesToHash` instead of `uint8ArrayToHash`.\n\n`util/bytes.ts` has a bunch of helper code to do common operations on\nUint8Arrays and to convert them back and forth to strings and to Buffers.\n\n### Platform-specific tests\n\nDrivers are tested against the runtimes they're intended for. When tests are\nrun, they pull the correct scenarios from 'src/test/test-scenarios.ts', where\nthe current runtime is inferred during runtime.\n\n### Classes\n\nThe `Replica` is the main star of the show. Classes to the right are used\ninternally for its implementation. Classes to the left stack on top of an\n`Replica` to do extra things to it (subscribe to changes, cache data, etc).\n\nEach `Replica` holds the Docs for one Share.\n\n![](classes.png)\n\nNames starting with `I` are interfaces; there are one or multiple actual classes\nthat implement those interfaces.\n\nThe orange classes are \"drivers\" which have multiple implementations to choose\nfrom, for different platforms (node, browser, etc).\n\nBlue arrows show which functions call each other.\n\nThick black arrows show which classes have pointers to other classes when\nthey're running.\n\n### Source code dependency chart\n\nA --> B means \"file A imports file B\".\n\nFor readability this hides `/test/` and `/util/` and `*-types.ts`.\n\n![](depchart/depchart-no-types.png)\n\nAnd again with 3rd party dependencies as brown boxes with dotted lines, and\nincluding `*-types.ts`\n\n![](depchart/depchart-deps.png)\n\nRun `yarn depchart` to regenerate this. You'll need graphviz installed.\n\n### Platform-specific drivers\n\nThere are two parts of stone-soup which are swappable to support different\nplatforms or backends: `IReplica` and `IReplicaDriver`. Everything else should\nwork on all platforms.\n\nCrypto drivers:\n\n- `ReplicaDriverChloride` - only in browser, Node\n- `ReplicaDriverNode` - only in Node\n- `ReplicaDriverNoble` - universal\n\nStorage drivers:\n\n- `ReplicaDriverMemory` - univeral\n- `ReplicaDriverLocalStorage` - browser\n- `ReplicaDriverIndexedDB` - browser\n- `ReplicaDriverSqlite` - Node, Deno\n\nUsers of this library have to decide which of these drivers to import and use in\ntheir app.\n\n### Documentation\n\nWe use JSDoc for user documentation. You can view docs for the whole codebase at\nhttps://doc.deno.land/https://deno.land/x/stone_soup@v8.0.0/mod.ts, or by\nrunning the following from the root of the project:\n\n```\ndeno doc mod.ts\n```\n\nJSDocs are intended for end-users of the library. Comments for contributors\nworking with the codebase — e.g. notes on how something is implemented — are\nbetter as standard JS comments.\n\nIf possible, use a single line for the JSDoc. Example:\n\n```ts\n/** Does something great */\nexport function doSomething() {\n  // ...\n}\n```\n\nYou can use markdown inside of JSDoc block. While markdown supports HTML tags,\nit is forbidden in JSDoc blocks.\n\nCode string literals should be braced with the back-tick (\\`) instead of quotes.\nFor example:\n\n```ts\n/** Import something from the `earthstar` module. */\n```\n\nIt's not necessary to document function arguments unless an extra explanation is\nwarranted. Therefore `@param` should generally not be used. If `@param` is used,\nit should not include the `type` as TypeScript is already strongly typed.\n\n```ts\n/**\n * Function with non obvious param.\n * @param nonObvious Description of non obvious parameter.\n */\n```\n\nCode examples should utilize markdown format, like so:\n\n````ts\n/** A straight forward comment and an example:\n * ```ts\n * import { Crypto } from \"stone-soup\";\n * const keypair = Crypto.generateAuthorKeypair(\"suzy\");\n * ```\n */\n````\n\nCode examples should not contain additional comments and must not be indented.\nIt is already inside a comment. If it needs further comments it is not a good\nexample.\n\nExported functions should use the `function` keyword, and not be defined as\ninline functions assigned to variables. The main reason for this being that they\nare then correctly categorised as functions.\n\n### Publishing to NPM\n\n1. Run `make VERSION=\"version.number.here\" npm`, where `version.number.here` is\n   the desired version number for the package.\n2. `cd npm`\n3. `npm publish`\n\n## Changes from Earthstar v1\n\n### Splitting `Storage` into `Replica` and `ReplicaDriver` classes\n\nThink of this as `IStorageNiceAPIFullOfComplexity` and\n`IStorageSimpleLowLevelDriver`.\n\nI want to make it easier to add new kinds of storage so I'm splitting IStorage\ninto two parts:\n\nThe Storage does:\n\n- the complex annoying stuff we only want to write once\n- `set():` sign and add a document\n- `ingest():` validate and accept a document from the outside\n- user-friendly helper functions, getters, setters\n- an event bus that other things can subscribe to, like QueryFollowers\n\nThe StorageDriver does:\n\n- simple stuff, so we can make lots of drivers\n- query for documents (this is actually pretty complicated)\n- maintain indexes for querying (hopefully provided by the underlying storage\n  technology)\n- simple upsert of a document with no smartness\n\nPossibly even you can have multiple Storages for one Driver, for example when\nyou're using multiple tabs with indexedDb or localStorage.\n\n### \"Reliable indexing / streaming\"\n\nThis shows an implementation of the \"reliable indexing\" idea discussed in\n[this issue](https://github.com/earthstar-project/earthstar/issues/66).\n\n#### The problem\n\nWe have livestreaming now, over the network and also to local subscribers, all\nbased on `onWrite` events.\n\nIf you miss some events, you can't recover -- you have to do a full batch\ndownload of every document.\n\nEvents also don't tell you what was overwritten, which you might need to know to\nupdate a Layer or index.\n\n#### The solution: `localIndex`\n\nEach Storage keeps track of the order that it receives documents, and assignes\neach doc a `localIndex` value which starts at 1 and increments from there with\nevery newly written doc.\n\nThis puts the documents in a nice stable linear order that can be used to\nreliably stream, and resume streaming, from the Storage.\n\nWhen we get a new version of a document, it gets a new `localIndex` and goes at\nthe end of the sequence, and the old version vanishes, leaving a gap in the\nsequence. It's ok that there are gaps.\n\nThe `localIndex` is particular to a certain IStorage. It's kept in the `Doc`\nobject but it's not really part of it; it's not included in the signature. It's\nthis IStorage's metadata about that document. When syncing, it's sent as one of\nthe \"extra fields\"\n[(newly added to the specification)](https://earthstar-docs.netlify.app/docs/reference/earthstar-specification/#extra-fields-for-syncing),\nobserved by the receiving peer, then discarded and overwritten with the\nreceiving peer's own latest `localIndex` number.\n\n#### Use cases\n\n1. Streaming sync between peers, which can be interrupted and resumed\n1. Layers and indexes that use a QueryFollower to subscribe to changes in a\n   Storage. These might store their indexes in localStorage, for example, and\n   would therefore want to resume indexing instead of starting over from\n   scratch.\n1. React components that need to know when to re-render\n\nFor use cases where the listener will never have any downtime, they don't really\nneed to be able to resume, they can just listen for events from the Storage\ninstead and it may be more efficient. For example a React component could listen\nfor events about a particular document instead of making a whole QueryFollower\nthat has to go through every single change to find changes to that particular\ndocument.\n\n#### Properties of the `localIndex` sequence\n\nThe docs, sorted by `localIndex` on a particular peer, have these properties:\n\n**Properties**\n\n1. The docs are in a stable order that does not change, except:\n1. Newly added or changed docs go at the end, increasing the highest\n   `localIndex` by 1.\n1. When a doc is updated (same author and same path, but newer timestamp), we\n   discard the old version. So we leave a gap in the sequence where the old\n   verison used to be, and the new version goes on the end of the sequence.\n1. The first doc has a `localIndex` of zero, unless it was later changed, in\n   which case there will be a gap at zero.\n\nWhy do all this? The goal is to be able to catch up to changes since the last\ntime we looked at a Storage. We can do that by remembering the highest\n`localIndex` we saw last time, and now getting all the docs later than that in\nthe sequence. We always read this sequence from old to new (in increasing order\nof `localIndex`.\n\nThere are not really any other nice properties about this sequence:\n\n**Downsides**\n\n1. The `localIndex` order is not sorted by `path`, `timestamp`, `author`, or any\n   other useful property. The order is jumbled because docs can be received in\n   any order during a sync, perhaps with multiple other peers simultaneously,\n   perhaps some using Sync Filters to only get some docs...\n1. The order is different on every peer (that's why it's \"local\").\n1. The history docs for a certain path will be in a jumbled order in the\n   `localIndex` sequence. The Latest doc for a path can be before or after the\n   other history docs. User of QueryFollowers will need some bookeeping to\n   remember which version is the Latest for each path, if they care (e.g. if\n   it's being used as an index and not just a sync mechanism between peers).\n1. When a doc is modified and the old one is deleted, leaving a gap, you do not\n   get notified about the gap. There is no pointer back to the gap, or anything.\n   Users of QueryFollowers are expected to have some kind of index so they can\n   notice that the new doc overwrites the old one, and delete the old one.\n1. When an ephemeral doc expires, it leaves a gap in the sequence but nothing is\n   added to the end of the sequence. Users of QueryFollowers are expected to pay\n   attention to expiration dates and delete ephemeral docs themselves. We may\n   also add an event on the Storage when a doc expires, but you could miss this\n   event if you were not listening at that moment, so you'll still have to check\n   for your own expired docs from time to time.\n1. QueryFollowers should always progress in the direction of increasing\n   `localIndex`. (They can start at 0, or the latest number, or anywhere in\n   between). This makes it simple to keep track of where to resume next time.\n   However this means we always process the oldest-received docs first, but the\n   user probably cares more about the recently-received docs.\n   - It would be possible with fancier bookeeping to make QueryFollowers that\n     track which intervals of the sequence they've visited, so they can work\n     from newest-to-oldest. But sometimes the oldest-received docs are the most\n     important (like usernames)...\n\n#### Querying by `localIndex`\n\nThis lets you easily resume where you left off. You can get batches of N docs at\na time if you want, using the `limit` option.\n\n```ts\nstorage.getDocsSinceLocalIndex(\n    startAt: LocalIndex,\n    limit?: number): Doc[];\n```\n\nThis is also how you tell a QueryFollower where to start in the sequence.\nQueryFollowers ignore the `limit` property though.\n\n(You can also still look up documents by path in the usual old way.)\n\n### Reliable streaming over the network, when syncing\n\n(Not implemented in this code yet)\n\nWhen we send docs over the network we will send the `localIndex` to help the\nother side track where they are in our own sequence. The other side will then\ndiscard the property and put their own `localIndex` on the document when they\nstore it.\n\nPeers will remember, for each other peer, which is the latest `localIndex`\nthey've seen from that peer, so they can resume syncing from there.\n\nThis is similar to how append-only logs are synced in Scuttlebutt and Hyper,\nexcept our logs have gaps.\n\n### Slightly different querying\n\nQuerying has been made more organized -- see the Query type in `types.ts`. It\nlooks a bit more like an SQL query but the pieces are written in the order they\nactually happen, so it's easier to understand.\n\nThe order is:\n\n- history (all or latest only)\n- orderBy\n- startAt (continue from a certain point)\n- filter - the same options, timestamp, pathStartswith, etc etc\n- limit\n\nAlso, the `cleanUpQuery` function is fancier and will also figure out if the\nquery will match `all`, `some`, or `nothing` documents. This helps with\noptimizations elsewhere.\n\n## Problems left to solve\n\n- Ephemeral documents disappear without leaving a trace, do we need events for\n  that?\n- An IStorage might significantly change or start over, by deleting most of its\n  local documents and choosing a different sync query. Then we'd need to tell\n  subscribers and peers that we're effectively a different IStorage now.\n  - localIndex could be a tuple `[generation, localIndex]` where generation is\n    an integer that increments on each big change like that\n  - or give each IStorage a UUID which gets randomly changed when big changes\n    happen. This would be helpful for other reasons too (to prevent echoing back\n    documents to the storage that just gave them back to us, we need to track\n    who gave them to us)\n- Syncing by `localIndex` doesn't work very well when you also have a sync\n  query, because you have to scan the entire sequence to find the couple of docs\n  you care about. We probably still want another way of efficient syncing that\n  goes in path order and uses hashing in some clever way, sort of like a Merkle\n  tree but not.\n\n## Other small improvements\n\n- The `Document` type is now named `Doc` to avoid collision with an existing\n  built-in Typescript type\n","readmeFilename":"README.md","gitHead":"9f41223c8b46343b6a2301185d4aff2a63f9b3af","_id":"earthstar@10.0.0-beta.3","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-NiJbHrPGDWQQNHcpaew8ckl2lXK4Y3gtn7MCAQCzPJ6fSpMfbdY9hMugvYaz9NAnW+Xqz0qutlt8qlwR3V3mVQ==","shasum":"166d36d04fb16ab79482afef13f58de9a6b86afd","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.0.0-beta.3.tgz","fileCount":282,"unpackedSize":1154794,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC9k0JSQlsgJ5c822lLzTTkHJRc2ZD59k4inWA9XtrjnwIgPXkI92POrwpE2GvdSzJAy2P2dfAELx7mbMEssw9DLQw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjfh5FACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoN7A//VxxmL4sbhVr8oup9/16nv3BagPfJesEnEReLLL3jGWrBUGVF\r\nKY4CWaIKQ70bir1bKnLd1LP7DvS6PwxMSZobrGxlvFmU9w2E1RUbZ6uNKW27\r\nt/bI4K6PeaC+v9AQAGVKoPit27+JsL/doqI8PKInSrUvGCQt8Hd55tBMz+/d\r\nyjBve9yhKTf7aqt5sJpm6nMO0G1LiaWCC87dAqeEoDR8qZx0yVjUyBsD37Hq\r\nb1+pps9kKTbZreiZbEaVdtLRQNZI9HhWujq3gLbE21HOC2U6YSWOGqAY9vC/\r\nPfp3Pah5Y1+K/+5bjSn6QxWfrD0sRBL84x30FrRv4qAmyRNESFT+BVMpbsj0\r\npLtFRmLHyVpuUsZntaGCshuHMwMoKCkRIaqTCtnVShtxGcjzPpOF3sWD13e2\r\nlP1zlg31n0IFRciclJwh2pG6oRX+CcGvuie+4I8KpEOBN/QUOi6fOIy5a977\r\nE63OuoA5rASl7WKTtoKbuzuWwbWOfp45Lbt+9iRoiEUfpqN2/oEpM00S0arN\r\n2A57CSSm4pVPGgp3cOCabK/tJ5KllySMqYebMHO5CeTaIOh5Ep9dId+vS743\r\nrM9Qko7oXoyBAi0/GLbKQ548AAk3vooiTxO4M4dOEmXjxaW5UMeOnFDC1tUc\r\n64rX8aoaLgMcbAxfeQFw78w++sYcJAAEEok=\r\n=113V\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.0.0-beta.3_1669209668911_0.4407054201320135"},"_hasShrinkwrap":false},"10.0.0-beta.4":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"10.0.0-beta.4","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"16.11.37","chalk":"4.1.2","get-port":"5.1.1","path-to-regexp":"6.2.1","ws":"8.8.1","@deno/shim-deno":"~0.10.0","@deno/shim-crypto":"~0.3.1","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/ws":"8.5.3"},"exports":{".":{"import":{"default":"./esm/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"require":{"default":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"}},"./node":{"import":{"default":"./esm/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"require":{"default":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"}},"./browser":{"import":{"default":"./esm/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"},"require":{"default":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","isomorphic-blob":"1.0.1","isomorphic-undici-ponyfill":"1.0.0","@sgwilym/isomorphic-streams":"1.0.4","isomorphic-ws":"5.0.0","textencoder-ponyfill":"1.0.2"},"readme":"# Earthstar\n\nSync stuff you care about with people you know. A specification and Javascript\nlibrary for building online tools you can truly call your own.Build\noffline-first, decentralised, and private network applications in the browser,\nserver, or command-line.\n\n**Clearly there's a lot to unpack, so check out\n[Earthstar's website](https://earthstar-project.org) for an introduction to\nEarthstar's concepts, an API tour, technical documentation, videos, and more!**\n\n## Usage\n\nTo use in Deno, add the following:\n\n```ts\nimport * as Earthstar from \"https://deno.land/x/earthstar/mod.ts\";\n```\n\nTo use with Node or apps built with NPM dependencies:\n\n```\nnpm i earthstar\n```\n\nAnd then import in your code:\n\n```ts\nimport * as Earthstar from \"earthstar\";\n```\n\n## Development\n\n### Setup\n\nYou will need Deno installed.\n[Instructions for installation can be found here](https://deno.land/#installation).\nYou may also want type-checking and linting from Deno for your IDE, which you\ncan get with extensions\n[like this one for VSCode](https://deno.land/manual@v1.17.2/vscode_deno).\n\nTo check that you've got everything set up correctly:\n\n`make example`\n\nThis will run the example script at `example-app.ts`, and you will see a lot of\ncolourful log messages from the app.\n\n### Scripts\n\nScripts are run with the `make` command.\n\n- `make test` - Run all tests\n- `make test-watch` - Run all tests in watch mode\n- `make fmt` - Format all code in the codebase\n- `make npm` - Create a NPM package in `npm` and run tests against it (requires\n  Node v14 or v16 to be installed).\n- `make bundle` - Create a bundled browser script at `earthstar.bundle.js`\n- `make depchart` - Regenerate the dependency chart images\n- `make coverage` - Generate code test coverage statistics\n- `make clean` - Delete generated files\n\n### Orientation\n\n- The entry for the package can be found at `mod.ts`.\n- Most external dependencies can be found in `deps.ts`. All other files import\n  external dependencies from this file.\n- Script definitions can be found in `Makefile`.\n- Tests are all in `src/test/`\n- The script for building the NPM package can be found in `scripts/build_npm.ts`\n\n### Uint8Arrays and Buffers\n\nWe use Uint8Arrays throughout the code to maximize platform support. Some of the\nnode-specific drivers use Buffers internally but the Buffers are converted to\nUint8Arrays before leaving those drivers.\n\nFor convenience, variables that hold Uint8Arrays are called \"bytes\", like\n`bytesToHash` instead of `uint8ArrayToHash`.\n\n`util/bytes.ts` has a bunch of helper code to do common operations on\nUint8Arrays and to convert them back and forth to strings and to Buffers.\n\n### Platform-specific tests\n\nDrivers are tested against the runtimes they're intended for. When tests are\nrun, they pull the correct scenarios from 'src/test/test-scenarios.ts', where\nthe current runtime is inferred during runtime.\n\n### Classes\n\nThe `Replica` is the main star of the show. Classes to the right are used\ninternally for its implementation. Classes to the left stack on top of an\n`Replica` to do extra things to it (subscribe to changes, cache data, etc).\n\nEach `Replica` holds the Docs for one Share.\n\n![](classes.png)\n\nNames starting with `I` are interfaces; there are one or multiple actual classes\nthat implement those interfaces.\n\nThe orange classes are \"drivers\" which have multiple implementations to choose\nfrom, for different platforms (node, browser, etc).\n\nBlue arrows show which functions call each other.\n\nThick black arrows show which classes have pointers to other classes when\nthey're running.\n\n### Source code dependency chart\n\nA --> B means \"file A imports file B\".\n\nFor readability this hides `/test/` and `/util/` and `*-types.ts`.\n\n![](depchart/depchart-no-types.png)\n\nAnd again with 3rd party dependencies as brown boxes with dotted lines, and\nincluding `*-types.ts`\n\n![](depchart/depchart-deps.png)\n\nRun `yarn depchart` to regenerate this. You'll need graphviz installed.\n\n### Platform-specific drivers\n\nThere are two parts of stone-soup which are swappable to support different\nplatforms or backends: `IReplica` and `IReplicaDriver`. Everything else should\nwork on all platforms.\n\nCrypto drivers:\n\n- `ReplicaDriverChloride` - only in browser, Node\n- `ReplicaDriverNode` - only in Node\n- `ReplicaDriverNoble` - universal\n\nStorage drivers:\n\n- `ReplicaDriverMemory` - univeral\n- `ReplicaDriverLocalStorage` - browser\n- `ReplicaDriverIndexedDB` - browser\n- `ReplicaDriverSqlite` - Node, Deno\n\nUsers of this library have to decide which of these drivers to import and use in\ntheir app.\n\n### Documentation\n\nWe use JSDoc for user documentation. You can view docs for the whole codebase at\nhttps://doc.deno.land/https://deno.land/x/stone_soup@v8.0.0/mod.ts, or by\nrunning the following from the root of the project:\n\n```\ndeno doc mod.ts\n```\n\nJSDocs are intended for end-users of the library. Comments for contributors\nworking with the codebase — e.g. notes on how something is implemented — are\nbetter as standard JS comments.\n\nIf possible, use a single line for the JSDoc. Example:\n\n```ts\n/** Does something great */\nexport function doSomething() {\n  // ...\n}\n```\n\nYou can use markdown inside of JSDoc block. While markdown supports HTML tags,\nit is forbidden in JSDoc blocks.\n\nCode string literals should be braced with the back-tick (\\`) instead of quotes.\nFor example:\n\n```ts\n/** Import something from the `earthstar` module. */\n```\n\nIt's not necessary to document function arguments unless an extra explanation is\nwarranted. Therefore `@param` should generally not be used. If `@param` is used,\nit should not include the `type` as TypeScript is already strongly typed.\n\n```ts\n/**\n * Function with non obvious param.\n * @param nonObvious Description of non obvious parameter.\n */\n```\n\nCode examples should utilize markdown format, like so:\n\n````ts\n/** A straight forward comment and an example:\n * ```ts\n * import { Crypto } from \"stone-soup\";\n * const keypair = Crypto.generateAuthorKeypair(\"suzy\");\n * ```\n */\n````\n\nCode examples should not contain additional comments and must not be indented.\nIt is already inside a comment. If it needs further comments it is not a good\nexample.\n\nExported functions should use the `function` keyword, and not be defined as\ninline functions assigned to variables. The main reason for this being that they\nare then correctly categorised as functions.\n\n### Publishing to NPM\n\n1. Run `make VERSION=\"version.number.here\" npm`, where `version.number.here` is\n   the desired version number for the package.\n2. `cd npm`\n3. `npm publish`\n\n## Changes from Earthstar v1\n\n### Splitting `Storage` into `Replica` and `ReplicaDriver` classes\n\nThink of this as `IStorageNiceAPIFullOfComplexity` and\n`IStorageSimpleLowLevelDriver`.\n\nI want to make it easier to add new kinds of storage so I'm splitting IStorage\ninto two parts:\n\nThe Storage does:\n\n- the complex annoying stuff we only want to write once\n- `set():` sign and add a document\n- `ingest():` validate and accept a document from the outside\n- user-friendly helper functions, getters, setters\n- an event bus that other things can subscribe to, like QueryFollowers\n\nThe StorageDriver does:\n\n- simple stuff, so we can make lots of drivers\n- query for documents (this is actually pretty complicated)\n- maintain indexes for querying (hopefully provided by the underlying storage\n  technology)\n- simple upsert of a document with no smartness\n\nPossibly even you can have multiple Storages for one Driver, for example when\nyou're using multiple tabs with indexedDb or localStorage.\n\n### \"Reliable indexing / streaming\"\n\nThis shows an implementation of the \"reliable indexing\" idea discussed in\n[this issue](https://github.com/earthstar-project/earthstar/issues/66).\n\n#### The problem\n\nWe have livestreaming now, over the network and also to local subscribers, all\nbased on `onWrite` events.\n\nIf you miss some events, you can't recover -- you have to do a full batch\ndownload of every document.\n\nEvents also don't tell you what was overwritten, which you might need to know to\nupdate a Layer or index.\n\n#### The solution: `localIndex`\n\nEach Storage keeps track of the order that it receives documents, and assignes\neach doc a `localIndex` value which starts at 1 and increments from there with\nevery newly written doc.\n\nThis puts the documents in a nice stable linear order that can be used to\nreliably stream, and resume streaming, from the Storage.\n\nWhen we get a new version of a document, it gets a new `localIndex` and goes at\nthe end of the sequence, and the old version vanishes, leaving a gap in the\nsequence. It's ok that there are gaps.\n\nThe `localIndex` is particular to a certain IStorage. It's kept in the `Doc`\nobject but it's not really part of it; it's not included in the signature. It's\nthis IStorage's metadata about that document. When syncing, it's sent as one of\nthe \"extra fields\"\n[(newly added to the specification)](https://earthstar-docs.netlify.app/docs/reference/earthstar-specification/#extra-fields-for-syncing),\nobserved by the receiving peer, then discarded and overwritten with the\nreceiving peer's own latest `localIndex` number.\n\n#### Use cases\n\n1. Streaming sync between peers, which can be interrupted and resumed\n1. Layers and indexes that use a QueryFollower to subscribe to changes in a\n   Storage. These might store their indexes in localStorage, for example, and\n   would therefore want to resume indexing instead of starting over from\n   scratch.\n1. React components that need to know when to re-render\n\nFor use cases where the listener will never have any downtime, they don't really\nneed to be able to resume, they can just listen for events from the Storage\ninstead and it may be more efficient. For example a React component could listen\nfor events about a particular document instead of making a whole QueryFollower\nthat has to go through every single change to find changes to that particular\ndocument.\n\n#### Properties of the `localIndex` sequence\n\nThe docs, sorted by `localIndex` on a particular peer, have these properties:\n\n**Properties**\n\n1. The docs are in a stable order that does not change, except:\n1. Newly added or changed docs go at the end, increasing the highest\n   `localIndex` by 1.\n1. When a doc is updated (same author and same path, but newer timestamp), we\n   discard the old version. So we leave a gap in the sequence where the old\n   verison used to be, and the new version goes on the end of the sequence.\n1. The first doc has a `localIndex` of zero, unless it was later changed, in\n   which case there will be a gap at zero.\n\nWhy do all this? The goal is to be able to catch up to changes since the last\ntime we looked at a Storage. We can do that by remembering the highest\n`localIndex` we saw last time, and now getting all the docs later than that in\nthe sequence. We always read this sequence from old to new (in increasing order\nof `localIndex`.\n\nThere are not really any other nice properties about this sequence:\n\n**Downsides**\n\n1. The `localIndex` order is not sorted by `path`, `timestamp`, `author`, or any\n   other useful property. The order is jumbled because docs can be received in\n   any order during a sync, perhaps with multiple other peers simultaneously,\n   perhaps some using Sync Filters to only get some docs...\n1. The order is different on every peer (that's why it's \"local\").\n1. The history docs for a certain path will be in a jumbled order in the\n   `localIndex` sequence. The Latest doc for a path can be before or after the\n   other history docs. User of QueryFollowers will need some bookeeping to\n   remember which version is the Latest for each path, if they care (e.g. if\n   it's being used as an index and not just a sync mechanism between peers).\n1. When a doc is modified and the old one is deleted, leaving a gap, you do not\n   get notified about the gap. There is no pointer back to the gap, or anything.\n   Users of QueryFollowers are expected to have some kind of index so they can\n   notice that the new doc overwrites the old one, and delete the old one.\n1. When an ephemeral doc expires, it leaves a gap in the sequence but nothing is\n   added to the end of the sequence. Users of QueryFollowers are expected to pay\n   attention to expiration dates and delete ephemeral docs themselves. We may\n   also add an event on the Storage when a doc expires, but you could miss this\n   event if you were not listening at that moment, so you'll still have to check\n   for your own expired docs from time to time.\n1. QueryFollowers should always progress in the direction of increasing\n   `localIndex`. (They can start at 0, or the latest number, or anywhere in\n   between). This makes it simple to keep track of where to resume next time.\n   However this means we always process the oldest-received docs first, but the\n   user probably cares more about the recently-received docs.\n   - It would be possible with fancier bookeeping to make QueryFollowers that\n     track which intervals of the sequence they've visited, so they can work\n     from newest-to-oldest. But sometimes the oldest-received docs are the most\n     important (like usernames)...\n\n#### Querying by `localIndex`\n\nThis lets you easily resume where you left off. You can get batches of N docs at\na time if you want, using the `limit` option.\n\n```ts\nstorage.getDocsSinceLocalIndex(\n    startAt: LocalIndex,\n    limit?: number): Doc[];\n```\n\nThis is also how you tell a QueryFollower where to start in the sequence.\nQueryFollowers ignore the `limit` property though.\n\n(You can also still look up documents by path in the usual old way.)\n\n### Reliable streaming over the network, when syncing\n\n(Not implemented in this code yet)\n\nWhen we send docs over the network we will send the `localIndex` to help the\nother side track where they are in our own sequence. The other side will then\ndiscard the property and put their own `localIndex` on the document when they\nstore it.\n\nPeers will remember, for each other peer, which is the latest `localIndex`\nthey've seen from that peer, so they can resume syncing from there.\n\nThis is similar to how append-only logs are synced in Scuttlebutt and Hyper,\nexcept our logs have gaps.\n\n### Slightly different querying\n\nQuerying has been made more organized -- see the Query type in `types.ts`. It\nlooks a bit more like an SQL query but the pieces are written in the order they\nactually happen, so it's easier to understand.\n\nThe order is:\n\n- history (all or latest only)\n- orderBy\n- startAt (continue from a certain point)\n- filter - the same options, timestamp, pathStartswith, etc etc\n- limit\n\nAlso, the `cleanUpQuery` function is fancier and will also figure out if the\nquery will match `all`, `some`, or `nothing` documents. This helps with\noptimizations elsewhere.\n\n## Problems left to solve\n\n- Ephemeral documents disappear without leaving a trace, do we need events for\n  that?\n- An IStorage might significantly change or start over, by deleting most of its\n  local documents and choosing a different sync query. Then we'd need to tell\n  subscribers and peers that we're effectively a different IStorage now.\n  - localIndex could be a tuple `[generation, localIndex]` where generation is\n    an integer that increments on each big change like that\n  - or give each IStorage a UUID which gets randomly changed when big changes\n    happen. This would be helpful for other reasons too (to prevent echoing back\n    documents to the storage that just gave them back to us, we need to track\n    who gave them to us)\n- Syncing by `localIndex` doesn't work very well when you also have a sync\n  query, because you have to scan the entire sequence to find the couple of docs\n  you care about. We probably still want another way of efficient syncing that\n  goes in path order and uses hashing in some clever way, sort of like a Merkle\n  tree but not.\n\n## Other small improvements\n\n- The `Document` type is now named `Doc` to avoid collision with an existing\n  built-in Typescript type\n","readmeFilename":"README.md","gitHead":"d7bb9124a285be3bf827935efd60e7a859013857","_id":"earthstar@10.0.0-beta.4","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-+FAJtw5lY0djylQA9+yNRjpESaRgy8eiPr7WYNHuSGs8q9yoAd0u6sj8gH927uQQqH11sF9CLZSCeq5fT9cOUQ==","shasum":"af4317f97bfb62a0ff7a0ea70b0d247ba5fb6e78","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.0.0-beta.4.tgz","fileCount":282,"unpackedSize":1155444,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDyChgIWQRL3G2SqgLQSM7ixHIoimY27czSaDi5xtkDCgIhANPgiHeQrXKK9HwOCjoTS2iFtx47TJMsRsQI0oZ5+hb7"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjfi5/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqdLg//YCbHtQh1+B/ZYoB5jPmmDPkz1efuNnL7XNY/f1wv7bW0w1JB\r\nnVcea0BCNbVMFTwzqLfSze2HUKqEZGrL8Uml6ERfuWnBr/aXoXG9MmY06ly3\r\ncsiWC4lY2KZH4ISZFb5GVda/nLWhhAh+I47D4YijltDS71JnvsodwB1BCY7F\r\njLc2Qvuuhy1FnA2pA9O+fcDeBe4SYG4wjjXZ76a5toKhb63XKETfhGMA/vXa\r\n/LNON08n0DNwWkPD4kGoCuB6YcrCDF+rpreEJe1hCcWpEo17CdCUij84Pxt0\r\nkhY5voyei2c7iZMd5Id4XNgwqK4RwBkONcPAD5iWnjpzpEJlqG6YhA+b6+lf\r\nQbvf3KB3K+JN3H7bD4QNg9g7N2AUKOISJdTs+Bw/wbRE2qop49V4VgMBXTo8\r\nHnZ2YXWdIEyO7kBQijUbJ0eo22DNBaCNnlFUYzqYNLpxyG3s67A9qjsdPmNa\r\nig/X9ZB3Dc2dSFTTv/9lef0SzdFA+swL4QsKLcYTl5IAC6S5bOHBSSQ1VCtb\r\nb7DIVaqDudQH+QgF7iuBmoP41uNpDdYBeZm2WQ3SKW5f71964sS6cZqk5mbv\r\nsy4EVuoDByqhyyiZcJMVzT2leHtyWQqVyVEqmTkDFhvXyPtT0wuqYeqGuIXl\r\n5MYVD8+u8Y8Z67u2Opz84/Qxb06Yuc9xrkk=\r\n=wvVC\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.0.0-beta.4_1669213823513_0.1692816147055567"},"_hasShrinkwrap":false},"10.0.0-beta.5":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"10.0.0-beta.5","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"16.11.37","chalk":"4.1.2","get-port":"5.1.1","path-to-regexp":"6.2.1","ws":"8.8.1","@deno/shim-deno":"~0.10.0","@deno/shim-crypto":"~0.3.1","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/ws":"8.5.3"},"exports":{".":{"import":{"default":"./esm/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"require":{"default":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"}},"./node":{"import":{"default":"./esm/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"require":{"default":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"}},"./browser":{"import":{"default":"./esm/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"},"require":{"default":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","isomorphic-blob":"1.0.1","isomorphic-undici-ponyfill":"1.0.0","@sgwilym/isomorphic-streams":"1.0.4","isomorphic-ws":"5.0.0","textencoder-ponyfill":"1.0.2"},"readme":"# Earthstar\n\nSync stuff you care about with people you know. A specification and Javascript\nlibrary for building online tools you can truly call your own.Build\noffline-first, decentralised, and private network applications in the browser,\nserver, or command-line.\n\n**Clearly there's a lot to unpack, so check out\n[Earthstar's website](https://earthstar-project.org) for an introduction to\nEarthstar's concepts, an API tour, technical documentation, videos, and more!**\n\n## Usage\n\nTo use in Deno, add the following:\n\n```ts\nimport * as Earthstar from \"https://deno.land/x/earthstar/mod.ts\";\n```\n\nTo use with Node or apps built with NPM dependencies:\n\n```\nnpm i earthstar\n```\n\nAnd then import in your code:\n\n```ts\nimport * as Earthstar from \"earthstar\";\n```\n\n## Development\n\n### Setup\n\nYou will need Deno installed.\n[Instructions for installation can be found here](https://deno.land/#installation).\nYou may also want type-checking and linting from Deno for your IDE, which you\ncan get with extensions\n[like this one for VSCode](https://deno.land/manual@v1.17.2/vscode_deno).\n\nTo check that you've got everything set up correctly:\n\n`make example`\n\nThis will run the example script at `example-app.ts`, and you will see a lot of\ncolourful log messages from the app.\n\n### Scripts\n\nScripts are run with the `make` command.\n\n- `make test` - Run all tests\n- `make test-watch` - Run all tests in watch mode\n- `make fmt` - Format all code in the codebase\n- `make npm` - Create a NPM package in `npm` and run tests against it (requires\n  Node v14 or v16 to be installed).\n- `make bundle` - Create a bundled browser script at `earthstar.bundle.js`\n- `make depchart` - Regenerate the dependency chart images\n- `make coverage` - Generate code test coverage statistics\n- `make clean` - Delete generated files\n\n### Orientation\n\n- The entry for the package can be found at `mod.ts`.\n- Most external dependencies can be found in `deps.ts`. All other files import\n  external dependencies from this file.\n- Script definitions can be found in `Makefile`.\n- Tests are all in `src/test/`\n- The script for building the NPM package can be found in `scripts/build_npm.ts`\n\n### Uint8Arrays and Buffers\n\nWe use Uint8Arrays throughout the code to maximize platform support. Some of the\nnode-specific drivers use Buffers internally but the Buffers are converted to\nUint8Arrays before leaving those drivers.\n\nFor convenience, variables that hold Uint8Arrays are called \"bytes\", like\n`bytesToHash` instead of `uint8ArrayToHash`.\n\n`util/bytes.ts` has a bunch of helper code to do common operations on\nUint8Arrays and to convert them back and forth to strings and to Buffers.\n\n### Platform-specific tests\n\nDrivers are tested against the runtimes they're intended for. When tests are\nrun, they pull the correct scenarios from 'src/test/test-scenarios.ts', where\nthe current runtime is inferred during runtime.\n\n### Classes\n\nThe `Replica` is the main star of the show. Classes to the right are used\ninternally for its implementation. Classes to the left stack on top of an\n`Replica` to do extra things to it (subscribe to changes, cache data, etc).\n\nEach `Replica` holds the Docs for one Share.\n\n![](classes.png)\n\nNames starting with `I` are interfaces; there are one or multiple actual classes\nthat implement those interfaces.\n\nThe orange classes are \"drivers\" which have multiple implementations to choose\nfrom, for different platforms (node, browser, etc).\n\nBlue arrows show which functions call each other.\n\nThick black arrows show which classes have pointers to other classes when\nthey're running.\n\n### Source code dependency chart\n\nA --> B means \"file A imports file B\".\n\nFor readability this hides `/test/` and `/util/` and `*-types.ts`.\n\n![](depchart/depchart-no-types.png)\n\nAnd again with 3rd party dependencies as brown boxes with dotted lines, and\nincluding `*-types.ts`\n\n![](depchart/depchart-deps.png)\n\nRun `yarn depchart` to regenerate this. You'll need graphviz installed.\n\n### Platform-specific drivers\n\nThere are two parts of stone-soup which are swappable to support different\nplatforms or backends: `IReplica` and `IReplicaDriver`. Everything else should\nwork on all platforms.\n\nCrypto drivers:\n\n- `ReplicaDriverChloride` - only in browser, Node\n- `ReplicaDriverNode` - only in Node\n- `ReplicaDriverNoble` - universal\n\nStorage drivers:\n\n- `ReplicaDriverMemory` - univeral\n- `ReplicaDriverLocalStorage` - browser\n- `ReplicaDriverIndexedDB` - browser\n- `ReplicaDriverSqlite` - Node, Deno\n\nUsers of this library have to decide which of these drivers to import and use in\ntheir app.\n\n### Documentation\n\nWe use JSDoc for user documentation. You can view docs for the whole codebase at\nhttps://doc.deno.land/https://deno.land/x/stone_soup@v8.0.0/mod.ts, or by\nrunning the following from the root of the project:\n\n```\ndeno doc mod.ts\n```\n\nJSDocs are intended for end-users of the library. Comments for contributors\nworking with the codebase — e.g. notes on how something is implemented — are\nbetter as standard JS comments.\n\nIf possible, use a single line for the JSDoc. Example:\n\n```ts\n/** Does something great */\nexport function doSomething() {\n  // ...\n}\n```\n\nYou can use markdown inside of JSDoc block. While markdown supports HTML tags,\nit is forbidden in JSDoc blocks.\n\nCode string literals should be braced with the back-tick (\\`) instead of quotes.\nFor example:\n\n```ts\n/** Import something from the `earthstar` module. */\n```\n\nIt's not necessary to document function arguments unless an extra explanation is\nwarranted. Therefore `@param` should generally not be used. If `@param` is used,\nit should not include the `type` as TypeScript is already strongly typed.\n\n```ts\n/**\n * Function with non obvious param.\n * @param nonObvious Description of non obvious parameter.\n */\n```\n\nCode examples should utilize markdown format, like so:\n\n````ts\n/** A straight forward comment and an example:\n * ```ts\n * import { Crypto } from \"stone-soup\";\n * const keypair = Crypto.generateAuthorKeypair(\"suzy\");\n * ```\n */\n````\n\nCode examples should not contain additional comments and must not be indented.\nIt is already inside a comment. If it needs further comments it is not a good\nexample.\n\nExported functions should use the `function` keyword, and not be defined as\ninline functions assigned to variables. The main reason for this being that they\nare then correctly categorised as functions.\n\n### Publishing to NPM\n\n1. Run `make VERSION=\"version.number.here\" npm`, where `version.number.here` is\n   the desired version number for the package.\n2. `cd npm`\n3. `npm publish`\n\n## Changes from Earthstar v1\n\n### Splitting `Storage` into `Replica` and `ReplicaDriver` classes\n\nThink of this as `IStorageNiceAPIFullOfComplexity` and\n`IStorageSimpleLowLevelDriver`.\n\nI want to make it easier to add new kinds of storage so I'm splitting IStorage\ninto two parts:\n\nThe Storage does:\n\n- the complex annoying stuff we only want to write once\n- `set():` sign and add a document\n- `ingest():` validate and accept a document from the outside\n- user-friendly helper functions, getters, setters\n- an event bus that other things can subscribe to, like QueryFollowers\n\nThe StorageDriver does:\n\n- simple stuff, so we can make lots of drivers\n- query for documents (this is actually pretty complicated)\n- maintain indexes for querying (hopefully provided by the underlying storage\n  technology)\n- simple upsert of a document with no smartness\n\nPossibly even you can have multiple Storages for one Driver, for example when\nyou're using multiple tabs with indexedDb or localStorage.\n\n### \"Reliable indexing / streaming\"\n\nThis shows an implementation of the \"reliable indexing\" idea discussed in\n[this issue](https://github.com/earthstar-project/earthstar/issues/66).\n\n#### The problem\n\nWe have livestreaming now, over the network and also to local subscribers, all\nbased on `onWrite` events.\n\nIf you miss some events, you can't recover -- you have to do a full batch\ndownload of every document.\n\nEvents also don't tell you what was overwritten, which you might need to know to\nupdate a Layer or index.\n\n#### The solution: `localIndex`\n\nEach Storage keeps track of the order that it receives documents, and assignes\neach doc a `localIndex` value which starts at 1 and increments from there with\nevery newly written doc.\n\nThis puts the documents in a nice stable linear order that can be used to\nreliably stream, and resume streaming, from the Storage.\n\nWhen we get a new version of a document, it gets a new `localIndex` and goes at\nthe end of the sequence, and the old version vanishes, leaving a gap in the\nsequence. It's ok that there are gaps.\n\nThe `localIndex` is particular to a certain IStorage. It's kept in the `Doc`\nobject but it's not really part of it; it's not included in the signature. It's\nthis IStorage's metadata about that document. When syncing, it's sent as one of\nthe \"extra fields\"\n[(newly added to the specification)](https://earthstar-docs.netlify.app/docs/reference/earthstar-specification/#extra-fields-for-syncing),\nobserved by the receiving peer, then discarded and overwritten with the\nreceiving peer's own latest `localIndex` number.\n\n#### Use cases\n\n1. Streaming sync between peers, which can be interrupted and resumed\n1. Layers and indexes that use a QueryFollower to subscribe to changes in a\n   Storage. These might store their indexes in localStorage, for example, and\n   would therefore want to resume indexing instead of starting over from\n   scratch.\n1. React components that need to know when to re-render\n\nFor use cases where the listener will never have any downtime, they don't really\nneed to be able to resume, they can just listen for events from the Storage\ninstead and it may be more efficient. For example a React component could listen\nfor events about a particular document instead of making a whole QueryFollower\nthat has to go through every single change to find changes to that particular\ndocument.\n\n#### Properties of the `localIndex` sequence\n\nThe docs, sorted by `localIndex` on a particular peer, have these properties:\n\n**Properties**\n\n1. The docs are in a stable order that does not change, except:\n1. Newly added or changed docs go at the end, increasing the highest\n   `localIndex` by 1.\n1. When a doc is updated (same author and same path, but newer timestamp), we\n   discard the old version. So we leave a gap in the sequence where the old\n   verison used to be, and the new version goes on the end of the sequence.\n1. The first doc has a `localIndex` of zero, unless it was later changed, in\n   which case there will be a gap at zero.\n\nWhy do all this? The goal is to be able to catch up to changes since the last\ntime we looked at a Storage. We can do that by remembering the highest\n`localIndex` we saw last time, and now getting all the docs later than that in\nthe sequence. We always read this sequence from old to new (in increasing order\nof `localIndex`.\n\nThere are not really any other nice properties about this sequence:\n\n**Downsides**\n\n1. The `localIndex` order is not sorted by `path`, `timestamp`, `author`, or any\n   other useful property. The order is jumbled because docs can be received in\n   any order during a sync, perhaps with multiple other peers simultaneously,\n   perhaps some using Sync Filters to only get some docs...\n1. The order is different on every peer (that's why it's \"local\").\n1. The history docs for a certain path will be in a jumbled order in the\n   `localIndex` sequence. The Latest doc for a path can be before or after the\n   other history docs. User of QueryFollowers will need some bookeeping to\n   remember which version is the Latest for each path, if they care (e.g. if\n   it's being used as an index and not just a sync mechanism between peers).\n1. When a doc is modified and the old one is deleted, leaving a gap, you do not\n   get notified about the gap. There is no pointer back to the gap, or anything.\n   Users of QueryFollowers are expected to have some kind of index so they can\n   notice that the new doc overwrites the old one, and delete the old one.\n1. When an ephemeral doc expires, it leaves a gap in the sequence but nothing is\n   added to the end of the sequence. Users of QueryFollowers are expected to pay\n   attention to expiration dates and delete ephemeral docs themselves. We may\n   also add an event on the Storage when a doc expires, but you could miss this\n   event if you were not listening at that moment, so you'll still have to check\n   for your own expired docs from time to time.\n1. QueryFollowers should always progress in the direction of increasing\n   `localIndex`. (They can start at 0, or the latest number, or anywhere in\n   between). This makes it simple to keep track of where to resume next time.\n   However this means we always process the oldest-received docs first, but the\n   user probably cares more about the recently-received docs.\n   - It would be possible with fancier bookeeping to make QueryFollowers that\n     track which intervals of the sequence they've visited, so they can work\n     from newest-to-oldest. But sometimes the oldest-received docs are the most\n     important (like usernames)...\n\n#### Querying by `localIndex`\n\nThis lets you easily resume where you left off. You can get batches of N docs at\na time if you want, using the `limit` option.\n\n```ts\nstorage.getDocsSinceLocalIndex(\n    startAt: LocalIndex,\n    limit?: number): Doc[];\n```\n\nThis is also how you tell a QueryFollower where to start in the sequence.\nQueryFollowers ignore the `limit` property though.\n\n(You can also still look up documents by path in the usual old way.)\n\n### Reliable streaming over the network, when syncing\n\n(Not implemented in this code yet)\n\nWhen we send docs over the network we will send the `localIndex` to help the\nother side track where they are in our own sequence. The other side will then\ndiscard the property and put their own `localIndex` on the document when they\nstore it.\n\nPeers will remember, for each other peer, which is the latest `localIndex`\nthey've seen from that peer, so they can resume syncing from there.\n\nThis is similar to how append-only logs are synced in Scuttlebutt and Hyper,\nexcept our logs have gaps.\n\n### Slightly different querying\n\nQuerying has been made more organized -- see the Query type in `types.ts`. It\nlooks a bit more like an SQL query but the pieces are written in the order they\nactually happen, so it's easier to understand.\n\nThe order is:\n\n- history (all or latest only)\n- orderBy\n- startAt (continue from a certain point)\n- filter - the same options, timestamp, pathStartswith, etc etc\n- limit\n\nAlso, the `cleanUpQuery` function is fancier and will also figure out if the\nquery will match `all`, `some`, or `nothing` documents. This helps with\noptimizations elsewhere.\n\n## Problems left to solve\n\n- Ephemeral documents disappear without leaving a trace, do we need events for\n  that?\n- An IStorage might significantly change or start over, by deleting most of its\n  local documents and choosing a different sync query. Then we'd need to tell\n  subscribers and peers that we're effectively a different IStorage now.\n  - localIndex could be a tuple `[generation, localIndex]` where generation is\n    an integer that increments on each big change like that\n  - or give each IStorage a UUID which gets randomly changed when big changes\n    happen. This would be helpful for other reasons too (to prevent echoing back\n    documents to the storage that just gave them back to us, we need to track\n    who gave them to us)\n- Syncing by `localIndex` doesn't work very well when you also have a sync\n  query, because you have to scan the entire sequence to find the couple of docs\n  you care about. We probably still want another way of efficient syncing that\n  goes in path order and uses hashing in some clever way, sort of like a Merkle\n  tree but not.\n\n## Other small improvements\n\n- The `Document` type is now named `Doc` to avoid collision with an existing\n  built-in Typescript type\n","readmeFilename":"README.md","gitHead":"a178e14c48dca69002f7cb0ea634aa127bccbfb7","_id":"earthstar@10.0.0-beta.5","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-/KpAKC3J8kJm+jIFWcvTnuR5Pd7mt5PNkys05zSRk4Zs5OYO6zsbiRWLFZB2uJM0WUqO9OHWYUbtONGNyR3CQg==","shasum":"5dc04f87ecc98cec31686611829eea0adbe67fdf","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.0.0-beta.5.tgz","fileCount":282,"unpackedSize":1157915,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGlbHoA332VQ6aWuP2a70atsEeBW+zAE2Ww3pJuDUCYvAiATKsMspV5OXcZMDDU6VTezUksloaBkemU0SinfPvpXfA=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjf0YZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqfcA/+K31EiLMG8ee1U/e+0UCGx3u1NY2kHE8eZBhytjhSeVtkONfx\r\noSC4XLFBdWpyVgOBiUihDg5N3tr/V2uPEcRVuU//tIsYKp/kNIxfVk1sFfTF\r\nELUll16iDtFMJDidY/jevxzNgVniBKL0/4wByUT+5G4jBNtUZBrH2S+yf4AT\r\nGkfqVaLKoegUMT72fiSTOf6aK5AdE5VJl/P6kW1+IITSYL6lkSYaGamOaDzp\r\nlEY58u8/cm2QQwg96Fffkx9ik5c2NHc08i7h1gJyisOAg/ACNox1VCtRatAw\r\nBf2ZrZkQKdi3M+y1sGS3Mr0zWoa6v3qHOcCtvltRErr7NniwKvS2sL3ulnPI\r\nnyIN5izaIvN+c0mmDvYT50rz0qL0QxMpIegp0UoPQazQhevc4mKyzxbcexGc\r\nEgXJe5vY18ezp7UOcchdmWPvRrcDr3/RUKY9/MSsM7FYniI3vG1y0bFgWTAD\r\nPovKyR7phM44Z5pUwRYU1QGndqhYrlh886CvKAVTwM4tvCHPBezAiAqzkXhj\r\nwtaIgo8kAXyHS/ulunQhMAqjpxvI7bf3ultgcjpiOO17GY7biKMvl74QBloo\r\n0mEvNVsHSwc7gAKVAfYB1mOQ3G+JG6edkRU/uaenyjTki7v+UYy3NrybmaNt\r\n0yvbvAousPg9b6/U7rK1FNtdFzfoVAGXPaY=\r\n=ESlW\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.0.0-beta.5_1669285401290_0.6327775297479605"},"_hasShrinkwrap":false},"10.0.0-beta.6":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"10.0.0-beta.6","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"16.11.37","chalk":"4.1.2","get-port":"5.1.1","path-to-regexp":"6.2.1","ws":"8.8.1","@deno/shim-deno":"~0.10.0","@deno/shim-crypto":"~0.3.1","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/ws":"8.5.3"},"exports":{".":{"import":{"default":"./esm/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"require":{"default":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"}},"./node":{"import":{"default":"./esm/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"require":{"default":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"}},"./browser":{"import":{"default":"./esm/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"},"require":{"default":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","isomorphic-blob":"1.0.1","isomorphic-undici-ponyfill":"1.0.0","@sgwilym/isomorphic-streams":"1.0.4","isomorphic-ws":"5.0.0","textencoder-ponyfill":"1.0.2"},"readme":"# Earthstar\n\nSync stuff you care about with people you know. A specification and Javascript\nlibrary for building online tools you can truly call your own.Build\noffline-first, decentralised, and private network applications in the browser,\nserver, or command-line.\n\n**Clearly there's a lot to unpack, so check out\n[Earthstar's website](https://earthstar-project.org) for an introduction to\nEarthstar's concepts, an API tour, technical documentation, videos, and more!**\n\n## Usage\n\nTo use in Deno, add the following:\n\n```ts\nimport * as Earthstar from \"https://deno.land/x/earthstar/mod.ts\";\n```\n\nTo use with Node or apps built with NPM dependencies:\n\n```\nnpm i earthstar\n```\n\nAnd then import in your code:\n\n```ts\nimport * as Earthstar from \"earthstar\";\n```\n\n## Development\n\n### Setup\n\nYou will need Deno installed.\n[Instructions for installation can be found here](https://deno.land/#installation).\nYou may also want type-checking and linting from Deno for your IDE, which you\ncan get with extensions\n[like this one for VSCode](https://deno.land/manual@v1.17.2/vscode_deno).\n\nTo check that you've got everything set up correctly:\n\n`make example`\n\nThis will run the example script at `example-app.ts`, and you will see a lot of\ncolourful log messages from the app.\n\n### Scripts\n\nScripts are run with the `make` command.\n\n- `make test` - Run all tests\n- `make test-watch` - Run all tests in watch mode\n- `make fmt` - Format all code in the codebase\n- `make npm` - Create a NPM package in `npm` and run tests against it (requires\n  Node v14 or v16 to be installed).\n- `make bundle` - Create a bundled browser script at `earthstar.bundle.js`\n- `make depchart` - Regenerate the dependency chart images\n- `make coverage` - Generate code test coverage statistics\n- `make clean` - Delete generated files\n\n### Orientation\n\n- The entry for the package can be found at `mod.ts`.\n- Most external dependencies can be found in `deps.ts`. All other files import\n  external dependencies from this file.\n- Script definitions can be found in `Makefile`.\n- Tests are all in `src/test/`\n- The script for building the NPM package can be found in `scripts/build_npm.ts`\n\n### Uint8Arrays and Buffers\n\nWe use Uint8Arrays throughout the code to maximize platform support. Some of the\nnode-specific drivers use Buffers internally but the Buffers are converted to\nUint8Arrays before leaving those drivers.\n\nFor convenience, variables that hold Uint8Arrays are called \"bytes\", like\n`bytesToHash` instead of `uint8ArrayToHash`.\n\n`util/bytes.ts` has a bunch of helper code to do common operations on\nUint8Arrays and to convert them back and forth to strings and to Buffers.\n\n### Platform-specific tests\n\nDrivers are tested against the runtimes they're intended for. When tests are\nrun, they pull the correct scenarios from 'src/test/test-scenarios.ts', where\nthe current runtime is inferred during runtime.\n\n### Classes\n\nThe `Replica` is the main star of the show. Classes to the right are used\ninternally for its implementation. Classes to the left stack on top of an\n`Replica` to do extra things to it (subscribe to changes, cache data, etc).\n\nEach `Replica` holds the Docs for one Share.\n\n![](classes.png)\n\nNames starting with `I` are interfaces; there are one or multiple actual classes\nthat implement those interfaces.\n\nThe orange classes are \"drivers\" which have multiple implementations to choose\nfrom, for different platforms (node, browser, etc).\n\nBlue arrows show which functions call each other.\n\nThick black arrows show which classes have pointers to other classes when\nthey're running.\n\n### Source code dependency chart\n\nA --> B means \"file A imports file B\".\n\nFor readability this hides `/test/` and `/util/` and `*-types.ts`.\n\n![](depchart/depchart-no-types.png)\n\nAnd again with 3rd party dependencies as brown boxes with dotted lines, and\nincluding `*-types.ts`\n\n![](depchart/depchart-deps.png)\n\nRun `yarn depchart` to regenerate this. You'll need graphviz installed.\n\n### Platform-specific drivers\n\nThere are two parts of stone-soup which are swappable to support different\nplatforms or backends: `IReplica` and `IReplicaDriver`. Everything else should\nwork on all platforms.\n\nCrypto drivers:\n\n- `ReplicaDriverChloride` - only in browser, Node\n- `ReplicaDriverNode` - only in Node\n- `ReplicaDriverNoble` - universal\n\nStorage drivers:\n\n- `ReplicaDriverMemory` - univeral\n- `ReplicaDriverLocalStorage` - browser\n- `ReplicaDriverIndexedDB` - browser\n- `ReplicaDriverSqlite` - Node, Deno\n\nUsers of this library have to decide which of these drivers to import and use in\ntheir app.\n\n### Documentation\n\nWe use JSDoc for user documentation. You can view docs for the whole codebase at\nhttps://doc.deno.land/https://deno.land/x/stone_soup@v8.0.0/mod.ts, or by\nrunning the following from the root of the project:\n\n```\ndeno doc mod.ts\n```\n\nJSDocs are intended for end-users of the library. Comments for contributors\nworking with the codebase — e.g. notes on how something is implemented — are\nbetter as standard JS comments.\n\nIf possible, use a single line for the JSDoc. Example:\n\n```ts\n/** Does something great */\nexport function doSomething() {\n  // ...\n}\n```\n\nYou can use markdown inside of JSDoc block. While markdown supports HTML tags,\nit is forbidden in JSDoc blocks.\n\nCode string literals should be braced with the back-tick (\\`) instead of quotes.\nFor example:\n\n```ts\n/** Import something from the `earthstar` module. */\n```\n\nIt's not necessary to document function arguments unless an extra explanation is\nwarranted. Therefore `@param` should generally not be used. If `@param` is used,\nit should not include the `type` as TypeScript is already strongly typed.\n\n```ts\n/**\n * Function with non obvious param.\n * @param nonObvious Description of non obvious parameter.\n */\n```\n\nCode examples should utilize markdown format, like so:\n\n````ts\n/** A straight forward comment and an example:\n * ```ts\n * import { Crypto } from \"stone-soup\";\n * const keypair = Crypto.generateAuthorKeypair(\"suzy\");\n * ```\n */\n````\n\nCode examples should not contain additional comments and must not be indented.\nIt is already inside a comment. If it needs further comments it is not a good\nexample.\n\nExported functions should use the `function` keyword, and not be defined as\ninline functions assigned to variables. The main reason for this being that they\nare then correctly categorised as functions.\n\n### Publishing to NPM\n\n1. Run `make VERSION=\"version.number.here\" npm`, where `version.number.here` is\n   the desired version number for the package.\n2. `cd npm`\n3. `npm publish`\n\n## Changes from Earthstar v1\n\n### Splitting `Storage` into `Replica` and `ReplicaDriver` classes\n\nThink of this as `IStorageNiceAPIFullOfComplexity` and\n`IStorageSimpleLowLevelDriver`.\n\nI want to make it easier to add new kinds of storage so I'm splitting IStorage\ninto two parts:\n\nThe Storage does:\n\n- the complex annoying stuff we only want to write once\n- `set():` sign and add a document\n- `ingest():` validate and accept a document from the outside\n- user-friendly helper functions, getters, setters\n- an event bus that other things can subscribe to, like QueryFollowers\n\nThe StorageDriver does:\n\n- simple stuff, so we can make lots of drivers\n- query for documents (this is actually pretty complicated)\n- maintain indexes for querying (hopefully provided by the underlying storage\n  technology)\n- simple upsert of a document with no smartness\n\nPossibly even you can have multiple Storages for one Driver, for example when\nyou're using multiple tabs with indexedDb or localStorage.\n\n### \"Reliable indexing / streaming\"\n\nThis shows an implementation of the \"reliable indexing\" idea discussed in\n[this issue](https://github.com/earthstar-project/earthstar/issues/66).\n\n#### The problem\n\nWe have livestreaming now, over the network and also to local subscribers, all\nbased on `onWrite` events.\n\nIf you miss some events, you can't recover -- you have to do a full batch\ndownload of every document.\n\nEvents also don't tell you what was overwritten, which you might need to know to\nupdate a Layer or index.\n\n#### The solution: `localIndex`\n\nEach Storage keeps track of the order that it receives documents, and assignes\neach doc a `localIndex` value which starts at 1 and increments from there with\nevery newly written doc.\n\nThis puts the documents in a nice stable linear order that can be used to\nreliably stream, and resume streaming, from the Storage.\n\nWhen we get a new version of a document, it gets a new `localIndex` and goes at\nthe end of the sequence, and the old version vanishes, leaving a gap in the\nsequence. It's ok that there are gaps.\n\nThe `localIndex` is particular to a certain IStorage. It's kept in the `Doc`\nobject but it's not really part of it; it's not included in the signature. It's\nthis IStorage's metadata about that document. When syncing, it's sent as one of\nthe \"extra fields\"\n[(newly added to the specification)](https://earthstar-docs.netlify.app/docs/reference/earthstar-specification/#extra-fields-for-syncing),\nobserved by the receiving peer, then discarded and overwritten with the\nreceiving peer's own latest `localIndex` number.\n\n#### Use cases\n\n1. Streaming sync between peers, which can be interrupted and resumed\n1. Layers and indexes that use a QueryFollower to subscribe to changes in a\n   Storage. These might store their indexes in localStorage, for example, and\n   would therefore want to resume indexing instead of starting over from\n   scratch.\n1. React components that need to know when to re-render\n\nFor use cases where the listener will never have any downtime, they don't really\nneed to be able to resume, they can just listen for events from the Storage\ninstead and it may be more efficient. For example a React component could listen\nfor events about a particular document instead of making a whole QueryFollower\nthat has to go through every single change to find changes to that particular\ndocument.\n\n#### Properties of the `localIndex` sequence\n\nThe docs, sorted by `localIndex` on a particular peer, have these properties:\n\n**Properties**\n\n1. The docs are in a stable order that does not change, except:\n1. Newly added or changed docs go at the end, increasing the highest\n   `localIndex` by 1.\n1. When a doc is updated (same author and same path, but newer timestamp), we\n   discard the old version. So we leave a gap in the sequence where the old\n   verison used to be, and the new version goes on the end of the sequence.\n1. The first doc has a `localIndex` of zero, unless it was later changed, in\n   which case there will be a gap at zero.\n\nWhy do all this? The goal is to be able to catch up to changes since the last\ntime we looked at a Storage. We can do that by remembering the highest\n`localIndex` we saw last time, and now getting all the docs later than that in\nthe sequence. We always read this sequence from old to new (in increasing order\nof `localIndex`.\n\nThere are not really any other nice properties about this sequence:\n\n**Downsides**\n\n1. The `localIndex` order is not sorted by `path`, `timestamp`, `author`, or any\n   other useful property. The order is jumbled because docs can be received in\n   any order during a sync, perhaps with multiple other peers simultaneously,\n   perhaps some using Sync Filters to only get some docs...\n1. The order is different on every peer (that's why it's \"local\").\n1. The history docs for a certain path will be in a jumbled order in the\n   `localIndex` sequence. The Latest doc for a path can be before or after the\n   other history docs. User of QueryFollowers will need some bookeeping to\n   remember which version is the Latest for each path, if they care (e.g. if\n   it's being used as an index and not just a sync mechanism between peers).\n1. When a doc is modified and the old one is deleted, leaving a gap, you do not\n   get notified about the gap. There is no pointer back to the gap, or anything.\n   Users of QueryFollowers are expected to have some kind of index so they can\n   notice that the new doc overwrites the old one, and delete the old one.\n1. When an ephemeral doc expires, it leaves a gap in the sequence but nothing is\n   added to the end of the sequence. Users of QueryFollowers are expected to pay\n   attention to expiration dates and delete ephemeral docs themselves. We may\n   also add an event on the Storage when a doc expires, but you could miss this\n   event if you were not listening at that moment, so you'll still have to check\n   for your own expired docs from time to time.\n1. QueryFollowers should always progress in the direction of increasing\n   `localIndex`. (They can start at 0, or the latest number, or anywhere in\n   between). This makes it simple to keep track of where to resume next time.\n   However this means we always process the oldest-received docs first, but the\n   user probably cares more about the recently-received docs.\n   - It would be possible with fancier bookeeping to make QueryFollowers that\n     track which intervals of the sequence they've visited, so they can work\n     from newest-to-oldest. But sometimes the oldest-received docs are the most\n     important (like usernames)...\n\n#### Querying by `localIndex`\n\nThis lets you easily resume where you left off. You can get batches of N docs at\na time if you want, using the `limit` option.\n\n```ts\nstorage.getDocsSinceLocalIndex(\n    startAt: LocalIndex,\n    limit?: number): Doc[];\n```\n\nThis is also how you tell a QueryFollower where to start in the sequence.\nQueryFollowers ignore the `limit` property though.\n\n(You can also still look up documents by path in the usual old way.)\n\n### Reliable streaming over the network, when syncing\n\n(Not implemented in this code yet)\n\nWhen we send docs over the network we will send the `localIndex` to help the\nother side track where they are in our own sequence. The other side will then\ndiscard the property and put their own `localIndex` on the document when they\nstore it.\n\nPeers will remember, for each other peer, which is the latest `localIndex`\nthey've seen from that peer, so they can resume syncing from there.\n\nThis is similar to how append-only logs are synced in Scuttlebutt and Hyper,\nexcept our logs have gaps.\n\n### Slightly different querying\n\nQuerying has been made more organized -- see the Query type in `types.ts`. It\nlooks a bit more like an SQL query but the pieces are written in the order they\nactually happen, so it's easier to understand.\n\nThe order is:\n\n- history (all or latest only)\n- orderBy\n- startAt (continue from a certain point)\n- filter - the same options, timestamp, pathStartswith, etc etc\n- limit\n\nAlso, the `cleanUpQuery` function is fancier and will also figure out if the\nquery will match `all`, `some`, or `nothing` documents. This helps with\noptimizations elsewhere.\n\n## Problems left to solve\n\n- Ephemeral documents disappear without leaving a trace, do we need events for\n  that?\n- An IStorage might significantly change or start over, by deleting most of its\n  local documents and choosing a different sync query. Then we'd need to tell\n  subscribers and peers that we're effectively a different IStorage now.\n  - localIndex could be a tuple `[generation, localIndex]` where generation is\n    an integer that increments on each big change like that\n  - or give each IStorage a UUID which gets randomly changed when big changes\n    happen. This would be helpful for other reasons too (to prevent echoing back\n    documents to the storage that just gave them back to us, we need to track\n    who gave them to us)\n- Syncing by `localIndex` doesn't work very well when you also have a sync\n  query, because you have to scan the entire sequence to find the couple of docs\n  you care about. We probably still want another way of efficient syncing that\n  goes in path order and uses hashing in some clever way, sort of like a Merkle\n  tree but not.\n\n## Other small improvements\n\n- The `Document` type is now named `Doc` to avoid collision with an existing\n  built-in Typescript type\n","readmeFilename":"README.md","gitHead":"a178e14c48dca69002f7cb0ea634aa127bccbfb7","_id":"earthstar@10.0.0-beta.6","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-sPia2/fZtegdn3u3bWSmFgOsatSL7Wjaobd+iRHj9UhBzz3Wdb0vNMrQYVkiqUwCULIUPQ3bKxpdBwSW93WLvg==","shasum":"6889862a864a8f47e8ee6a0dbd73d7cd581e1513","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.0.0-beta.6.tgz","fileCount":282,"unpackedSize":1158021,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGdiXx2AmkhZ9rgjjYjPQQLZILTAkg/I43or5cxeBMZEAiBGDMFd/iskf3Gckh1/IWsHWCcYp2GXYLB6F1LB5jud8Q=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjf3NwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqJhg//QJIzCVoYf1XHze93ujJQ09BIUTkRVbHGRVhk3V20qk2zuU/y\r\n9nEWPnjMQ5HC3oPXVp2U+ttLJAhONkMvlkrzd/OzvyEqOfvGiQ0dvI/04ZwK\r\nnH5WAYDkpDkAOCNrwB+jUr9yrPR+y+ubjn/DvTtybH4+Wj/pK0xEIB4L60E1\r\nGt18xCI0oMP+GrEnrK8JLeRuTAQKdn3SsA56VunC/9PwaQ0EFPvyCxojLVoN\r\n5Q7da/IPSbZjfUUruOy9DOHM5hu1EJqBHKe59wKmnLP8NQn4nHLxLJwobYH1\r\nMDb/tcgBS+IoXYX3XHhAy9ZDdPmCx5t+nFsWpJfNoPS4dc7Ni8az086muBqd\r\nitee4RQn+twlzjBJBfDl8rw2FjZ03X327KMarZyFy43YReFNiNwTodTxBuht\r\ngDQqHW9FzmKzxs3lJccnW1wz/dtOfO18h2lV/CY5Ap+KP+1igay8XTYxgJi1\r\nDM5yzFXHUjyQcB2PjGUjHFqx+49MGSEWXDOuz074yJBPYvhmdW5Tmes+RZRG\r\nPIavDvbHAWoYKHpqv2TYTIO/DowqFzoxXZoLD+3HDnAn2Jrj9bIfN8dc68Qo\r\na5f9AB0pxjS+eZc6mTbozj4PoJnsIFj+Xi92r7iw1sDLmDwoKJyFW8cBMR6S\r\n69g05GZe2VX/26DfxcT5heDYurqV6nzg4Ks=\r\n=DOj4\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.0.0-beta.6_1669297008615_0.3086514772745559"},"_hasShrinkwrap":false},"10.0.0-beta.7":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"10.0.0-beta.7","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"16.11.37","chalk":"4.1.2","get-port":"5.1.1","path-to-regexp":"6.2.1","ws":"8.8.1","@deno/shim-deno":"~0.10.0","@deno/shim-crypto":"~0.3.1","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/ws":"8.5.3"},"exports":{".":{"import":{"default":"./esm/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"require":{"default":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"}},"./node":{"import":{"default":"./esm/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"require":{"default":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"}},"./browser":{"import":{"default":"./esm/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"},"require":{"default":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","isomorphic-blob":"1.0.1","isomorphic-undici-ponyfill":"1.0.0","@sgwilym/isomorphic-streams":"1.0.4","isomorphic-ws":"5.0.0","textencoder-ponyfill":"1.0.2"},"readme":"# Earthstar\n\nSync stuff you care about with people you know. A specification and Javascript\nlibrary for building online tools you can truly call your own.Build\noffline-first, decentralised, and private network applications in the browser,\nserver, or command-line.\n\n**Clearly there's a lot to unpack, so check out\n[Earthstar's website](https://earthstar-project.org) for an introduction to\nEarthstar's concepts, an API tour, technical documentation, videos, and more!**\n\n## Usage\n\nTo use in Deno, add the following:\n\n```ts\nimport * as Earthstar from \"https://deno.land/x/earthstar/mod.ts\";\n```\n\nTo use with Node or apps built with NPM dependencies:\n\n```\nnpm i earthstar\n```\n\nAnd then import in your code:\n\n```ts\nimport * as Earthstar from \"earthstar\";\n```\n\n## Development\n\n### Setup\n\nYou will need Deno installed.\n[Instructions for installation can be found here](https://deno.land/#installation).\nYou may also want type-checking and linting from Deno for your IDE, which you\ncan get with extensions\n[like this one for VSCode](https://deno.land/manual@v1.17.2/vscode_deno).\n\nTo check that you've got everything set up correctly:\n\n`make example`\n\nThis will run the example script at `example-app.ts`, and you will see a lot of\ncolourful log messages from the app.\n\n### Scripts\n\nScripts are run with the `make` command.\n\n- `make test` - Run all tests\n- `make test-watch` - Run all tests in watch mode\n- `make fmt` - Format all code in the codebase\n- `make npm` - Create a NPM package in `npm` and run tests against it (requires\n  Node v14 or v16 to be installed).\n- `make bundle` - Create a bundled browser script at `earthstar.bundle.js`\n- `make depchart` - Regenerate the dependency chart images\n- `make coverage` - Generate code test coverage statistics\n- `make clean` - Delete generated files\n\n### Orientation\n\n- The entry for the package can be found at `mod.ts`.\n- Most external dependencies can be found in `deps.ts`. All other files import\n  external dependencies from this file.\n- Script definitions can be found in `Makefile`.\n- Tests are all in `src/test/`\n- The script for building the NPM package can be found in `scripts/build_npm.ts`\n\n### Uint8Arrays and Buffers\n\nWe use Uint8Arrays throughout the code to maximize platform support. Some of the\nnode-specific drivers use Buffers internally but the Buffers are converted to\nUint8Arrays before leaving those drivers.\n\nFor convenience, variables that hold Uint8Arrays are called \"bytes\", like\n`bytesToHash` instead of `uint8ArrayToHash`.\n\n`util/bytes.ts` has a bunch of helper code to do common operations on\nUint8Arrays and to convert them back and forth to strings and to Buffers.\n\n### Platform-specific tests\n\nDrivers are tested against the runtimes they're intended for. When tests are\nrun, they pull the correct scenarios from 'src/test/test-scenarios.ts', where\nthe current runtime is inferred during runtime.\n\n### Classes\n\nThe `Replica` is the main star of the show. Classes to the right are used\ninternally for its implementation. Classes to the left stack on top of an\n`Replica` to do extra things to it (subscribe to changes, cache data, etc).\n\nEach `Replica` holds the Docs for one Share.\n\n![](classes.png)\n\nNames starting with `I` are interfaces; there are one or multiple actual classes\nthat implement those interfaces.\n\nThe orange classes are \"drivers\" which have multiple implementations to choose\nfrom, for different platforms (node, browser, etc).\n\nBlue arrows show which functions call each other.\n\nThick black arrows show which classes have pointers to other classes when\nthey're running.\n\n### Source code dependency chart\n\nA --> B means \"file A imports file B\".\n\nFor readability this hides `/test/` and `/util/` and `*-types.ts`.\n\n![](depchart/depchart-no-types.png)\n\nAnd again with 3rd party dependencies as brown boxes with dotted lines, and\nincluding `*-types.ts`\n\n![](depchart/depchart-deps.png)\n\nRun `yarn depchart` to regenerate this. You'll need graphviz installed.\n\n### Platform-specific drivers\n\nThere are two parts of stone-soup which are swappable to support different\nplatforms or backends: `IReplica` and `IReplicaDriver`. Everything else should\nwork on all platforms.\n\nCrypto drivers:\n\n- `ReplicaDriverChloride` - only in browser, Node\n- `ReplicaDriverNode` - only in Node\n- `ReplicaDriverNoble` - universal\n\nStorage drivers:\n\n- `ReplicaDriverMemory` - univeral\n- `ReplicaDriverLocalStorage` - browser\n- `ReplicaDriverIndexedDB` - browser\n- `ReplicaDriverSqlite` - Node, Deno\n\nUsers of this library have to decide which of these drivers to import and use in\ntheir app.\n\n### Documentation\n\nWe use JSDoc for user documentation. You can view docs for the whole codebase at\nhttps://doc.deno.land/https://deno.land/x/stone_soup@v8.0.0/mod.ts, or by\nrunning the following from the root of the project:\n\n```\ndeno doc mod.ts\n```\n\nJSDocs are intended for end-users of the library. Comments for contributors\nworking with the codebase — e.g. notes on how something is implemented — are\nbetter as standard JS comments.\n\nIf possible, use a single line for the JSDoc. Example:\n\n```ts\n/** Does something great */\nexport function doSomething() {\n  // ...\n}\n```\n\nYou can use markdown inside of JSDoc block. While markdown supports HTML tags,\nit is forbidden in JSDoc blocks.\n\nCode string literals should be braced with the back-tick (\\`) instead of quotes.\nFor example:\n\n```ts\n/** Import something from the `earthstar` module. */\n```\n\nIt's not necessary to document function arguments unless an extra explanation is\nwarranted. Therefore `@param` should generally not be used. If `@param` is used,\nit should not include the `type` as TypeScript is already strongly typed.\n\n```ts\n/**\n * Function with non obvious param.\n * @param nonObvious Description of non obvious parameter.\n */\n```\n\nCode examples should utilize markdown format, like so:\n\n````ts\n/** A straight forward comment and an example:\n * ```ts\n * import { Crypto } from \"stone-soup\";\n * const keypair = Crypto.generateAuthorKeypair(\"suzy\");\n * ```\n */\n````\n\nCode examples should not contain additional comments and must not be indented.\nIt is already inside a comment. If it needs further comments it is not a good\nexample.\n\nExported functions should use the `function` keyword, and not be defined as\ninline functions assigned to variables. The main reason for this being that they\nare then correctly categorised as functions.\n\n### Publishing to NPM\n\n1. Run `make VERSION=\"version.number.here\" npm`, where `version.number.here` is\n   the desired version number for the package.\n2. `cd npm`\n3. `npm publish`\n\n## Changes from Earthstar v1\n\n### Splitting `Storage` into `Replica` and `ReplicaDriver` classes\n\nThink of this as `IStorageNiceAPIFullOfComplexity` and\n`IStorageSimpleLowLevelDriver`.\n\nI want to make it easier to add new kinds of storage so I'm splitting IStorage\ninto two parts:\n\nThe Storage does:\n\n- the complex annoying stuff we only want to write once\n- `set():` sign and add a document\n- `ingest():` validate and accept a document from the outside\n- user-friendly helper functions, getters, setters\n- an event bus that other things can subscribe to, like QueryFollowers\n\nThe StorageDriver does:\n\n- simple stuff, so we can make lots of drivers\n- query for documents (this is actually pretty complicated)\n- maintain indexes for querying (hopefully provided by the underlying storage\n  technology)\n- simple upsert of a document with no smartness\n\nPossibly even you can have multiple Storages for one Driver, for example when\nyou're using multiple tabs with indexedDb or localStorage.\n\n### \"Reliable indexing / streaming\"\n\nThis shows an implementation of the \"reliable indexing\" idea discussed in\n[this issue](https://github.com/earthstar-project/earthstar/issues/66).\n\n#### The problem\n\nWe have livestreaming now, over the network and also to local subscribers, all\nbased on `onWrite` events.\n\nIf you miss some events, you can't recover -- you have to do a full batch\ndownload of every document.\n\nEvents also don't tell you what was overwritten, which you might need to know to\nupdate a Layer or index.\n\n#### The solution: `localIndex`\n\nEach Storage keeps track of the order that it receives documents, and assignes\neach doc a `localIndex` value which starts at 1 and increments from there with\nevery newly written doc.\n\nThis puts the documents in a nice stable linear order that can be used to\nreliably stream, and resume streaming, from the Storage.\n\nWhen we get a new version of a document, it gets a new `localIndex` and goes at\nthe end of the sequence, and the old version vanishes, leaving a gap in the\nsequence. It's ok that there are gaps.\n\nThe `localIndex` is particular to a certain IStorage. It's kept in the `Doc`\nobject but it's not really part of it; it's not included in the signature. It's\nthis IStorage's metadata about that document. When syncing, it's sent as one of\nthe \"extra fields\"\n[(newly added to the specification)](https://earthstar-docs.netlify.app/docs/reference/earthstar-specification/#extra-fields-for-syncing),\nobserved by the receiving peer, then discarded and overwritten with the\nreceiving peer's own latest `localIndex` number.\n\n#### Use cases\n\n1. Streaming sync between peers, which can be interrupted and resumed\n1. Layers and indexes that use a QueryFollower to subscribe to changes in a\n   Storage. These might store their indexes in localStorage, for example, and\n   would therefore want to resume indexing instead of starting over from\n   scratch.\n1. React components that need to know when to re-render\n\nFor use cases where the listener will never have any downtime, they don't really\nneed to be able to resume, they can just listen for events from the Storage\ninstead and it may be more efficient. For example a React component could listen\nfor events about a particular document instead of making a whole QueryFollower\nthat has to go through every single change to find changes to that particular\ndocument.\n\n#### Properties of the `localIndex` sequence\n\nThe docs, sorted by `localIndex` on a particular peer, have these properties:\n\n**Properties**\n\n1. The docs are in a stable order that does not change, except:\n1. Newly added or changed docs go at the end, increasing the highest\n   `localIndex` by 1.\n1. When a doc is updated (same author and same path, but newer timestamp), we\n   discard the old version. So we leave a gap in the sequence where the old\n   verison used to be, and the new version goes on the end of the sequence.\n1. The first doc has a `localIndex` of zero, unless it was later changed, in\n   which case there will be a gap at zero.\n\nWhy do all this? The goal is to be able to catch up to changes since the last\ntime we looked at a Storage. We can do that by remembering the highest\n`localIndex` we saw last time, and now getting all the docs later than that in\nthe sequence. We always read this sequence from old to new (in increasing order\nof `localIndex`.\n\nThere are not really any other nice properties about this sequence:\n\n**Downsides**\n\n1. The `localIndex` order is not sorted by `path`, `timestamp`, `author`, or any\n   other useful property. The order is jumbled because docs can be received in\n   any order during a sync, perhaps with multiple other peers simultaneously,\n   perhaps some using Sync Filters to only get some docs...\n1. The order is different on every peer (that's why it's \"local\").\n1. The history docs for a certain path will be in a jumbled order in the\n   `localIndex` sequence. The Latest doc for a path can be before or after the\n   other history docs. User of QueryFollowers will need some bookeeping to\n   remember which version is the Latest for each path, if they care (e.g. if\n   it's being used as an index and not just a sync mechanism between peers).\n1. When a doc is modified and the old one is deleted, leaving a gap, you do not\n   get notified about the gap. There is no pointer back to the gap, or anything.\n   Users of QueryFollowers are expected to have some kind of index so they can\n   notice that the new doc overwrites the old one, and delete the old one.\n1. When an ephemeral doc expires, it leaves a gap in the sequence but nothing is\n   added to the end of the sequence. Users of QueryFollowers are expected to pay\n   attention to expiration dates and delete ephemeral docs themselves. We may\n   also add an event on the Storage when a doc expires, but you could miss this\n   event if you were not listening at that moment, so you'll still have to check\n   for your own expired docs from time to time.\n1. QueryFollowers should always progress in the direction of increasing\n   `localIndex`. (They can start at 0, or the latest number, or anywhere in\n   between). This makes it simple to keep track of where to resume next time.\n   However this means we always process the oldest-received docs first, but the\n   user probably cares more about the recently-received docs.\n   - It would be possible with fancier bookeeping to make QueryFollowers that\n     track which intervals of the sequence they've visited, so they can work\n     from newest-to-oldest. But sometimes the oldest-received docs are the most\n     important (like usernames)...\n\n#### Querying by `localIndex`\n\nThis lets you easily resume where you left off. You can get batches of N docs at\na time if you want, using the `limit` option.\n\n```ts\nstorage.getDocsSinceLocalIndex(\n    startAt: LocalIndex,\n    limit?: number): Doc[];\n```\n\nThis is also how you tell a QueryFollower where to start in the sequence.\nQueryFollowers ignore the `limit` property though.\n\n(You can also still look up documents by path in the usual old way.)\n\n### Reliable streaming over the network, when syncing\n\n(Not implemented in this code yet)\n\nWhen we send docs over the network we will send the `localIndex` to help the\nother side track where they are in our own sequence. The other side will then\ndiscard the property and put their own `localIndex` on the document when they\nstore it.\n\nPeers will remember, for each other peer, which is the latest `localIndex`\nthey've seen from that peer, so they can resume syncing from there.\n\nThis is similar to how append-only logs are synced in Scuttlebutt and Hyper,\nexcept our logs have gaps.\n\n### Slightly different querying\n\nQuerying has been made more organized -- see the Query type in `types.ts`. It\nlooks a bit more like an SQL query but the pieces are written in the order they\nactually happen, so it's easier to understand.\n\nThe order is:\n\n- history (all or latest only)\n- orderBy\n- startAt (continue from a certain point)\n- filter - the same options, timestamp, pathStartswith, etc etc\n- limit\n\nAlso, the `cleanUpQuery` function is fancier and will also figure out if the\nquery will match `all`, `some`, or `nothing` documents. This helps with\noptimizations elsewhere.\n\n## Problems left to solve\n\n- Ephemeral documents disappear without leaving a trace, do we need events for\n  that?\n- An IStorage might significantly change or start over, by deleting most of its\n  local documents and choosing a different sync query. Then we'd need to tell\n  subscribers and peers that we're effectively a different IStorage now.\n  - localIndex could be a tuple `[generation, localIndex]` where generation is\n    an integer that increments on each big change like that\n  - or give each IStorage a UUID which gets randomly changed when big changes\n    happen. This would be helpful for other reasons too (to prevent echoing back\n    documents to the storage that just gave them back to us, we need to track\n    who gave them to us)\n- Syncing by `localIndex` doesn't work very well when you also have a sync\n  query, because you have to scan the entire sequence to find the couple of docs\n  you care about. We probably still want another way of efficient syncing that\n  goes in path order and uses hashing in some clever way, sort of like a Merkle\n  tree but not.\n\n## Other small improvements\n\n- The `Document` type is now named `Doc` to avoid collision with an existing\n  built-in Typescript type\n","readmeFilename":"README.md","gitHead":"a92d4ab7a7a9bc76ccc9c63f114385fe2c5a5695","_id":"earthstar@10.0.0-beta.7","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-/6Wb4LOp7tm8pSq1zc3Lg5zIFJMs+SVqUCsB4chiOiNkl62ayx8xmbLRt+Wzpo6pAb6FEo7XshyRl9kch7hBjQ==","shasum":"f35348e411bb307ec7be8b52eab45617de808bfe","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.0.0-beta.7.tgz","fileCount":282,"unpackedSize":1162076,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAKhF0l4wYVm7ISEg5lwg4BTskhFtPMm0Zyyf4hkNZEvAiAiN9dtgEjyn9L4Vibr/8/lRSdgmgx2Z+rWz62QfFRKgQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjkajHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrh5w/+JNqDmz+vBGoinwqWAZa5mbIQ6GgntcfGwUjqL6mwXuUIz71o\r\n7RWBAxz1b5ZkCZzUG9RAhsSSxL7pNoNXEasX8sYrcW9e2xlmjQExIWwPUZt+\r\nbuP5p/JxtcLLtfutANE3/KMGnvVvPqeWjTyZh0oLeZi6UHL5ZSHe3vpCV4cc\r\n/PhfqHAqxPOggRnelim9N8HDP9jn90Bk/dm6k6ZouwVAnDrQXAqEKCGTBtkL\r\nIoeyeYtszrKU6WOl3XXU5C1nDNV2uJac2/oIyA9xwi9pRV7c5btfKF+IHa5t\r\notip40SLrdXHZ17YMs5UlCvTygdoqF7IbgjtR51cCR0DynvwdGTXjFFuxRT7\r\n74rDiPWgGs38fkwEKhKE7qxbNSQEMvCsY0WrCNAIqVFjfPA5rDyPWuK4D/2O\r\n5AXp1n7t9AHFxG3RZOKlQ0jWnbeZTw7BRUe3Stz1PnWPnPuCXQHsEpKvwJQU\r\nOcikqCC6RE1GcLEojpYWlLDWF6i1XLrf8JtZs6omnh8hBfFclZLDZOSIX5uK\r\npQ/eZT7p8G0/FFoNpHIKlSUwq6GNULWrki4ZfW6YUMnivrqzmgS+8eyjXZrm\r\n95ODIltBmZf0yNpbAtmQ3euaygN1ZStbseKJc/8/aXkKdKpu72w5M8g/9L+g\r\nnurDrAjJbcJm1A5g1H066Bvkkap3eIXNy6Q=\r\n=YdkZ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.0.0-beta.7_1670490311520_0.42032508203387353"},"_hasShrinkwrap":false},"10.0.0-beta.8":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"10.0.0-beta.8","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"16.11.37","chalk":"4.1.2","get-port":"5.1.1","path-to-regexp":"6.2.1","@deno/shim-deno":"~0.10.0","@deno/shim-crypto":"~0.3.1","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/ws":"8.5.3"},"exports":{".":{"import":{"default":"./esm/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"require":{"default":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"}},"./node":{"import":{"default":"./esm/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"require":{"default":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"}},"./browser":{"import":{"default":"./esm/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"},"require":{"default":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","ws":"8.8.1","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","isomorphic-blob":"1.0.1","isomorphic-undici-ponyfill":"1.0.0","@sgwilym/isomorphic-streams":"1.0.4","isomorphic-ws":"5.0.0","textencoder-ponyfill":"1.0.2","@sgwilym/urlpattern-polyfill":"1.0.0-rc8"},"readme":"# Earthstar\n\n[Earthstar](https://earthstar-project.org) is a small and resilient distributed\nstorage protocol designed with a strong focus on simplicity and versatility,\nwith the social realities of peer-to-peer computing kept in mind.\n\nThis is a reference implementation written in Typescript. You can use it to add\nEarthstar functionality to applications running on servers, browsers, the\ncommand line, or anywhere else JavaScript can be run.\n\n[Detailed API documentation for this module can be found here](TODO).\n\nThis document is concerned with the usage of this module's APIs. To learn more\nabout what Earthstar is, please see these links:\n\n- [What is Earthstar?](TODO)\n- [How does Earthstar work?](TODO)\n\nTo learn more about running Earthstar servers, see\n[README_SERVERS](README_SERVERS.md)\n\nTo learn more about this codebase, please see [ARCHITECTURE](ARCHITECTURE.md).\n\nTo learn about contributing to this codebase, please see\n[CONTRIBUTING](CONTRIBUTING.md).\n\n## Table of contents\n\n## Importing the module\n\nIt can be imported via URL into a browser:\n\n```html\n<script type=\"module\">\n  import * as Earthstar from \"https://cdn.earthstar-project.org/js/earthstar.bundle.v10.0.0.js\";\n</script>\n```\n\nOr Deno:\n\n```ts\nimport * as Earthstar from \"https://deno.land/x/earthstar@v10.0.0/mod.ts\";`}\n```\n\n> Earthstar's syncing does not work with version of Deno between 1.27.0 - 1.28.1\n> (inclusive) due to a regression in these versions' WebSocket implementation.\n\nor installed with NPM:\n\n```bash\n{`npm install earthstar@${LATEST_EARTHSTAR_VERSION}`}\n```\n\nWe recommend the browser and Deno versions. This module has been built with many\nstandard web APIs that have need to be polyfilled to work in Node.\n\n## Instantiating a replica\n\n`Replica` is the central API of this module. It is used to write and read data\nto a locally persisted copy of a share's data, and much more besides.\n\nTo instantiate a replica, you will need knowledge of a share's public address.\n\n```ts\nimport { Replica, ReplicaDriverMemory } from \"earthstar\";\n\nconst replica = new Replica({\n  driver: ReplicaDriverMemory(YOUR_SHARE_ADDRESS),\n  shareSecret: YOUR_SHARE_SECRET,\n});\n```\n\nThe `shareSecret` property is optional. If we omit it, the replica will be\nread-only.\n\n### Generating share keypairs\n\nYou can create new shares whenever you want.\n\n```ts\nimport { Crypto } from \"earthstar\";\n\nconst shareKeypair = await Crypto.generateShareKeypair(\"gardening\");\n```\n\nThe result of this operation will either be a `ShareKeypair` object with\n`shareAddress` and `secret` properties, or a `ValidationError`.\n\n### Persisting data with drivers\n\n`Replica` must always be instantiated with a driver. These drivers tell the\n`Replica` how to store and retrieve data, with different drivers using different\nstorage mechanisms.\n\nHere are the available drivers:\n\n- `ReplicaDriverMemory` (works in all environments, but only stores data in\n  memory)\n- `ReplicaDriverWeb` (works in the browser, stores data with IndexedDB)\n- `ReplicaDriverFs` (works on runtimes with filesystem access, stores data with\n  Sqlite and the filesystem)\n\nDrivers are made of two sub-drivers: one for documents, and one for attachments\n(arbitrary binary data).\n\nThere are some extra document drivers not used in the default drivers:\n\n- `DocDriverLocalStorage` (works in runtimes supporting the WebStorage API)\n- `DocDriverSqliteFFI` (works in Deno, stores data with a FFI implementation of\n  Sqlite, requires using the `--unstable` flag, and is faster than the default\n  driver in `ReplicaDriverFs`)\n\nThese document drivers can be used like this:\n\n```ts\nconst driver: IReplicaDriver = {\n  docDriver: new DocDriverSqliteFfi(SHARE_ADDR, FS_PATH),\n  attachmentDriver: new AttachmentDriverFs(FS_ATTACHMENTS_PATH),\n};\n\nconst replica = new Replica({ driver });\n```\n\n## Writing data\n\nWriting data requires two things:\n\n- A replica configured with a valid share secret\n- An author keypair\n\nAuthor keypairs can be generated like this:\n\n```ts\nimport { Crypto } from \"earthstar\";\n\nconst authorKeypair = await Crypto.generateAuthorKeypair(\"suzy\");\n```\n\nThe result will be a new `AuthorKeypair` object with `address` and `secret`\nproperties, or a `ValidationError`.\n\nWith a valid author keypair you can write data using `Replica.set`:\n\n```ts\nconst setResult = await replica.set(authorKeypair, {\n  path: \"/my-note\",\n  text: \"Saw seven magpies today\",\n});\n```\n\nThe result of this operation is either an `IngestEvent` describing the\noperation's success (or failure, if one of the parameters was invalid in some\nway).\n\n## Wiping data\n\nOnce written, data can be removed by overwriting it:\n\n```ts\nawait replica.set(authorKeypair, {\n  path: \"/my-note\",\n  text: \"\",\n});\n```\n\nOr with the convenience method:\n\n```ts\nawait replica.wipeDocAtPath(authorKeypair, \"/my-note\");\n```\n\n### Creating ephemeral documents\n\nThere is another way to remove written data without leaving any trace of it.\n\nEphemeral documents are held by replicas until a specified time, until at which\npoint they are deleted.\n\n```ts\nawait replica.set(authorKeypair, {\n  path: \"/my-temporary-note!\",\n  text: \"I accidentally stepped on the strawberries.\",\n  deleteAfter: TIME_IN_MICROSECONDS,\n});\n```\n\nTo set an ephemeral document, the path _must_ contain a `!`, and the\n`deleteAfter` property must be set with a timestamp in _microseconds_.\n\n## Querying data\n\nThere are many ways to get data back out of a Replica. The simplest one is\n`Replica.getAllDocs`:\n\n```ts\nconst everything = await replica.getAllDocs();\n```\n\nThe most powerful is `Replica.queryDocs`:\n\n```ts\nconst mostRecentlyEditedWikiPageDocs = await replica.queryDocs({\n  historyMode: \"latest\",\n  filter: {\n    pathStartsWith: \"/wiki\",\n  },\n  limit: 10,\n});\n```\n\nHere are all the querying methods on `Replica`:\n\n- `getAllDocs`\n- `getLatestDocs`\n- `getAllDocsAtPath`\n- `getLatestDocAtPath`\n- `queryDocs`\n- `queryPaths`\n- `queryAuthors`\n\nDetailed API documentation for all of them can be found [here](TODO).\n\n## Using document contents\n\nThe documents returned by queries are plain objects with the following shape:\n\n```ts\ntype Doc = {\n  /** Which document format the doc adheres to, e.g. `es.5`. */\n  format: \"es.5\";\n  author: AuthorAddress;\n  text: string;\n  textHash: string;\n  /** When the document should be deleted, as a UNIX timestamp in microseconds. */\n  deleteAfter?: number;\n  path: Path;\n  /** Used to verify the authorship of the document. */\n  signature: Signature;\n  /** Used to verify the author knows the share's secret */\n  shareSignature: Signature;\n  /** When the document was written, as a UNIX timestamp in microseconds (millionths of a second, e.g. `Date.now() * 1000`).*/\n  timestamp: Timestamp;\n  /** The share this document is from. */\n  share: ShareAddress;\n  /** The size of the associated attachment in bytes, if any. */\n  attachmentSize?: number;\n  /** The sha256 hash of the associated attachment, if any. */\n  attachmentHash?: string;\n};\n```\n\nThough most applications will probably only use the `author`, `text`, and\n`timestamp` properties.\n\n## Syncing with other peers\n\nSyncing data with other peers requires adding your replica(s) to an instance of\n`Peer`:\n\n```ts\nimport { Peer } from \"earthstar\";\n\nconst peer = new Peer();\n\n// Pretend myReplica is an instance of `Replica`\npeer.addReplica(myReplica);\n\npeer.sync(\"https://my.server\");\n```\n\n`Peer.sync` can be passed another instance of `Peer` or a valid URL of an\nEarthstar server to sync with.\n\nThe two peers will only sync the replicas with shares they have in common.\n\nThe result of `Peer.sync` can be assigned and used to monitor the progress of\nthe sync operation:\n\n```ts\nconst syncer = peer.sync(\"https://my.server\");\n\nsyncer.onStatusChange((newStatus) => {\n  console.log(newStatus);\n});\n\nsyncer.isDone().then(() => {\n  console.log(\"Sync complete\");\n}).catch((err) => {\n  console.error(\"Sync failed\", err);\n});\n```\n\n## Using document attachments\n\nDocuments can be written along with some arbitrary data which is persisted as an\n'attachment'. Whereas a document's `text` field can hold a UTF-8 string of 8kb,\nattachments can be of any kind of data and of any size.\n\n```ts\n// Here we use Deno.readFile to get a file's contents as a Uint8Array\nconst imageData = await Deno.readFile(\"/Desktop/leaf.jpg\");\n\nawait replica.set(authorKeypair, {\n  path: \"/images/pear-leaf.jpg\",\n  text: \"A close-up of a leaf of a pear tree\",\n  attachment: imageData,\n});\n```\n\nThe path _must_ have a file extension e.g. `.jpg`, `.mp3` if it also has an\nattachment.\n\nIf we were attaching a large amount of data, we would use a `ReadableStream`\ninstead:\n\n```ts\n// Here we use Deno.readFile to get a file's contents as a ReadableStream<Uint8Array>\nconst videoFile = await Deno.open(\"/Desktop/little-mole.mp4\");\n\nawait replica.set(authorKeypair, {\n  path: \"/videos/little-mole.mp4\",\n  text: \"A close-up of a leaf of a pear tree\",\n  attachment: videoFile.readable,\n});\n```\n\n### Retrieving attachments\n\nIf you already have a document with an attachment, you can use\n`Replica.getAttachment`:\n\n```ts\nconst attachment = await replica.getAttachment(docWithAttachment);\n```\n\nThe result of this operation will be a `DocAttachment` with `getBytes` and\n`getStream` methods, undefined (if our replica has not received a copy of this\nattachment from other peers), or a `ValidationError` in case `getAttachment` was\npassed a document which can't have an attachment.\n\nIt's also possible to add attachments to many documents at once:\n\n```ts\nconst allDocs = await replica.getAllDocs();\n\nconst allDocsWithAttachments = await replica.addAttachments(allDocs);\n```\n\n`allDocsWithAttachments` will be an array of all documents with an added\n`attachment` property. The type of this property will either be `DocAttachment`,\n`undefined`, or `ValidationError`.\n\n## Subscribing to replica changes\n\nThere are many ways to subscribe to the many events a replica generates during\nits lifetime.\n\nIf you want to subscribe to updates in order to update a UI, the most ergonomic\nAPI is `ReplicaCache`:\n\n```ts\nimport { ReplicaCache } from \"earthstar\";\n\nconst replicaCache = new ReplicaCache(myReplica);\n\nconst allDocs = replicaCache.getAllDocs();\n```\n\nThe caveat is that the first time a query method is called, it _always_ returns\nan empty result. To get new updates, you must subscribe to changes. In the\nfollowing example, we build a UI with a fictitious `renderDocListUI` function\nwith the results of `ReplicaCache.getAllDocs`:\n\n```ts\nfunction triggerUIRender() {\n  const allDocs = replicaCache.getAllDocs();\n\n  renderDocListUI(allDocs);\n}\n\nreplicaCache.onCacheUpdated(() => {\n  triggerUIRender();\n});\n\ntriggerUIRender();\n```\n\nThe important thing to remember is that the callback to `onCacheUpdated` will\nnever trigger until the cache has been queried at least once.\n\nIf you're not tracking changes for a UI, `Replica.getQueryStream` returns a\n`ReadableStream` of `QuerySourceEvent`, for documents matching a specific query.\nThis API is great for creating indexes.\n\n```ts\n// Create a query stream for all docs with paths starting with /chat\n// And include all existing documents and all newly created or synced documents\nconst chatMessagesStream = replica.getQueryStream({\n  filter: { pathStartsWith: \"/chat\" },\n}, \"everything\");\n\nchatMessagesStream.pipeTo(\n  new WritableStream({\n    write(event) {\n      if (event.kind === \"success\" || event.kind === \"existing\") {\n        console.log(event.doc.text);\n      }\n    },\n  }),\n);\n```\n\nFinally, `Replica.getEventStream` returns a `ReadableStream` of `ReplicaEvent`,\nwhich includes events for new document ingestions, document expirations,\nattachment ingestions, attachment prunes, and events for when the replica is\nabout to close (and has closed).\n\n## Using common settings between clients\n\nThere are a number of configurations which most Earthstar applications will want\nto persist between runs:\n\n- The shares used\n- An author to using for signing documents\n- Servers to sync with\n\nEarthstar offers a `ClientSettings` API which persists settings for these\nbetween sessions in all runtimes supporting the WebStorage APIs:\n\n```ts\nconst settings = new ClientSettings();\n\nsettings.author = authorKeypair;\nsettings.addShare(myShareAddress);\nconsole.log(settings.servers);\n```\n\nIt also offers a method which instantiates a new `Peer` with replicas for all\nshares already added:\n\n```ts\nconst settings = new ClientSettings();\n\n// Create a peer with all saved shares and sync once with all saved servers.\nconst peer = settings.getPeer({\n  sync: \"once\",\n  onCreateReplica: (addr, secret) => {\n    return new Replica({\n      driver: new ReplicaDriverMemory(addr),\n      shareSecret: secret,\n    });\n  },\n});\n```\n\n## Checking for errors\n\nMany functions in Earthstar return errors like `ValidationError`. These errors\nare not thrown, so it's good to check for them:\n\n```ts\nimport { isErr } from \"earthstar\";\n\nconst result = replica.set(authorKeypair, {\n  path: \"/hey\",\n  text: \"Hello\",\n});\n\nif (isErr(result)) {\n  console.error(\n    \"Something went wrong when you tried to write some data!\",\n    result,\n  );\n}\n```\n\n## Changing the cryptographic driver\n\nThe Deno and browser versions of this module are configured by default to use\nthe fastest cryptographic libraries available to them. The Node version is not,\nhowever.\n\n```ts\nimport { setGlobalCryptoDriver } from \"earthstar\";\nimport { CryptoDriverChloride } from \"earthstar/node\";\n\nsetGlobalCryptoDriver(CryptoDriverChloride);\n```\n","readmeFilename":"README.md","gitHead":"c1a671080263b1487293f8e7a16d6cc3921d0fb8","_id":"earthstar@10.0.0-beta.8","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-8vrL809j0WSWFzPevRwO1xXtjcS/qJrv4zOOIxfVjI5jZNQHy/Qt2ygY4Zhx7up/kC7g37DjC2PNPGSgrbS0tQ==","shasum":"8874a8e2268ba2d1c1eda65df93316792b8a5154","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.0.0-beta.8.tgz","fileCount":348,"unpackedSize":2202105,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDgFfV9aUwgJ1KOACUeqhE1dgvSjRI4AT08XZ08GaFNPAiEAv5ezqDeVLzCmAQQchbuhAMe6oAW9prvJypbXupc57fs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjkylBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpoHg//a7dkeeUBbvsJvdN+QoYcdOEEYmw+zlQ6d79FAclKQ/nSvrfd\r\nZivrmW0fxK7Exfi3pFrpIgUWCRPJU43W6pw6dTbkhR9GL/80hDF2SzEgpPly\r\nkdUmwMfjIhVyxlIiIjhM2Q9Ob5lJVfAt8oLteIJJO1V2rpjEu70a9YQhnEQ0\r\n6JerMIW79THi3XEgybHEmk0StoA47TrcsNsr/9DpuKyoRjEh2v9i/uUJ9Jak\r\nhYb8tnuQJVvZ8JK+a9vd3z1ngryV3HN66GPOMfEkng3DQIN2LaRQhGxsTd/j\r\nb3qlQjUXC0kkG1JehmVIeCw/S2glmlrM5+cVXH6Ct9ysrIqYLluIoPJV4CZK\r\nLPVnuAdxFmwxByvrVVanmDmEC2Xe1j4h+1JnSC4OXyOpyh9UTXyYGyD+4rPz\r\nPcqF6z1+chPIZ49PHWPuh8FxN2mlm95Zi5HuqQqGoVCFOpUXjsCfSAnP12TN\r\nI065fjxF0XsJaY9FRvS+Ah1PcTS5Gugly0CtaQgvmwzf1hmcRxlyoVyezqL3\r\ngfJ37pD3FOjjGKkN46Iri0JHfDtYoXMGLeWmgs1bnSP2katPiexYCTaDL6SF\r\n2EGUcP7SFoPb9QFzP4Ms2i2VHkv2KJBmv32fhkws8YREP2Q9SZSxgpgJnWqp\r\n7TuPsH19pxpCdPCUJUkgxDdlsRWGt0Er9ko=\r\n=ChVm\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.0.0-beta.8_1670588736769_0.44178369570150067"},"_hasShrinkwrap":false},"10.0.0-rc.1":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"10.0.0-rc.1","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"16.11.37","chalk":"4.1.2","get-port":"5.1.1","path-to-regexp":"6.2.1","@deno/shim-deno":"~0.10.0","@deno/shim-crypto":"~0.3.1","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/ws":"8.5.3"},"exports":{".":{"import":{"default":"./esm/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"},"require":{"default":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts"}},"./node":{"import":{"default":"./esm/src/entries/node.js","types":"./types/src/entries/node.d.ts"},"require":{"default":"./script/src/entries/node.js","types":"./types/src/entries/node.d.ts"}},"./browser":{"import":{"default":"./esm/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"},"require":{"default":"./script/src/entries/browser.js","types":"./types/src/entries/browser.d.ts"}}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","ws":"8.8.1","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","isomorphic-blob":"1.0.1","isomorphic-undici-ponyfill":"1.0.0","@sgwilym/isomorphic-streams":"1.0.4","isomorphic-ws":"5.0.0","textencoder-ponyfill":"1.0.2","@sgwilym/urlpattern-polyfill":"1.0.0-rc8"},"gitHead":"cdc5598cfedecd56505f76245338db2280fbff7f","_id":"earthstar@10.0.0-rc.1","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-M1JdZOFZjpU7ofR2lVDDyT0XH43pys5WhkFuHEasSCafvXS4DeUKVIfkX75a9VSGFmfoR6QvfXJfY8S2hVyvSQ==","shasum":"748a1f800d7a02423251c5154bd8a25bf5d9a32c","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.0.0-rc.1.tgz","fileCount":345,"unpackedSize":2214929,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDvL1hluw8jZohfFW6Ki5fRXSP8CO9OVTyOfYIWLbzFBQIgaAkCJb+JLlPnOc4fH9aGCUi/sR5kGQEjDKiakiyFhuw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjnCflACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpr6RAApL3XPW5Wkvj/HjMDDpb59P17H3LRfNcJFeE7TzZX0SD/SmpO\r\naW/reVfFXE3WHc9CGH/0sHiv29grnnLES9IUHLkptC5sF48BtThwDg3eUpwR\r\ndAhj7Or3mB6+TIo90h/1we3wF9crH0S+zZ2SD1Omn64GSRSIpQe4BLIfjg2u\r\n63DB/pn8YW26/kHp/bG3WwWlrUj+3YyidrgiWObJN4a+UScL4h7WXPJXq1By\r\nZUeZ/7nwg59LJSmiQ8VzA+cC3XV5KVsJlNxuyJR3kx/gbZVw6bD8FSUDCUqA\r\nAk1g1hbLmk3Oh7NB/6E3ArS6jAssHXGHNKeG3LtbaDXah893ltEwp6+VYFTM\r\nsudmZA33XXVOt85d5jKOno4gzswVbThMy6bc0gO0guflOeQp0l7e/hvOh7CK\r\nmF8QYzgu37eA3Bqa88e+fD7y/ea4yFI5YwD0ybTrjWTRplm21TugEAkW2o1L\r\n0CC2oYFqTowh1xi0pqKFd5ckPAY9SP0LV+xkes7y5EFT8+1FRzS2CqxLmjDt\r\nE6dkPg8G6aPopiMZhqoM6lETGkiCLfl2wKDZD3Dwvi5rhlvdFFp8/oAVriuf\r\nJt12Vy3yC3zpHuHXWVfDJ2s7Km3Jt5/7YGVxfExnzqeHITC6vWTrvui5rYLG\r\nHodAXTz/P5iKhiuX+qLzpl49sZnmdoQhkYE=\r\n=NMp8\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.0.0-rc.1_1671178212664_0.6860914673341825"},"_hasShrinkwrap":false},"10.0.0":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"10.0.0","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"^18.11.9","chalk":"^4.1.2","get-port":"5.1.1","path-to-regexp":"6.2.1","@deno/shim-deno":"~0.11.0","@deno/shim-crypto":"~0.3.1","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/ws":"8.5.3"},"exports":{".":{"import":{"types":"./types/src/entries/universal.d.ts","default":"./esm/src/entries/universal.js"},"require":{"types":"./types/src/entries/universal.d.ts","default":"./script/src/entries/universal.js"}},"./node":{"import":{"types":"./types/src/entries/node.d.ts","default":"./esm/src/entries/node.js"},"require":{"types":"./types/src/entries/node.d.ts","default":"./script/src/entries/node.js"}},"./browser":{"import":{"types":"./types/src/entries/browser.d.ts","default":"./esm/src/entries/browser.js"},"require":{"types":"./types/src/entries/browser.d.ts","default":"./script/src/entries/browser.js"}}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","ws":"8.8.1","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","isomorphic-blob":"1.0.1","isomorphic-undici-ponyfill":"1.0.0","@sgwilym/isomorphic-streams":"1.0.4","isomorphic-ws":"5.0.0","textencoder-ponyfill":"1.0.2","@sgwilym/urlpattern-polyfill":"1.0.0-rc8"},"gitHead":"3b1623c120535eb15469bdff8e258af82385ed92","_id":"earthstar@10.0.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-A+doEs/hVv9YsnT4zdbrAhpFjI+90vyYgxwWAVqphp+1dmhMeYHES1TTl3TkLMztwukUd/VCv1YWfNGi/mT/+Q==","shasum":"3895d7461df82821d8a059a8e3040acaf915ff2e","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.0.0.tgz","fileCount":345,"unpackedSize":2214136,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFcM6wQvxnA2DPxQqQs8JLO9pbGwvH0SRdFRQPdRtF8KAiEAraDg+mpvvd84bmxJgYX+g+YtI9rmLGznBFSvceloqc0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjssypACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr5OxAAm3JjAfct8dnQC9vboVF8PHRWuDsuc/5TVubql74ZiQO/3xRg\r\nTgd8j1jib5oVN3nvpCy6StnDpw8eBjYX2bBW3/ExlwCDlZ/suEj2B2HjmbMP\r\nirTIqXOR5a3yS2Bba8DAjCCFQVOqHfFtek0OtnG2WUsAlTQwNzPVvtqYn3YA\r\ndja9Tq4cpzqeIcHzAIhybXkvIYeFg3Ibmx1K0ZVNEfHSSLq6iKqlSS2x7oCL\r\neXuc0CHzQGySLMXXluJ/Wqe/Ec3B+qnhnW1PhAbAJnDgEeHrO23uYkEtKA3I\r\n7q8ETsigtLI2m+ezWmDrw4CFgYWqnGY+/ovVyrQfJ10D3p2nEfYClBt2Lscr\r\nYgzMDXiBKRS3F9X7EMknfnCGt83bf6rMlzZ8B+qOSZg0RXH2jVlg54YOBgAW\r\naL81aKs2ZafSBdnwsqKtDNDr+YwzlTzQrNLBcNEyAB/Rv/cRNXUw2wGhi7zN\r\nYeHWahdOmS0W4m50y9d7qsMr741m/hcXFZOaC1UJklZCdVPoQGCnlqgSiM0L\r\nYFA3MbWncoIxB1HMe0WVwPFBCDkqE8XG/RoRsdOCnMXoExRpwCjJPbtF3psQ\r\ncRwq8W78vdncYNNvr2fVKkqLBBI6u86igc9c1WE1eD5rh/y96uyO9ypaIHBE\r\n0IxXZV0LdxnsGx6YPNUEzDPwkAsaDnrO3qI=\r\n=PQQE\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.0.0_1672662185149_0.7662096820840232"},"_hasShrinkwrap":false},"10.0.1":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","engines":{"node":">=16.0.0"},"version":"10.0.1","description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"^18.11.9","chalk":"^4.1.2","get-port":"5.1.1","path-to-regexp":"6.2.1","@deno/shim-deno":"~0.11.0","@deno/shim-crypto":"~0.3.1","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/ws":"8.5.3"},"exports":{".":{"import":{"types":"./types/src/entries/universal.d.ts","default":"./esm/src/entries/universal.js"},"require":{"types":"./types/src/entries/universal.d.ts","default":"./script/src/entries/universal.js"}},"./node":{"import":{"types":"./types/src/entries/node.d.ts","default":"./esm/src/entries/node.js"},"require":{"types":"./types/src/entries/node.d.ts","default":"./script/src/entries/node.js"}},"./browser":{"import":{"types":"./types/src/entries/browser.d.ts","default":"./esm/src/entries/browser.js"},"require":{"types":"./types/src/entries/browser.d.ts","default":"./script/src/entries/browser.js"}}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","ws":"8.8.1","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","isomorphic-blob":"1.0.1","isomorphic-undici-ponyfill":"1.0.0","@sgwilym/isomorphic-streams":"1.0.4","isomorphic-ws":"5.0.0","textencoder-ponyfill":"1.0.2","@sgwilym/urlpattern-polyfill":"1.0.0-rc8"},"gitHead":"bb96623c90690f2e2d45c52e5c1be73f3e228c34","_id":"earthstar@10.0.1","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-UIha0qmQfHGyGRb+H6WX3twRv/70G5/mCyt2bh2jA/Xoz5j707uxjzwQkDPIOKXfG6eGDPS9A7orMTyoXTdr4Q==","shasum":"3f1db9653aab035299f6c02bf10248194f5df167","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.0.1.tgz","fileCount":351,"unpackedSize":2225450,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDbwZrxHwmgXyybANncW9zZFtilweYNlkgjwKPvi9YXTwIhAOII9xBKgqv7V4AhpYTgjJciVklS2aVF5mi2aGeyGXOa"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjx9LJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrH6BAAkBkYtTihol41Vt4Z9jEfIv0b7bX77h6zgD7eP76IbEtm5F4y\r\n50B15JqUdgbj9cfBVzGnaJHay1U3YZD5CQTHZzCIgLJwNMz+99f9D+4xtG8M\r\nEw4LqExSCJNTFkER4HfUsPFjXJlLsUfb2BlQFn2jfQGGXxUBn0KVbkR0hhhd\r\nNyBLT3c44iWCDWXVGbv6Thw/E0KJAll08RI6XbV0DFVImysirjUa9JbiGzyX\r\nYbsKOMU92OchG08+BQZWfyC00MnDm+Ao9KBs6sRI5rW/9BzlSWpE4eDb3+GR\r\nn3fbfUKelnjK7ZwuehPpEcxH/kKIbDj6nOvmTxAvi2XysNqKwSn1CNe9xIB+\r\nCA/bMsUQlGjxFGR6gYirvcecuTUTZhUvV814bGUlobVcHgwT5ww3aGHrI0nF\r\nJNhIRupEerHsOnmY+pkuvFMj4vPrJan0UwRe9WZY/w0/0XrBBYqF1uAni0ph\r\nRLVI4E8DZnvRHVBcbWOdafCq/j01/iwCTvlootlnzvCuxHeBsTXTFMGo6lbA\r\nUGLELSyGQ3Tx4NPL7RKXioLdzVZ2RoquY4cTXR2og+LfUfCFJCnxfiFfKGpC\r\nSezJ36NUL7p+y3tAq/Daf2xjmiWXd2F+FIxY3ykKmlBOAulSuuodLzX5hYVX\r\nlfqzkiWTlJozQx2YSxqqCMskRH0TtcI1JnU=\r\n=fj/I\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.0.1_1674040009113_0.5192386565577134"},"_hasShrinkwrap":false},"10.0.2":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"10.0.2","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"^18.11.9","chalk":"^4.1.2","get-port":"5.1.1","path-to-regexp":"6.2.1","@deno/shim-deno":"~0.11.0","@deno/shim-crypto":"~0.3.1","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/ws":"8.5.3"},"exports":{".":{"import":{"types":"./types/src/entries/universal.d.ts","default":"./esm/src/entries/universal.js"},"require":{"types":"./types/src/entries/universal.d.ts","default":"./script/src/entries/universal.js"}},"./node":{"import":{"types":"./types/src/entries/node.d.ts","default":"./esm/src/entries/node.js"},"require":{"types":"./types/src/entries/node.d.ts","default":"./script/src/entries/node.js"}},"./browser":{"import":{"types":"./types/src/entries/browser.d.ts","default":"./esm/src/entries/browser.js"},"require":{"types":"./types/src/entries/browser.d.ts","default":"./script/src/entries/browser.js"}}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","ws":"8.8.1","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","isomorphic-blob":"1.0.1","isomorphic-undici-ponyfill":"1.0.0","@sgwilym/isomorphic-streams":"1.0.4","isomorphic-ws":"5.0.0","textencoder-ponyfill":"1.0.2","@sgwilym/urlpattern-polyfill":"1.0.0-rc8"},"gitHead":"ae2882c53af82ed5866389d2aaa87a753ecbfc63","_id":"earthstar@10.0.2","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-3mC8zIqLVVkH5b4Sr4sFVvzpeoUjS2Na9CX/FdsKkC0922cbs8Qs6oVUIaaEQW8e8kAA9HPioyGyZSzWTLlvKw==","shasum":"8240c7e0c1652e47296fb8515221dbfa1172fc03","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.0.2.tgz","fileCount":351,"unpackedSize":2251196,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGOMiksFHD1IWqUO03qC3Rz+3i5NSSQF0F+u9fj2XVlpAiEA98D12u0zoyz/vjnZj0M+j9LPEPhhCgJbew2ps3YJt1M="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj6jkqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrGXg/5ARzTPNh32gMEPKURF9WCsFYPnnBbdd+azBr0xa0D/mQVwDyv\r\n724xdk7Mn1s8drR/9vTtX1WRBDeRF1Ez7vbE2s9WChI2SJ+Kc/xrVeSdvKOS\r\n1R1yep6pNVq6vZedOIvC83DXN/HYmkZSdGn+Rnwe7N7kkbhanoQ3TNw9u0Oe\r\nd7YEmjn7xJiMLxkBV8ufBN03YHWqeYPyeZ0IUzhlVKHTk8lUKcAKpuvc5yNg\r\nitHsAkyrKDIcDvSqgIHVWRmnrlPwhOZ+FdOF0VTMLfNISldcCMjy7+H2fAXw\r\ncKuFD9GJEq8xp7ptzZQM8YklXeePQzlIzOooEQJfMZ6JYQid0RzmkUJwDkuk\r\nwZ6CH4kyaYwRbceTkXNHE/Xf8K8cNySi7w4gELa9QkYkwvDfLsxw3ksZ/qGX\r\nfxNuWKTP/X7pRMC+NjXE2WBlM8JhuV3Qo/G/pc7uK3pLHiYCvrw8wfh2HT6o\r\nMGbdXagYtSDpqi7AofBU/nAuP68RsBU/QzxDdjSZ7cw5LzVrwmKtEV1p/Awq\r\nI5wFjfsYFDvSr71UGy2R+fC4Z71+c85W9DDZdQjTMO0b+Ywh8Nqm7+fqPdbI\r\ncFvRS/tg2X7wiRHIQdaheM6Bqy3vc2O4cFzXY9gtjbyJuKo+I4hRcA5COsZW\r\nVRfxtbG+a+qOWKIzIc84fFVo9dEQME3rSGo=\r\n=JaYT\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.0.2_1676294442305_0.947283062753683"},"_hasShrinkwrap":false},"10.1.0":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"10.1.0","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"^18.11.9","chalk":"^4.1.2","get-port":"5.1.1","path-to-regexp":"6.2.1","@deno/shim-deno":"~0.11.0","@deno/shim-crypto":"~0.3.1","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/ws":"8.5.3"},"exports":{".":{"import":{"types":"./types/src/entries/universal.d.ts","default":"./esm/src/entries/universal.js"},"require":{"types":"./types/src/entries/universal.d.ts","default":"./script/src/entries/universal.js"}},"./node":{"import":{"types":"./types/src/entries/node.d.ts","default":"./esm/src/entries/node.js"},"require":{"types":"./types/src/entries/node.d.ts","default":"./script/src/entries/node.js"}},"./browser":{"import":{"types":"./types/src/entries/browser.d.ts","default":"./esm/src/entries/browser.js"},"require":{"types":"./types/src/entries/browser.d.ts","default":"./script/src/entries/browser.js"}}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","ws":"8.8.1","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","isomorphic-blob":"1.0.1","isomorphic-undici-ponyfill":"1.0.0","@sgwilym/isomorphic-streams":"1.0.4","isomorphic-ws":"5.0.0","textencoder-ponyfill":"1.0.2","@sgwilym/urlpattern-polyfill":"1.0.0-rc8"},"gitHead":"39c2d4899e3d690a9262c05386eda70b859647c0","_id":"earthstar@10.1.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-UT6IBzEuOQdj4GyFRHl4JTznRXPbL60y+tofcyemb7vU49uOMxwogs8AtJrphRjMwbD3+LlsD0TNwX8vCDYOOg==","shasum":"e2e92f661cd62595ef6c28e2336e4a5e0c7b340c","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.1.0.tgz","fileCount":354,"unpackedSize":2263322,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDPBbQFOp5vxr3iFOVZMXqXdfB62yUcIO7v2JleS2QvuAiEA2I5Xr5uwDhtk6AJlvBBaTjPXvtHhq2qgGNARDEgkqhw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkOUbsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqYrBAAmhGuQ4FRu/B+zvvOJ9/aBa1fT+j3sQAuE2e2uX1GDw/6s7Jn\r\nP7l1mkBGphe+1Xd4InzAiaHIHFVQfOhwH6c7Qwmtp7d1sLUv/xMjyHFMXXFp\r\ni0L4FcVCUJhkQJua1CI3ukc3KOsBbLgTS1gHp40Ul1f9vBAp/RlWfMbiAKi/\r\nwrr+hUp6Zp4f262c8RibjjZBNiwT+gFsxfLMyvnQk+pMEvU9HbTwIIOzlFsJ\r\nLt6YCUEPFz8FQTMBDPNPLLtB9+QCzhYG5BxpxrLFgmZVbKg9qnXJvahBNKGJ\r\nnE1HXBSkWh5PnRJMiryyv4QIJXfyFV9TNfD9pQXX2hxONFp0eRDlA7qT5frd\r\n6Cs0Gtl5DxIb0bM9WWz3FUbaHEDFC0HZOpR3B3jjzdzXIThairLJoGna60Mr\r\nwYrhLJWZKEOMOyiuXd8T00nNIh1DmTBT3ed5jpvyC7uVOYGHAzBcMqt3qLkJ\r\n30l+i6NpKS3TQqDLZoO6v9VzNtovm4TiRct+Mv4amY1qD2t3sLqVfPPb7vYu\r\nHbWhdOraJXTVBHU14iF2KQaQEMoxzQ/cpjuR2iePiTaB+ZrPbRIuD9FB+p7H\r\nuo3V6FOkYCwBlk38/m1NxWG0yWj3L/8Om4eDo0mzPcfx3thnz0RIcNV7a0JJ\r\nbchHIqH1lhKGlmL3e7cessy0ti5cy06FI3w=\r\n=ejQz\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.1.0_1681475308154_0.5146753733209695"},"_hasShrinkwrap":false},"10.2.0":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"10.2.0","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"20.1.1","chalk":"^4.1.2","get-port":"5.1.1","path-to-regexp":"6.2.1","@deno/shim-deno":"~0.14.0","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/ws":"8.5.3"},"exports":{".":{"import":{"types":"./types/src/entries/universal.d.ts","default":"./esm/src/entries/universal.js"},"require":{"types":"./types/src/entries/universal.d.ts","default":"./script/src/entries/universal.js"}},"./node":{"import":{"types":"./types/src/entries/node.d.ts","default":"./esm/src/entries/node.js"},"require":{"types":"./types/src/entries/node.d.ts","default":"./script/src/entries/node.js"}},"./browser":{"import":{"types":"./types/src/entries/browser.d.ts","default":"./esm/src/entries/browser.js"},"require":{"types":"./types/src/entries/browser.d.ts","default":"./script/src/entries/browser.js"}}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","ws":"8.8.1","ya-dns-sd":"2.0.0","@deno/shim-crypto":"~0.3.1","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","isomorphic-blob":"1.0.1","isomorphic-undici-ponyfill":"1.0.0","@sgwilym/isomorphic-streams":"1.0.4","isomorphic-ws":"5.0.0","textencoder-ponyfill":"1.0.2","@sgwilym/urlpattern-polyfill":"1.0.0-rc8"},"gitHead":"18f85b6ff36cc3ff722f34aeeb8a3312bf5884c2","_id":"earthstar@10.2.0","_nodeVersion":"16.20.0","_npmVersion":"8.19.4","dist":{"integrity":"sha512-EsbJ+aKVXa/SrF3urGZqFB3vRRhp8Bjc2LVex3myV5rNRA3fsws7ZZ5JbKUMFmpyQTEHFKQSc7YvuKKNp9twCw==","shasum":"33053bc3d7bde671af29c39a1858f04618489a7b","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.2.0.tgz","fileCount":375,"unpackedSize":2360379,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICB/YbnGzFLwasyrcc9wFf+PMDc8Nnp2S6g2fek9wt7DAiEA8ynJUC9HRNoLtWcnv6eqWQ+PUMhTg8h/y7TpfN7FCso="}]},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.2.0_1684235855005_0.3608506072241089"},"_hasShrinkwrap":false},"10.2.1":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"10.2.1","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"20.1.1","chalk":"^4.1.2","get-port":"5.1.1","path-to-regexp":"6.2.1","@deno/shim-deno":"~0.14.0","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/ws":"8.5.3"},"exports":{".":{"import":{"types":"./types/src/entries/universal.d.ts","default":"./esm/src/entries/universal.js"},"require":{"types":"./types/src/entries/universal.d.ts","default":"./script/src/entries/universal.js"}},"./node":{"import":{"types":"./types/src/entries/node.d.ts","default":"./esm/src/entries/node.js"},"require":{"types":"./types/src/entries/node.d.ts","default":"./script/src/entries/node.js"}},"./browser":{"import":{"types":"./types/src/entries/browser.d.ts","default":"./esm/src/entries/browser.js"},"require":{"types":"./types/src/entries/browser.d.ts","default":"./script/src/entries/browser.js"}}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"7.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","ws":"8.8.1","ya-dns-sd":"2.0.0","@deno/shim-crypto":"~0.3.1","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","isomorphic-blob":"1.0.1","isomorphic-undici-ponyfill":"1.0.0","@sgwilym/isomorphic-streams":"1.0.4","isomorphic-ws":"5.0.0","textencoder-ponyfill":"1.0.2","@sgwilym/urlpattern-polyfill":"1.0.0-rc8"},"gitHead":"1523c640fedf106f598bf79b184fb0ada64b1cc0","_id":"earthstar@10.2.1","_nodeVersion":"16.20.0","_npmVersion":"8.19.4","dist":{"integrity":"sha512-fpLUsamCskppW7X22BiaCd14gDy5P7Ub5Qszs9P6LagCx6sXts5EGSshaWA5ZYBKFpLfcqzSjrrWRnl3CzUwww==","shasum":"f31f18ec29a943003f3588e003c46244cdcb6279","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.2.1.tgz","fileCount":375,"unpackedSize":2361584,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFFtfJ6pvbpNRGiUck0I3Qv3UnFx1eqyY6JxSwuGtEMEAiAv33lWlOw5VbcdJi5UFPK2w7609EAPBF75IiE0Nqi5CA=="}]},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.2.1_1686838894660_0.1872658838803236"},"_hasShrinkwrap":false},"10.2.2":{"module":"./esm/src/entries/universal.js","main":"./script/src/entries/universal.js","types":"./types/src/entries/universal.d.ts","name":"earthstar","version":"10.2.2","engines":{"node":">=16.0.0"},"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","license":"LGPL-3.0-only","homepage":"https://earthstar-project.org","funding":{"type":"opencollective","url":"https://opencollective.com/earthstar"},"repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"devDependencies":{"@types/node":"20.1.1","chalk":"^4.1.2","get-port":"5.1.1","path-to-regexp":"6.2.1","@deno/shim-deno":"~0.14.0","@types/better-sqlite3":"7.4.2","@types/chloride":"2.4.0","@types/ws":"8.5.3"},"exports":{".":{"import":{"types":"./types/src/entries/universal.d.ts","default":"./esm/src/entries/universal.js"},"require":{"types":"./types/src/entries/universal.d.ts","default":"./script/src/entries/universal.js"}},"./node":{"import":{"types":"./types/src/entries/node.d.ts","default":"./esm/src/entries/node.js"},"require":{"types":"./types/src/entries/node.d.ts","default":"./script/src/entries/node.js"}},"./browser":{"import":{"types":"./types/src/entries/browser.d.ts","default":"./esm/src/entries/browser.js"},"require":{"types":"./types/src/entries/browser.d.ts","default":"./script/src/entries/browser.js"}}},"scripts":{"test":"node test_runner.js"},"dependencies":{"@noble/ed25519":"1.6.0","@nodelib/fs.walk":"1.2.8","better-sqlite3":"8.5.0","chloride":"2.4.1","fast-json-stable-stringify":"2.1.0","rfc4648":"1.5.0","sha256-uint8array":"0.10.3","ws":"8.8.1","ya-dns-sd":"2.0.0","@deno/shim-crypto":"~0.3.1","@deno/shim-timers":"~0.1.0","@deno/sham-weakref":"~0.1.0","isomorphic-blob":"1.0.1","isomorphic-undici-ponyfill":"1.0.0","@sgwilym/isomorphic-streams":"1.0.4","isomorphic-ws":"5.0.0","textencoder-ponyfill":"1.0.2","@sgwilym/urlpattern-polyfill":"1.0.0-rc8"},"gitHead":"6a2b3d4c77021b3c2fad3c6f26c71cbe08216da3","_id":"earthstar@10.2.2","_nodeVersion":"16.20.0","_npmVersion":"8.19.4","dist":{"integrity":"sha512-syxumhWBUwktReB1HJo/vfg+V/bg/NkLhnLBWnXlUxxhmlGNPJX+4CUaamZzzByniW1pOSlwgg3k3CyfbaGcxw==","shasum":"8042a6ad7b8544da82c791e0805b65f7efcf2081","tarball":"https://registry.npmjs.org/earthstar/-/earthstar-10.2.2.tgz","fileCount":369,"unpackedSize":2339528,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAYZX9qIDrLPcebnCbJBPg2g1ZROJA4MrpahojgRqdm9AiB2Jbcak78uw5OAvDLmQlvITphwCr+AmVYLioPZ3KWvag=="}]},"_npmUser":{"name":"sgwil","email":"gwilym@me.com"},"directories":{},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/earthstar_10.2.2_1693472939888_0.02669356162205494"},"_hasShrinkwrap":false}},"time":{"created":"2020-05-27T02:20:09.607Z","0.5.1":"2020-05-27T02:20:09.776Z","modified":"2023-08-31T09:09:00.427Z","0.6.0":"2020-05-27T02:21:24.088Z","0.6.1":"2020-05-27T02:35:50.019Z","0.6.2":"2020-05-27T02:49:04.127Z","0.7.0":"2020-05-27T23:12:18.474Z","0.8.0":"2020-05-28T23:31:15.887Z","0.9.0":"2020-05-30T00:12:56.437Z","0.9.1":"2020-06-01T03:29:47.842Z","1.0.0":"2020-06-11T23:21:52.391Z","1.1.0":"2020-06-13T00:19:10.176Z","1.1.1":"2020-06-13T20:40:25.576Z","1.1.2":"2020-06-15T17:44:53.259Z","1.2.0":"2020-06-17T03:24:45.091Z","1.2.1":"2020-06-20T23:35:41.216Z","1.2.2":"2020-06-21T00:32:07.484Z","1.2.3":"2020-06-23T18:14:51.104Z","1.2.4":"2020-06-23T18:54:13.193Z","1.2.5":"2020-06-29T00:47:34.710Z","2.0.0":"2020-06-30T00:01:16.465Z","2.0.1":"2020-06-30T00:45:31.713Z","2.0.2":"2020-06-30T01:11:57.186Z","2.0.3":"2020-07-03T23:00:43.373Z","3.0.0":"2020-07-08T00:35:03.753Z","3.1.0":"2020-07-10T23:48:02.946Z","3.1.1":"2020-07-11T01:09:38.572Z","4.0.0":"2020-08-06T21:47:24.146Z","4.1.0":"2020-08-06T22:53:02.665Z","5.0.0":"2020-08-06T23:51:23.790Z","5.1.0":"2020-08-15T20:17:20.831Z","5.2.0":"2020-08-17T23:06:55.871Z","5.2.1":"2020-08-17T23:15:04.520Z","5.2.3":"2020-08-18T03:31:04.219Z","5.2.4":"2020-08-26T21:16:25.746Z","5.2.5":"2020-09-01T22:49:18.459Z","5.2.6":"2020-09-01T22:56:30.446Z","5.3.0":"2020-10-04T19:51:12.696Z","5.4.0":"2020-10-06T00:38:56.083Z","5.5.0":"2020-10-12T23:03:06.265Z","5.6.0":"2020-10-14T00:06:51.610Z","5.7.0":"2020-10-15T22:04:39.923Z","5.7.1":"2020-10-22T00:55:05.551Z","5.7.2":"2020-10-28T22:02:28.244Z","5.7.3":"2020-10-28T22:10:56.112Z","5.7.4":"2020-11-05T22:35:25.520Z","6.0.0-beta.0":"2020-12-02T22:41:15.275Z","6.0.0-beta.1":"2020-12-02T23:49:31.114Z","6.0.0-beta.2":"2020-12-05T20:05:21.413Z","6.0.0-beta.3":"2020-12-05T20:17:18.326Z","5.7.5":"2021-02-06T05:25:48.373Z","5.7.6":"2021-02-06T05:30:15.140Z","5.8.0":"2021-02-10T20:05:19.868Z","6.0.0":"2021-02-12T00:50:31.209Z","6.1.0":"2021-02-14T01:01:35.797Z","6.2.0":"2021-02-16T22:00:08.655Z","6.2.1":"2021-02-18T19:32:48.142Z","6.3.0":"2021-02-23T22:42:26.409Z","6.3.1":"2021-02-24T21:14:50.150Z","6.3.2":"2021-03-05T22:22:27.576Z","6.3.3":"2021-03-06T05:02:40.314Z","6.3.4":"2021-03-06T05:22:38.420Z","6.3.5":"2021-03-09T19:18:44.190Z","6.4.0":"2021-03-21T21:05:32.275Z","6.4.1":"2021-03-21T21:54:45.445Z","6.5.0":"2021-03-26T01:50:05.007Z","6.6.0":"2021-03-28T01:48:18.367Z","6.6.1":"2021-03-30T17:21:48.150Z","6.6.2":"2021-04-17T03:30:05.494Z","6.7.0":"2021-04-23T23:59:59.689Z","6.8.0":"2021-04-24T01:24:11.584Z","6.8.1":"2021-04-24T22:03:24.670Z","6.8.2":"2021-04-24T23:15:44.130Z","6.8.3":"2021-05-28T19:19:25.751Z","6.8.4":"2021-05-28T19:21:09.376Z","6.8.5":"2021-05-28T19:28:21.129Z","7.0.0":"2022-02-16T14:12:18.741Z","7.1.0":"2022-02-22T12:46:45.854Z","7.2.0":"2022-03-01T11:30:46.553Z","8.0.0":"2022-03-02T15:47:43.549Z","8.1.0":"2022-03-03T12:37:36.919Z","8.1.1":"2022-03-03T16:11:49.194Z","8.1.2":"2022-03-03T19:30:01.519Z","8.1.3":"2022-03-03T19:39:21.661Z","8.1.4":"2022-03-04T10:13:15.548Z","8.2.0":"2022-03-04T13:38:08.636Z","8.2.1":"2022-03-10T11:58:11.872Z","8.2.2":"2022-03-10T15:57:46.506Z","8.2.3":"2022-03-11T09:58:21.075Z","8.2.4":"2022-03-11T10:28:14.430Z","9.0.0":"2022-04-13T12:47:48.542Z","9.0.1":"2022-04-13T13:26:09.499Z","9.0.2":"2022-04-13T15:44:58.077Z","9.3.0":"2022-04-18T14:23:24.963Z","9.3.1":"2022-04-19T16:08:47.929Z","9.3.2":"2022-04-20T10:13:53.440Z","0.0.0-experimental-bqbpfplmfj3e4vfw":"2022-08-05T15:08:52.587Z","0.0.0-experimental-bxe4cbj6a3fit":"2022-08-19T10:58:34.878Z","10.0.0-alpha.1":"2022-09-06T12:13:57.938Z","10.0.0-alpha.2":"2022-09-08T15:41:32.773Z","10.0.0-alpha.3":"2022-09-27T12:24:35.109Z","9.3.3":"2022-10-03T08:57:49.201Z","10.0.0-alpha.4":"2022-11-18T12:51:10.968Z","10.0.0-beta.1":"2022-11-22T13:08:25.912Z","10.0.0-beta.2":"2022-11-22T15:05:41.526Z","10.0.0-beta.3":"2022-11-23T13:21:09.149Z","10.0.0-beta.4":"2022-11-23T14:30:23.933Z","10.0.0-beta.5":"2022-11-24T10:23:21.519Z","10.0.0-beta.6":"2022-11-24T13:36:48.821Z","10.0.0-beta.7":"2022-12-08T09:05:11.782Z","10.0.0-beta.8":"2022-12-09T12:25:37.162Z","10.0.0-rc.1":"2022-12-16T08:10:13.020Z","10.0.0":"2023-01-02T12:23:05.373Z","10.0.1":"2023-01-18T11:06:49.338Z","10.0.2":"2023-02-13T13:20:42.519Z","10.1.0":"2023-04-14T12:28:28.344Z","10.2.0":"2023-05-16T11:17:35.267Z","10.2.1":"2023-06-15T14:21:34.911Z","10.2.2":"2023-08-31T09:09:00.203Z"},"maintainers":[{"name":"cinnamon_npm","email":"cinnamon_npm@fastmail.com"},{"name":"rangermauve","email":"rangermauve@hotmail.com"},{"name":"sgwil","email":"gwilym@me.com"}],"description":"Earthstar is a tool for private, undiscoverable, offline-first networks.","homepage":"https://earthstar-project.org","repository":{"type":"git","url":"git+https://github.com/earthstar-project/earthstar.git"},"bugs":{"url":"https://github.com/earthstar-project/earthstar/issues"},"license":"LGPL-3.0-only","readme":"ERROR: No README data found!","readmeFilename":""}