From 9f50fb5e53a5ac0fa4dfb933b8f11ecb92d7fdd5 Mon Sep 17 00:00:00 2001 From: haad Date: Thu, 2 Mar 2023 09:01:50 +0200 Subject: [PATCH] Use js-ipfs only in tests --- package-lock.json | 2547 +++-------------- package.json | 2 - src/access-controllers/manifest.js | 60 +- .../access-controller-handlers.test.js | 238 +- ...ract-access-controller-integration.test.js | 470 +-- .../contract-access-controller.test.js | 308 +- ...ipfs-access-controller-integration.test.js | 260 +- .../ipfs-access-controller.test.js | 210 +- ...t-db-access-controller-integration.test.js | 398 +-- .../orbit-db-access-controller.test.js | 590 ++-- .../access-controllers/utils/connect-peers.js | 6 - .../utils/custom-test-keystore.js | 54 - test/access-controllers/utils/index.js | 8 - test/access-controllers/utils/start-ipfs.js | 26 - test/access-controllers/utils/stop-ipfs.js | 13 - test/access-controllers/utils/test-apis.js | 32 - .../utils/wait-for-peers.js | 12 - test/{access-controllers/utils => }/config.js | 15 +- test/db/document-store.test.js | 13 +- test/db/event-store.test.js | 13 +- test/db/keyvalue-persisted.js | 13 +- test/db/keyvalue.test.js | 13 +- test/db/replication/document-store.test.js | 22 +- test/db/replication/event-store.test.js | 24 +- test/db/replication/keyvalue.test.js | 24 +- test/oplog/load.test.js | 1692 +++++------ test/oplog/replicate.test.js | 29 +- test/orbitdb-open.test.js | 24 +- test/orbitdb-replication.test.js | 22 +- test/orbitdb.test.js | 24 +- test/storage.spec.js | 28 +- test/utils/get-ipfs-peer-id.js | 8 + test/utils/wait-for-peers.js | 27 + 33 files changed, 2647 insertions(+), 4578 deletions(-) delete mode 100644 test/access-controllers/utils/connect-peers.js delete mode 100644 test/access-controllers/utils/custom-test-keystore.js delete mode 100644 test/access-controllers/utils/index.js delete mode 100644 test/access-controllers/utils/start-ipfs.js delete mode 100644 test/access-controllers/utils/stop-ipfs.js delete mode 100644 test/access-controllers/utils/test-apis.js delete mode 100644 test/access-controllers/utils/wait-for-peers.js rename test/{access-controllers/utils => }/config.js (83%) create mode 100644 test/utils/get-ipfs-peer-id.js create mode 100644 test/utils/wait-for-peers.js diff --git a/package-lock.json b/package-lock.json index a66d245..aab620f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,11 +25,9 @@ "cross-env": "^7.0.3", "fs-extra": "^11.1.0", "ipfs": "^0.66.0", - "ipfsd-ctl": "^13.0.0", "it-all": "^2.0.0", "mocha": "^10.2.0", "open-cli": "^7.1.0", - "orbit-db-test-utils": "^3.0.0", "p-map-series": "^3.0.0", "path-browserify": "^1.0.1", "remark-cli": "^11.0.0", @@ -263,6 +261,12 @@ "npm": ">=8.7.0" } }, + "node_modules/@chainsafe/libp2p-gossipsub/node_modules/@types/node": { + "version": "18.14.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.3.tgz", + "integrity": "sha512-1y36CC5iL5CMyKALzwX9cwwxcWIxvIBe3gzs4GrXWXEQ8klQnCZ2U/WDGiNrXHmQcUhnaun17XG9TEIDlGj2RA==", + "dev": true + }, "node_modules/@chainsafe/libp2p-gossipsub/node_modules/protobufjs": { "version": "6.11.3", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", @@ -374,6 +378,12 @@ "node": "^8.13.0 || >=10.10.0" } }, + "node_modules/@grpc/grpc-js/node_modules/@types/node": { + "version": "18.14.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.3.tgz", + "integrity": "sha512-1y36CC5iL5CMyKALzwX9cwwxcWIxvIBe3gzs4GrXWXEQ8klQnCZ2U/WDGiNrXHmQcUhnaun17XG9TEIDlGj2RA==", + "dev": true + }, "node_modules/@grpc/proto-loader": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.5.tgz", @@ -2245,13 +2255,12 @@ "dev": true }, "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", + "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", "dev": true, - "peer": true, "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sindresorhus/is?sponsor=1" @@ -2406,16 +2415,15 @@ } }, "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dev": true, - "peer": true, "dependencies": { - "defer-to-connect": "^2.0.0" + "defer-to-connect": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=14.16" } }, "node_modules/@tokenizer/token": { @@ -2424,19 +2432,6 @@ "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", "dev": true }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, "node_modules/@types/concat-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-2.0.0.tgz", @@ -2514,16 +2509,6 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/long": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", @@ -2568,9 +2553,10 @@ } }, "node_modules/@types/node": { - "version": "18.14.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.3.tgz", - "integrity": "sha512-1y36CC5iL5CMyKALzwX9cwwxcWIxvIBe3gzs4GrXWXEQ8klQnCZ2U/WDGiNrXHmQcUhnaun17XG9TEIDlGj2RA==" + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "dev": true }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -2578,16 +2564,6 @@ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/retry": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", @@ -3373,20 +3349,6 @@ "platform": "^1.3.3" } }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", - "dev": true, - "peer": true, - "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - }, - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -3646,16 +3608,6 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "node_modules/browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", - "dev": true, - "peer": true, - "dependencies": { - "pako": "~0.2.0" - } - }, "node_modules/browserslist": { "version": "4.21.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", @@ -3723,16 +3675,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.2.0" - } - }, "node_modules/builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -3783,42 +3725,30 @@ } }, "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "dev": true, - "peer": true, "engines": { - "node": ">=10.6.0" + "node": ">=14.16" } }, "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "10.2.8", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.8.tgz", + "integrity": "sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==", "dev": true, - "peer": true, "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" + "node": ">=14.16" } }, "node_modules/call-bind": { @@ -3883,10 +3813,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/camelcase-keys/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "node_modules/camelcase-keys/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, "engines": { "node": ">=10" @@ -3945,19 +3875,6 @@ "cborg": "cli.js" } }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", - "dev": true, - "peer": true, - "dependencies": { - "traverse": ">=0.3.0 <0.4" - }, - "engines": { - "node": "*" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4179,19 +4096,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "peer": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -4356,7 +4260,8 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "dev": true, + "optional": true }, "node_modules/cp-file": { "version": "9.1.0", @@ -4464,18 +4369,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/dag-jose": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/dag-jose/-/dag-jose-4.0.0.tgz", @@ -4761,18 +4654,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/default-gateway/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/default-gateway/node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -4782,6 +4663,18 @@ "node": ">=10.17.0" } }, + "node_modules/default-gateway/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/default-gateway/node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -5041,19 +4934,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "peer": true, - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -5327,13 +5207,6 @@ "dev": true, "optional": true }, - "node_modules/electron/node_modules/@types/node": { - "version": "8.10.66", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", - "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", - "dev": true, - "optional": true - }, "node_modules/elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -6119,30 +5992,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -6531,13 +6380,6 @@ "npm": ">=7.0.0" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true, - "peer": true - }, "node_modules/fs-extra": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", @@ -6731,16 +6573,12 @@ } }, "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "peer": true, - "dependencies": { - "pump": "^3.0.0" - }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6895,26 +6733,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/go-ipfs": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/go-ipfs/-/go-ipfs-0.18.1.tgz", - "integrity": "sha512-hXfjQRqet/H8mTSQVKiuTSMrvjv8cAGQMHbr12DHAHGsSMS9IuGCOntkVEhnNOnmP/WXcrxRVxLu6xz/mPLlZg==", - "dev": true, - "hasInstallScript": true, - "peer": true, - "dependencies": { - "cachedir": "^2.3.0", - "got": "^11.7.0", - "gunzip-maybe": "^1.4.2", - "hasha": "^5.2.2", - "pkg-conf": "^3.1.0", - "tar-fs": "^2.1.0", - "unzip-stream": "^0.3.0" - }, - "bin": { - "ipfs": "bin/ipfs" - } - }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -6928,26 +6746,25 @@ } }, "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "version": "12.5.3", + "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz", + "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==", "dev": true, - "peer": true, "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.1", "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" }, "engines": { - "node": ">=10.19.0" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sindresorhus/got?sponsor=1" @@ -6965,24 +6782,6 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, - "node_modules/gunzip-maybe": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", - "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", - "dev": true, - "peer": true, - "dependencies": { - "browserify-zlib": "^0.1.4", - "is-deflate": "^1.0.0", - "is-gzip": "^1.0.0", - "peek-stream": "^1.1.0", - "pumpify": "^1.3.3", - "through2": "^2.0.3" - }, - "bin": { - "gunzip-maybe": "bin.js" - } - }, "node_modules/hamt-sharding": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/hamt-sharding/-/hamt-sharding-3.0.2.tgz", @@ -7151,23 +6950,6 @@ "minimalistic-assert": "^1.0.1" } }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "peer": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/hashlru": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/hashlru/-/hashlru-2.3.0.tgz", @@ -7275,19 +7057,30 @@ } }, "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", "dev": true, - "peer": true, "dependencies": { "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" + "resolve-alpn": "^1.2.0" }, "engines": { "node": ">=10.19.0" } }, + "node_modules/http2-wrapper/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -7785,6 +7578,12 @@ "npm": ">=7.0.0" } }, + "node_modules/ipfs-core-types/node_modules/@types/node": { + "version": "18.14.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.3.tgz", + "integrity": "sha512-1y36CC5iL5CMyKALzwX9cwwxcWIxvIBe3gzs4GrXWXEQ8klQnCZ2U/WDGiNrXHmQcUhnaun17XG9TEIDlGj2RA==", + "dev": true + }, "node_modules/ipfs-core-utils": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/ipfs-core-utils/-/ipfs-core-utils-0.18.0.tgz", @@ -7817,12 +7616,6 @@ "npm": ">=7.0.0" } }, - "node_modules/ipfs-core/node_modules/pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", - "dev": true - }, "node_modules/ipfs-daemon": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/ipfs-daemon/-/ipfs-daemon-0.16.0.tgz", @@ -8093,18 +7886,6 @@ "npm": ">=7.0.0" } }, - "node_modules/ipfs-repo/node_modules/quick-lru": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.1.tgz", - "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ipfs-unixfs": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-9.0.1.tgz", @@ -8247,347 +8028,6 @@ "node-fetch": "*" } }, - "node_modules/ipfsd-ctl": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/ipfsd-ctl/-/ipfsd-ctl-13.0.0.tgz", - "integrity": "sha512-wT+2nWCT3njaMdcVeLOu5ABCZ9QasdQaiXXBuGdxaXriu7T7KXYjJ+nTsc+glyYgCtvpLwatT7CJMCg/XcXMxw==", - "dev": true, - "dependencies": { - "@hapi/boom": "^10.0.0", - "@hapi/hapi": "^21.1.0", - "@libp2p/interface-peer-id": "^2.0.0", - "@libp2p/logger": "^2.0.0", - "@multiformats/multiaddr": "^11.0.0", - "execa": "^6.1.0", - "ipfs-utils": "^9.0.1", - "joi": "^17.2.1", - "merge-options": "^3.0.1", - "nanoid": "^4.0.0", - "p-wait-for": "^5.0.0", - "temp-write": "^5.0.0", - "wherearewe": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/accept": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-6.0.1.tgz", - "integrity": "sha512-aLkYj7zzgC3CSlEVOs84eBOEE3i9xZK2tdQEP+TOj2OFzMWCi9zjkRet82V3GGjecE//zFrCLKIykuaE0uM4bg==", - "dev": true, - "dependencies": { - "@hapi/boom": "^10.0.1", - "@hapi/hoek": "^11.0.2" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/ammo": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/ammo/-/ammo-6.0.1.tgz", - "integrity": "sha512-pmL+nPod4g58kXrMcsGLp05O2jF4P2Q3GiL8qYV7nKYEh3cGf+rV4P5Jyi2Uq0agGhVU63GtaSAfBEZOlrJn9w==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^11.0.2" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/b64": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-6.0.1.tgz", - "integrity": "sha512-ZvjX4JQReUmBheeCq+S9YavcnMMHWqx3S0jHNXWIM1kQDxB9cyfSycpVvjfrKcIS8Mh5N3hmu/YKo4Iag9g2Kw==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^11.0.2" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/boom": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-10.0.1.tgz", - "integrity": "sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^11.0.2" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/bounce": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@hapi/bounce/-/bounce-3.0.1.tgz", - "integrity": "sha512-G+/Pp9c1Ha4FDP+3Sy/Xwg2O4Ahaw3lIZFSX+BL4uWi64CmiETuZPxhKDUD4xBMOUZbBlzvO8HjiK8ePnhBadA==", - "dev": true, - "dependencies": { - "@hapi/boom": "^10.0.1", - "@hapi/hoek": "^11.0.2" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/bourne": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-3.0.0.tgz", - "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==", - "dev": true - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/call": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@hapi/call/-/call-9.0.1.tgz", - "integrity": "sha512-uPojQRqEL1GRZR4xXPqcLMujQGaEpyVPRyBlD8Pp5rqgIwLhtveF9PkixiKru2THXvuN8mUrLeet5fqxKAAMGg==", - "dev": true, - "dependencies": { - "@hapi/boom": "^10.0.1", - "@hapi/hoek": "^11.0.2" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/catbox": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@hapi/catbox/-/catbox-12.1.1.tgz", - "integrity": "sha512-hDqYB1J+R0HtZg4iPH3LEnldoaBsar6bYp0EonBmNQ9t5CO+1CqgCul2ZtFveW1ReA5SQuze9GPSU7/aecERhw==", - "dev": true, - "dependencies": { - "@hapi/boom": "^10.0.1", - "@hapi/hoek": "^11.0.2", - "@hapi/podium": "^5.0.0", - "@hapi/validate": "^2.0.1" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/catbox-memory": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/catbox-memory/-/catbox-memory-6.0.1.tgz", - "integrity": "sha512-sVb+/ZxbZIvaMtJfAbdyY+QJUQg9oKTwamXpEg/5xnfG5WbJLTjvEn4kIGKz9pN3ENNbIL/bIdctmHmqi/AdGA==", - "dev": true, - "dependencies": { - "@hapi/boom": "^10.0.1", - "@hapi/hoek": "^11.0.2" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/content": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@hapi/content/-/content-6.0.0.tgz", - "integrity": "sha512-CEhs7j+H0iQffKfe5Htdak5LBOz/Qc8TRh51cF+BFv0qnuph3Em4pjGVzJMkI2gfTDdlJKWJISGWS1rK34POGA==", - "dev": true, - "dependencies": { - "@hapi/boom": "^10.0.0" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/cryptiles": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/cryptiles/-/cryptiles-6.0.1.tgz", - "integrity": "sha512-9GM9ECEHfR8lk5ASOKG4+4ZsEzFqLfhiryIJ2ISePVB92OHLp/yne4m+zn7z9dgvM98TLpiFebjDFQ0UHcqxXQ==", - "dev": true, - "dependencies": { - "@hapi/boom": "^10.0.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/file": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@hapi/file/-/file-3.0.0.tgz", - "integrity": "sha512-w+lKW+yRrLhJu620jT3y+5g2mHqnKfepreykvdOcl9/6up8GrQQn+l3FRTsjHTKbkbfQFkuksHpdv2EcpKcJ4Q==", - "dev": true - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/hapi": { - "version": "21.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hapi/-/hapi-21.3.0.tgz", - "integrity": "sha512-D0g78N1GlbhYteuDFEL3yA3zv/MMQZC9q7U1bblwGNdh1M4oIuy5u3eEeiBSdy7HY8oWhwPCnr0s9287MIctzg==", - "dev": true, - "dependencies": { - "@hapi/accept": "^6.0.1", - "@hapi/ammo": "^6.0.1", - "@hapi/boom": "^10.0.1", - "@hapi/bounce": "^3.0.1", - "@hapi/call": "^9.0.1", - "@hapi/catbox": "^12.1.1", - "@hapi/catbox-memory": "^6.0.1", - "@hapi/heavy": "^8.0.1", - "@hapi/hoek": "^11.0.2", - "@hapi/mimos": "^7.0.1", - "@hapi/podium": "^5.0.1", - "@hapi/shot": "^6.0.1", - "@hapi/somever": "^4.1.1", - "@hapi/statehood": "^8.0.1", - "@hapi/subtext": "^8.1.0", - "@hapi/teamwork": "^6.0.0", - "@hapi/topo": "^6.0.1", - "@hapi/validate": "^2.0.1" - }, - "engines": { - "node": ">=14.15.0" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/heavy": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@hapi/heavy/-/heavy-8.0.1.tgz", - "integrity": "sha512-gBD/NANosNCOp6RsYTsjo2vhr5eYA3BEuogk6cxY0QdhllkkTaJFYtTXv46xd6qhBVMbMMqcSdtqey+UQU3//w==", - "dev": true, - "dependencies": { - "@hapi/boom": "^10.0.1", - "@hapi/hoek": "^11.0.2", - "@hapi/validate": "^2.0.1" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/hoek": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.2.tgz", - "integrity": "sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw==", - "dev": true - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/iron": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-7.0.1.tgz", - "integrity": "sha512-tEZnrOujKpS6jLKliyWBl3A9PaE+ppuL/+gkbyPPDb/l2KSKQyH4lhMkVb+sBhwN+qaxxlig01JRqB8dk/mPxQ==", - "dev": true, - "dependencies": { - "@hapi/b64": "^6.0.1", - "@hapi/boom": "^10.0.1", - "@hapi/bourne": "^3.0.0", - "@hapi/cryptiles": "^6.0.1", - "@hapi/hoek": "^11.0.2" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/mimos": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@hapi/mimos/-/mimos-7.0.1.tgz", - "integrity": "sha512-b79V+BrG0gJ9zcRx1VGcCI6r6GEzzZUgiGEJVoq5gwzuB2Ig9Cax8dUuBauQCFKvl2YWSWyOc8mZ8HDaJOtkew==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^11.0.2", - "mime-db": "^1.52.0" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/nigel": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@hapi/nigel/-/nigel-5.0.1.tgz", - "integrity": "sha512-uv3dtYuB4IsNaha+tigWmN8mQw/O9Qzl5U26Gm4ZcJVtDdB1AVJOwX3X5wOX+A07qzpEZnOMBAm8jjSqGsU6Nw==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^11.0.2", - "@hapi/vise": "^5.0.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/pez": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@hapi/pez/-/pez-6.1.0.tgz", - "integrity": "sha512-+FE3sFPYuXCpuVeHQ/Qag1b45clR2o54QoonE/gKHv9gukxQ8oJJZPR7o3/ydDTK6racnCJXxOyT1T93FCJMIg==", - "dev": true, - "dependencies": { - "@hapi/b64": "^6.0.1", - "@hapi/boom": "^10.0.1", - "@hapi/content": "^6.0.0", - "@hapi/hoek": "^11.0.2", - "@hapi/nigel": "^5.0.1" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/podium": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-5.0.1.tgz", - "integrity": "sha512-eznFTw6rdBhAijXFIlBOMJJd+lXTvqbrBIS4Iu80r2KTVIo4g+7fLy4NKp/8+UnSt5Ox6mJtAlKBU/Sf5080TQ==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^11.0.2", - "@hapi/teamwork": "^6.0.0", - "@hapi/validate": "^2.0.1" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/shot": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/shot/-/shot-6.0.1.tgz", - "integrity": "sha512-s5ynMKZXYoDd3dqPw5YTvOR/vjHvMTxc388+0qL0jZZP1+uwXuUD32o9DuuuLsmTlyXCWi02BJl1pBpwRuUrNA==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^11.0.2", - "@hapi/validate": "^2.0.1" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/somever": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@hapi/somever/-/somever-4.1.1.tgz", - "integrity": "sha512-lt3QQiDDOVRatS0ionFDNrDIv4eXz58IibQaZQDOg4DqqdNme8oa0iPWcE0+hkq/KTeBCPtEOjDOBKBKwDumVg==", - "dev": true, - "dependencies": { - "@hapi/bounce": "^3.0.1", - "@hapi/hoek": "^11.0.2" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/statehood": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@hapi/statehood/-/statehood-8.0.1.tgz", - "integrity": "sha512-xsKPbouuVX0x5v5TD5FX3m5W5z+HMDutcFkOskien3g7Zo8EtuIAhgtkGxG4voH3OU8PxNz0C6Oxegwoltrsog==", - "dev": true, - "dependencies": { - "@hapi/boom": "^10.0.1", - "@hapi/bounce": "^3.0.1", - "@hapi/bourne": "^3.0.0", - "@hapi/cryptiles": "^6.0.1", - "@hapi/hoek": "^11.0.2", - "@hapi/iron": "^7.0.1", - "@hapi/validate": "^2.0.1" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/subtext": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@hapi/subtext/-/subtext-8.1.0.tgz", - "integrity": "sha512-PyaN4oSMtqPjjVxLny1k0iYg4+fwGusIhaom9B2StinBclHs7v46mIW706Y+Wo21lcgulGyXbQrmT/w4dus6ww==", - "dev": true, - "dependencies": { - "@hapi/boom": "^10.0.1", - "@hapi/bourne": "^3.0.0", - "@hapi/content": "^6.0.0", - "@hapi/file": "^3.0.0", - "@hapi/hoek": "^11.0.2", - "@hapi/pez": "^6.1.0", - "@hapi/wreck": "^18.0.1" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/teamwork": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@hapi/teamwork/-/teamwork-6.0.0.tgz", - "integrity": "sha512-05HumSy3LWfXpmJ9cr6HzwhAavrHkJ1ZRCmNE2qJMihdM5YcWreWPfyN0yKT2ZjCM92au3ZkuodjBxOibxM67A==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/topo": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-6.0.1.tgz", - "integrity": "sha512-JioWUZL1Bm7r8bnCDx2AUggiPwpV7djFfDTWT1aZSyHjN++fVz7XPdW8YVCxvyv9bSWcbbOLV/h4U1zGdwrN3w==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^11.0.2" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/validate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@hapi/validate/-/validate-2.0.1.tgz", - "integrity": "sha512-NZmXRnrSLK8MQ9y/CMqE9WSspgB9xA41/LlYR0k967aSZebWr4yNrpxIbov12ICwKy4APSlWXZga9jN5p6puPA==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^11.0.2", - "@hapi/topo": "^6.0.1" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/vise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@hapi/vise/-/vise-5.0.1.tgz", - "integrity": "sha512-XZYWzzRtINQLedPYlIkSkUr7m5Ddwlu99V9elh8CSygXstfv3UnWIXT0QD+wmR0VAG34d2Vx3olqcEhRRoTu9A==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^11.0.2" - } - }, - "node_modules/ipfsd-ctl/node_modules/@hapi/wreck": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@hapi/wreck/-/wreck-18.0.1.tgz", - "integrity": "sha512-OLHER70+rZxvDl75xq3xXOfd3e8XIvz8fWY0dqg92UvhZ29zo24vQgfqgHSYhB5ZiuFpSLeriOisAlxAo/1jWg==", - "dev": true, - "dependencies": { - "@hapi/boom": "^10.0.1", - "@hapi/bourne": "^3.0.0", - "@hapi/hoek": "^11.0.2" - } - }, "node_modules/ipns": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ipns/-/ipns-5.0.1.tgz", @@ -8746,13 +8186,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-deflate": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", - "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==", - "dev": true, - "peer": true - }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -8816,16 +8249,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-gzip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", - "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-installed-globally": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", @@ -9009,12 +8432,12 @@ } }, "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9124,7 +8547,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "dev": true, + "optional": true }, "node_modules/isexe": { "version": "2.0.0", @@ -9760,13 +9184,10 @@ "dev": true }, "node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, "node_modules/json-schema": { "version": "0.4.0", @@ -10185,6 +9606,19 @@ "node": ">=6" } }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/load-json-file/node_modules/type-fest": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", @@ -10323,13 +9757,15 @@ } }, "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "dev": true, - "peer": true, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lru": { @@ -10488,18 +9924,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/merge-options": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", @@ -11017,13 +10441,15 @@ } }, "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true, - "peer": true, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/min-indent": { @@ -11137,6 +10563,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "optional": true, "dependencies": { "minimist": "^1.2.6" }, @@ -11144,13 +10571,6 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true, - "peer": true - }, "node_modules/mocha": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", @@ -11538,13 +10958,12 @@ } }, "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", "dev": true, - "peer": true, "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11860,25 +11279,13 @@ "node": ">= 0.8.0" } }, - "node_modules/orbit-db-test-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/orbit-db-test-utils/-/orbit-db-test-utils-3.0.0.tgz", - "integrity": "sha512-Hrjjjs9Vaf8jwDYvtHHaSEPmj41amnpvnjYNOuPAgJnXSkPwv1Tr6OoOR2hyFcbaVacx6PAW/iOnYiveGZ4oNQ==", - "dev": true, - "peerDependencies": { - "go-ipfs": "*", - "ipfs": "*", - "ipfsd-ctl": "*" - } - }, "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "dev": true, - "peer": true, "engines": { - "node": ">=8" + "node": ">=12.20" } }, "node_modules/p-defer": { @@ -12144,21 +11551,6 @@ "integrity": "sha512-WyUjRAvK4CG9DUW21ZsNYcBj6guN7pgZAOFR8mUtyNXyPC5WUo3L48nxI5TsGEZ+VJhZXzyeH/Sxi2lxYcPp3A==", "dev": true }, - "node_modules/p-wait-for": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-5.0.0.tgz", - "integrity": "sha512-nkxeZInKET8e78NTtqBgxpnxDLbiCiQnGdoTnkLkluovfTyI5UTCrGwPNOr6ewJ90NpWyxEFt1ToZ96LmIXXHQ==", - "dev": true, - "dependencies": { - "p-timeout": "^6.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/package-json": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", @@ -12177,173 +11569,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json/node_modules/@sindresorhus/is": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", - "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/package-json/node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/package-json/node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/package-json/node_modules/cacheable-request": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.8.tgz", - "integrity": "sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.2", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/package-json/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json/node_modules/got": { - "version": "12.5.3", - "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz", - "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.1", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/package-json/node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/package-json/node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json/node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json/node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/package-json/node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", - "dev": true, - "peer": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "dev": true }, "node_modules/param-case": { "version": "3.0.4", @@ -12374,16 +11604,21 @@ "dev": true }, "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "dependencies": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pascal-case": { @@ -12471,18 +11706,6 @@ "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/peek-stream": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", - "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", - "dev": true, - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "duplexify": "^3.5.0", - "through2": "^2.0.3" - } - }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -12828,7 +12051,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "dev": true, + "optional": true }, "node_modules/process-warning": { "version": "1.0.0", @@ -12986,6 +12210,11 @@ "node": ">=12.0.0" } }, + "node_modules/protobufjs/node_modules/@types/node": { + "version": "18.14.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.3.tgz", + "integrity": "sha512-1y36CC5iL5CMyKALzwX9cwwxcWIxvIBe3gzs4GrXWXEQ8klQnCZ2U/WDGiNrXHmQcUhnaun17XG9TEIDlGj2RA==" + }, "node_modules/protobufjs/node_modules/long": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", @@ -13031,29 +12260,6 @@ "once": "^1.3.1" } }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "peer": true, - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "peer": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -13119,12 +12325,12 @@ "dev": true }, "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.1.tgz", + "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -13237,6 +12443,15 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/read-pkg": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", @@ -13272,59 +12487,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "optional": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -13339,7 +12507,8 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "optional": true }, "node_modules/readable-web-to-node-stream": { "version": "3.0.2", @@ -13656,13 +12825,15 @@ } }, "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "dev": true, - "peer": true, "dependencies": { - "lowercase-keys": "^2.0.0" + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14310,13 +13481,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true, - "peer": true - }, "node_modules/stream-to-it": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/stream-to-it/-/stream-to-it-0.2.4.tgz", @@ -14589,95 +13753,6 @@ "node": ">=10" } }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "peer": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true, - "peer": true - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "peer": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "peer": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/tar-stream/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", - "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/tar/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -14708,24 +13783,6 @@ "node": ">=8" } }, - "node_modules/temp-write": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-5.0.0.tgz", - "integrity": "sha512-cJhnzBW7DjNox7VcZDXeNlQSkIh3mX/h+M0n0Fh+zgT7YAHwI9c+OngKx4MCiQCVx9iXxV104xYlJgDBCCtawA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.6", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/tempy": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.0.0.tgz", @@ -14744,18 +13801,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tempy/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/tempy/node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", @@ -14838,6 +13883,7 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, + "optional": true, "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -14945,16 +13991,6 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "dev": true, - "peer": true, - "engines": { - "node": "*" - } - }, "node_modules/trim-newlines": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.0.2.tgz", @@ -15037,13 +14073,15 @@ } }, "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "peer": true, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typed-array-length": { @@ -15252,6 +14290,12 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unified-engine/node_modules/@types/node": { + "version": "18.14.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.3.tgz", + "integrity": "sha512-1y36CC5iL5CMyKALzwX9cwwxcWIxvIBe3gzs4GrXWXEQ8klQnCZ2U/WDGiNrXHmQcUhnaun17XG9TEIDlGj2RA==", + "dev": true + }, "node_modules/unified-engine/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -15307,12 +14351,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unified-engine/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, "node_modules/unified-engine/node_modules/lines-and-columns": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", @@ -15470,17 +14508,6 @@ "node": ">= 10.0.0" } }, - "node_modules/unzip-stream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/unzip-stream/-/unzip-stream-0.3.1.tgz", - "integrity": "sha512-RzaGXLNt+CW+T41h1zl6pGz3EaeVhYlK+rdAap+7DxW5kqsqePO8kRtWPaCiVqdhZc86EctSPVYNix30YOMzmw==", - "dev": true, - "peer": true, - "dependencies": { - "binary": "^0.3.0", - "mkdirp": "^0.5.1" - } - }, "node_modules/update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -15992,12 +15019,6 @@ "node": ">=4.0" } }, - "node_modules/webpack/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -16356,6 +15377,7 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, + "optional": true, "engines": { "node": ">=0.4" } @@ -16663,6 +15685,12 @@ "uint8arrays": "^4.0.2" }, "dependencies": { + "@types/node": { + "version": "18.14.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.3.tgz", + "integrity": "sha512-1y36CC5iL5CMyKALzwX9cwwxcWIxvIBe3gzs4GrXWXEQ8klQnCZ2U/WDGiNrXHmQcUhnaun17XG9TEIDlGj2RA==", + "dev": true + }, "protobufjs": { "version": "6.11.3", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", @@ -16750,6 +15778,14 @@ "requires": { "@grpc/proto-loader": "^0.7.0", "@types/node": ">=12.12.47" + }, + "dependencies": { + "@types/node": { + "version": "18.14.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.3.tgz", + "integrity": "sha512-1y36CC5iL5CMyKALzwX9cwwxcWIxvIBe3gzs4GrXWXEQ8klQnCZ2U/WDGiNrXHmQcUhnaun17XG9TEIDlGj2RA==", + "dev": true + } } }, "@grpc/proto-loader": { @@ -18278,11 +17314,10 @@ "dev": true }, "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "peer": true + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", + "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", + "dev": true }, "@socket.io/component-emitter": { "version": "3.1.0", @@ -18433,13 +17468,12 @@ } }, "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dev": true, - "peer": true, "requires": { - "defer-to-connect": "^2.0.0" + "defer-to-connect": "^2.0.1" } }, "@tokenizer/token": { @@ -18448,19 +17482,6 @@ "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", "dev": true }, - "@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "peer": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, "@types/concat-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-2.0.0.tgz", @@ -18538,16 +17559,6 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*" - } - }, "@types/long": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", @@ -18592,9 +17603,10 @@ } }, "@types/node": { - "version": "18.14.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.3.tgz", - "integrity": "sha512-1y36CC5iL5CMyKALzwX9cwwxcWIxvIBe3gzs4GrXWXEQ8klQnCZ2U/WDGiNrXHmQcUhnaun17XG9TEIDlGj2RA==" + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "dev": true }, "@types/normalize-package-data": { "version": "2.4.1", @@ -18602,16 +17614,6 @@ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*" - } - }, "@types/retry": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", @@ -19242,17 +18244,6 @@ "platform": "^1.3.3" } }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", - "dev": true, - "peer": true, - "requires": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - } - }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -19449,16 +18440,6 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", - "dev": true, - "peer": true, - "requires": { - "pako": "~0.2.0" - } - }, "browserslist": { "version": "4.21.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", @@ -19493,13 +18474,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "dev": true, - "peer": true - }, "builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -19540,35 +18514,26 @@ "dev": true }, "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "peer": true + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "dev": true }, "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "10.2.8", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.8.tgz", + "integrity": "sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==", "dev": true, - "peer": true, "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" } }, - "cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", - "dev": true, - "peer": true - }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -19613,10 +18578,10 @@ "type-fest": "^1.2.1" }, "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true } } @@ -19655,16 +18620,6 @@ "resolved": "https://registry.npmjs.org/cborg/-/cborg-1.10.0.tgz", "integrity": "sha512-/eM0JCaL99HDHxjySNQJLaolZFVdl6VA0/hEKIoiQPcQzE5LrG5QHdml0HaBt31brgB9dNe1zMr3f8IVrpotRQ==" }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", - "dev": true, - "peer": true, - "requires": { - "traverse": ">=0.3.0 <0.4" - } - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -19814,16 +18769,6 @@ "is-regexp": "^3.0.0" } }, - "clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "peer": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -19957,7 +18902,8 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "dev": true, + "optional": true }, "cp-file": { "version": "9.1.0", @@ -20024,14 +18970,6 @@ "dev": true, "requires": { "type-fest": "^1.0.1" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - } } }, "dag-jose": { @@ -20243,18 +19181,18 @@ "strip-final-newline": "^2.0.0" } }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -20451,19 +19389,6 @@ "is-obj": "^2.0.0" } }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "peer": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -20509,15 +19434,6 @@ "@types/node": "^8.0.24", "electron-download": "^3.0.1", "extract-zip": "^1.0.3" - }, - "dependencies": { - "@types/node": { - "version": "8.10.66", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", - "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", - "dev": true, - "optional": true - } } }, "electron-download": { @@ -21294,20 +20210,6 @@ "onetime": "^6.0.0", "signal-exit": "^3.0.7", "strip-final-newline": "^3.0.0" - }, - "dependencies": { - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - } } }, "extend": { @@ -21629,13 +20531,6 @@ "integrity": "sha512-dwWpT1DdQcwrhmRwnDnPM/ZFny+FtzU+k50qF2eid3KxaQDsMiBrwo1i0G3qSugkN5db6Cb0zgfc68QeTOpEFg==", "dev": true }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true, - "peer": true - }, "fs-extra": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", @@ -21779,14 +20674,10 @@ "dev": true }, "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "peer": true, - "requires": { - "pump": "^3.0.0" - } + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true }, "get-symbol-description": { "version": "1.0.0", @@ -21893,22 +20784,6 @@ "slash": "^4.0.0" } }, - "go-ipfs": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/go-ipfs/-/go-ipfs-0.18.1.tgz", - "integrity": "sha512-hXfjQRqet/H8mTSQVKiuTSMrvjv8cAGQMHbr12DHAHGsSMS9IuGCOntkVEhnNOnmP/WXcrxRVxLu6xz/mPLlZg==", - "dev": true, - "peer": true, - "requires": { - "cachedir": "^2.3.0", - "got": "^11.7.0", - "gunzip-maybe": "^1.4.2", - "hasha": "^5.2.2", - "pkg-conf": "^3.1.0", - "tar-fs": "^2.1.0", - "unzip-stream": "^0.3.0" - } - }, "gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -21919,23 +20794,22 @@ } }, "got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "version": "12.5.3", + "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz", + "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==", "dev": true, - "peer": true, "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.1", "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" } }, "graceful-fs": { @@ -21950,21 +20824,6 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, - "gunzip-maybe": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", - "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", - "dev": true, - "peer": true, - "requires": { - "browserify-zlib": "^0.1.4", - "is-deflate": "^1.0.0", - "is-gzip": "^1.0.0", - "peek-stream": "^1.1.0", - "pumpify": "^1.3.3", - "through2": "^2.0.3" - } - }, "hamt-sharding": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/hamt-sharding/-/hamt-sharding-3.0.2.tgz", @@ -22083,17 +20942,6 @@ "minimalistic-assert": "^1.0.1" } }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "peer": true, - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - } - }, "hashlru": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/hashlru/-/hashlru-2.3.0.tgz", @@ -22180,14 +21028,21 @@ } }, "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", "dev": true, - "peer": true, "requires": { "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" + "resolve-alpn": "^1.2.0" + }, + "dependencies": { + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + } } }, "https-proxy-agent": { @@ -22523,14 +21378,6 @@ "parse-duration": "^1.0.0", "timeout-abort-controller": "^3.0.0", "uint8arrays": "^4.0.2" - }, - "dependencies": { - "pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", - "dev": true - } } }, "ipfs-core-config": { @@ -22579,6 +21426,14 @@ "interface-datastore": "^7.0.0", "ipfs-unixfs": "^9.0.0", "multiformats": "^11.0.0" + }, + "dependencies": { + "@types/node": { + "version": "18.14.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.3.tgz", + "integrity": "sha512-1y36CC5iL5CMyKALzwX9cwwxcWIxvIBe3gzs4GrXWXEQ8klQnCZ2U/WDGiNrXHmQcUhnaun17XG9TEIDlGj2RA==", + "dev": true + } } }, "ipfs-core-utils": { @@ -22813,12 +21668,6 @@ "requires": { "it-batch": "^2.0.0" } - }, - "quick-lru": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.1.tgz", - "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==", - "dev": true } } }, @@ -22961,333 +21810,6 @@ } } }, - "ipfsd-ctl": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/ipfsd-ctl/-/ipfsd-ctl-13.0.0.tgz", - "integrity": "sha512-wT+2nWCT3njaMdcVeLOu5ABCZ9QasdQaiXXBuGdxaXriu7T7KXYjJ+nTsc+glyYgCtvpLwatT7CJMCg/XcXMxw==", - "dev": true, - "requires": { - "@hapi/boom": "^10.0.0", - "@hapi/hapi": "^21.1.0", - "@libp2p/interface-peer-id": "^2.0.0", - "@libp2p/logger": "^2.0.0", - "@multiformats/multiaddr": "^11.0.0", - "execa": "^6.1.0", - "ipfs-utils": "^9.0.1", - "joi": "^17.2.1", - "merge-options": "^3.0.1", - "nanoid": "^4.0.0", - "p-wait-for": "^5.0.0", - "temp-write": "^5.0.0", - "wherearewe": "^2.0.1" - }, - "dependencies": { - "@hapi/accept": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-6.0.1.tgz", - "integrity": "sha512-aLkYj7zzgC3CSlEVOs84eBOEE3i9xZK2tdQEP+TOj2OFzMWCi9zjkRet82V3GGjecE//zFrCLKIykuaE0uM4bg==", - "dev": true, - "requires": { - "@hapi/boom": "^10.0.1", - "@hapi/hoek": "^11.0.2" - } - }, - "@hapi/ammo": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/ammo/-/ammo-6.0.1.tgz", - "integrity": "sha512-pmL+nPod4g58kXrMcsGLp05O2jF4P2Q3GiL8qYV7nKYEh3cGf+rV4P5Jyi2Uq0agGhVU63GtaSAfBEZOlrJn9w==", - "dev": true, - "requires": { - "@hapi/hoek": "^11.0.2" - } - }, - "@hapi/b64": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-6.0.1.tgz", - "integrity": "sha512-ZvjX4JQReUmBheeCq+S9YavcnMMHWqx3S0jHNXWIM1kQDxB9cyfSycpVvjfrKcIS8Mh5N3hmu/YKo4Iag9g2Kw==", - "dev": true, - "requires": { - "@hapi/hoek": "^11.0.2" - } - }, - "@hapi/boom": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-10.0.1.tgz", - "integrity": "sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA==", - "dev": true, - "requires": { - "@hapi/hoek": "^11.0.2" - } - }, - "@hapi/bounce": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@hapi/bounce/-/bounce-3.0.1.tgz", - "integrity": "sha512-G+/Pp9c1Ha4FDP+3Sy/Xwg2O4Ahaw3lIZFSX+BL4uWi64CmiETuZPxhKDUD4xBMOUZbBlzvO8HjiK8ePnhBadA==", - "dev": true, - "requires": { - "@hapi/boom": "^10.0.1", - "@hapi/hoek": "^11.0.2" - } - }, - "@hapi/bourne": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-3.0.0.tgz", - "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==", - "dev": true - }, - "@hapi/call": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@hapi/call/-/call-9.0.1.tgz", - "integrity": "sha512-uPojQRqEL1GRZR4xXPqcLMujQGaEpyVPRyBlD8Pp5rqgIwLhtveF9PkixiKru2THXvuN8mUrLeet5fqxKAAMGg==", - "dev": true, - "requires": { - "@hapi/boom": "^10.0.1", - "@hapi/hoek": "^11.0.2" - } - }, - "@hapi/catbox": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@hapi/catbox/-/catbox-12.1.1.tgz", - "integrity": "sha512-hDqYB1J+R0HtZg4iPH3LEnldoaBsar6bYp0EonBmNQ9t5CO+1CqgCul2ZtFveW1ReA5SQuze9GPSU7/aecERhw==", - "dev": true, - "requires": { - "@hapi/boom": "^10.0.1", - "@hapi/hoek": "^11.0.2", - "@hapi/podium": "^5.0.0", - "@hapi/validate": "^2.0.1" - } - }, - "@hapi/catbox-memory": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/catbox-memory/-/catbox-memory-6.0.1.tgz", - "integrity": "sha512-sVb+/ZxbZIvaMtJfAbdyY+QJUQg9oKTwamXpEg/5xnfG5WbJLTjvEn4kIGKz9pN3ENNbIL/bIdctmHmqi/AdGA==", - "dev": true, - "requires": { - "@hapi/boom": "^10.0.1", - "@hapi/hoek": "^11.0.2" - } - }, - "@hapi/content": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@hapi/content/-/content-6.0.0.tgz", - "integrity": "sha512-CEhs7j+H0iQffKfe5Htdak5LBOz/Qc8TRh51cF+BFv0qnuph3Em4pjGVzJMkI2gfTDdlJKWJISGWS1rK34POGA==", - "dev": true, - "requires": { - "@hapi/boom": "^10.0.0" - } - }, - "@hapi/cryptiles": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/cryptiles/-/cryptiles-6.0.1.tgz", - "integrity": "sha512-9GM9ECEHfR8lk5ASOKG4+4ZsEzFqLfhiryIJ2ISePVB92OHLp/yne4m+zn7z9dgvM98TLpiFebjDFQ0UHcqxXQ==", - "dev": true, - "requires": { - "@hapi/boom": "^10.0.1" - } - }, - "@hapi/file": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@hapi/file/-/file-3.0.0.tgz", - "integrity": "sha512-w+lKW+yRrLhJu620jT3y+5g2mHqnKfepreykvdOcl9/6up8GrQQn+l3FRTsjHTKbkbfQFkuksHpdv2EcpKcJ4Q==", - "dev": true - }, - "@hapi/hapi": { - "version": "21.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hapi/-/hapi-21.3.0.tgz", - "integrity": "sha512-D0g78N1GlbhYteuDFEL3yA3zv/MMQZC9q7U1bblwGNdh1M4oIuy5u3eEeiBSdy7HY8oWhwPCnr0s9287MIctzg==", - "dev": true, - "requires": { - "@hapi/accept": "^6.0.1", - "@hapi/ammo": "^6.0.1", - "@hapi/boom": "^10.0.1", - "@hapi/bounce": "^3.0.1", - "@hapi/call": "^9.0.1", - "@hapi/catbox": "^12.1.1", - "@hapi/catbox-memory": "^6.0.1", - "@hapi/heavy": "^8.0.1", - "@hapi/hoek": "^11.0.2", - "@hapi/mimos": "^7.0.1", - "@hapi/podium": "^5.0.1", - "@hapi/shot": "^6.0.1", - "@hapi/somever": "^4.1.1", - "@hapi/statehood": "^8.0.1", - "@hapi/subtext": "^8.1.0", - "@hapi/teamwork": "^6.0.0", - "@hapi/topo": "^6.0.1", - "@hapi/validate": "^2.0.1" - } - }, - "@hapi/heavy": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@hapi/heavy/-/heavy-8.0.1.tgz", - "integrity": "sha512-gBD/NANosNCOp6RsYTsjo2vhr5eYA3BEuogk6cxY0QdhllkkTaJFYtTXv46xd6qhBVMbMMqcSdtqey+UQU3//w==", - "dev": true, - "requires": { - "@hapi/boom": "^10.0.1", - "@hapi/hoek": "^11.0.2", - "@hapi/validate": "^2.0.1" - } - }, - "@hapi/hoek": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.2.tgz", - "integrity": "sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw==", - "dev": true - }, - "@hapi/iron": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-7.0.1.tgz", - "integrity": "sha512-tEZnrOujKpS6jLKliyWBl3A9PaE+ppuL/+gkbyPPDb/l2KSKQyH4lhMkVb+sBhwN+qaxxlig01JRqB8dk/mPxQ==", - "dev": true, - "requires": { - "@hapi/b64": "^6.0.1", - "@hapi/boom": "^10.0.1", - "@hapi/bourne": "^3.0.0", - "@hapi/cryptiles": "^6.0.1", - "@hapi/hoek": "^11.0.2" - } - }, - "@hapi/mimos": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@hapi/mimos/-/mimos-7.0.1.tgz", - "integrity": "sha512-b79V+BrG0gJ9zcRx1VGcCI6r6GEzzZUgiGEJVoq5gwzuB2Ig9Cax8dUuBauQCFKvl2YWSWyOc8mZ8HDaJOtkew==", - "dev": true, - "requires": { - "@hapi/hoek": "^11.0.2", - "mime-db": "^1.52.0" - } - }, - "@hapi/nigel": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@hapi/nigel/-/nigel-5.0.1.tgz", - "integrity": "sha512-uv3dtYuB4IsNaha+tigWmN8mQw/O9Qzl5U26Gm4ZcJVtDdB1AVJOwX3X5wOX+A07qzpEZnOMBAm8jjSqGsU6Nw==", - "dev": true, - "requires": { - "@hapi/hoek": "^11.0.2", - "@hapi/vise": "^5.0.1" - } - }, - "@hapi/pez": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@hapi/pez/-/pez-6.1.0.tgz", - "integrity": "sha512-+FE3sFPYuXCpuVeHQ/Qag1b45clR2o54QoonE/gKHv9gukxQ8oJJZPR7o3/ydDTK6racnCJXxOyT1T93FCJMIg==", - "dev": true, - "requires": { - "@hapi/b64": "^6.0.1", - "@hapi/boom": "^10.0.1", - "@hapi/content": "^6.0.0", - "@hapi/hoek": "^11.0.2", - "@hapi/nigel": "^5.0.1" - } - }, - "@hapi/podium": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-5.0.1.tgz", - "integrity": "sha512-eznFTw6rdBhAijXFIlBOMJJd+lXTvqbrBIS4Iu80r2KTVIo4g+7fLy4NKp/8+UnSt5Ox6mJtAlKBU/Sf5080TQ==", - "dev": true, - "requires": { - "@hapi/hoek": "^11.0.2", - "@hapi/teamwork": "^6.0.0", - "@hapi/validate": "^2.0.1" - } - }, - "@hapi/shot": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/shot/-/shot-6.0.1.tgz", - "integrity": "sha512-s5ynMKZXYoDd3dqPw5YTvOR/vjHvMTxc388+0qL0jZZP1+uwXuUD32o9DuuuLsmTlyXCWi02BJl1pBpwRuUrNA==", - "dev": true, - "requires": { - "@hapi/hoek": "^11.0.2", - "@hapi/validate": "^2.0.1" - } - }, - "@hapi/somever": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@hapi/somever/-/somever-4.1.1.tgz", - "integrity": "sha512-lt3QQiDDOVRatS0ionFDNrDIv4eXz58IibQaZQDOg4DqqdNme8oa0iPWcE0+hkq/KTeBCPtEOjDOBKBKwDumVg==", - "dev": true, - "requires": { - "@hapi/bounce": "^3.0.1", - "@hapi/hoek": "^11.0.2" - } - }, - "@hapi/statehood": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@hapi/statehood/-/statehood-8.0.1.tgz", - "integrity": "sha512-xsKPbouuVX0x5v5TD5FX3m5W5z+HMDutcFkOskien3g7Zo8EtuIAhgtkGxG4voH3OU8PxNz0C6Oxegwoltrsog==", - "dev": true, - "requires": { - "@hapi/boom": "^10.0.1", - "@hapi/bounce": "^3.0.1", - "@hapi/bourne": "^3.0.0", - "@hapi/cryptiles": "^6.0.1", - "@hapi/hoek": "^11.0.2", - "@hapi/iron": "^7.0.1", - "@hapi/validate": "^2.0.1" - } - }, - "@hapi/subtext": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@hapi/subtext/-/subtext-8.1.0.tgz", - "integrity": "sha512-PyaN4oSMtqPjjVxLny1k0iYg4+fwGusIhaom9B2StinBclHs7v46mIW706Y+Wo21lcgulGyXbQrmT/w4dus6ww==", - "dev": true, - "requires": { - "@hapi/boom": "^10.0.1", - "@hapi/bourne": "^3.0.0", - "@hapi/content": "^6.0.0", - "@hapi/file": "^3.0.0", - "@hapi/hoek": "^11.0.2", - "@hapi/pez": "^6.1.0", - "@hapi/wreck": "^18.0.1" - } - }, - "@hapi/teamwork": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@hapi/teamwork/-/teamwork-6.0.0.tgz", - "integrity": "sha512-05HumSy3LWfXpmJ9cr6HzwhAavrHkJ1ZRCmNE2qJMihdM5YcWreWPfyN0yKT2ZjCM92au3ZkuodjBxOibxM67A==", - "dev": true - }, - "@hapi/topo": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-6.0.1.tgz", - "integrity": "sha512-JioWUZL1Bm7r8bnCDx2AUggiPwpV7djFfDTWT1aZSyHjN++fVz7XPdW8YVCxvyv9bSWcbbOLV/h4U1zGdwrN3w==", - "dev": true, - "requires": { - "@hapi/hoek": "^11.0.2" - } - }, - "@hapi/validate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@hapi/validate/-/validate-2.0.1.tgz", - "integrity": "sha512-NZmXRnrSLK8MQ9y/CMqE9WSspgB9xA41/LlYR0k967aSZebWr4yNrpxIbov12ICwKy4APSlWXZga9jN5p6puPA==", - "dev": true, - "requires": { - "@hapi/hoek": "^11.0.2", - "@hapi/topo": "^6.0.1" - } - }, - "@hapi/vise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@hapi/vise/-/vise-5.0.1.tgz", - "integrity": "sha512-XZYWzzRtINQLedPYlIkSkUr7m5Ddwlu99V9elh8CSygXstfv3UnWIXT0QD+wmR0VAG34d2Vx3olqcEhRRoTu9A==", - "dev": true, - "requires": { - "@hapi/hoek": "^11.0.2" - } - }, - "@hapi/wreck": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@hapi/wreck/-/wreck-18.0.1.tgz", - "integrity": "sha512-OLHER70+rZxvDl75xq3xXOfd3e8XIvz8fWY0dqg92UvhZ29zo24vQgfqgHSYhB5ZiuFpSLeriOisAlxAo/1jWg==", - "dev": true, - "requires": { - "@hapi/boom": "^10.0.1", - "@hapi/bourne": "^3.0.0", - "@hapi/hoek": "^11.0.2" - } - } - } - }, "ipns": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ipns/-/ipns-5.0.1.tgz", @@ -23392,13 +21914,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-deflate": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", - "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==", - "dev": true, - "peer": true - }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -23444,13 +21959,6 @@ "is-extglob": "^2.1.1" } }, - "is-gzip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", - "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==", - "dev": true, - "peer": true - }, "is-installed-globally": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", @@ -23570,9 +22078,9 @@ } }, "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true }, "is-string": { @@ -23646,7 +22154,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "dev": true, + "optional": true }, "isexe": { "version": "2.0.0", @@ -24120,9 +22629,9 @@ "dev": true }, "json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, "json-schema": { @@ -24468,6 +22977,16 @@ "type-fest": "^0.3.0" }, "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, "type-fest": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", @@ -24575,11 +23094,10 @@ } }, "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "peer": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true }, "lru": { "version": "3.1.0", @@ -24694,14 +23212,6 @@ "trim-newlines": "^4.0.2", "type-fest": "^1.2.2", "yargs-parser": "^20.2.9" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - } } }, "merge-options": { @@ -24990,11 +23500,10 @@ "dev": true }, "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "peer": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "dev": true }, "min-indent": { "version": "1.0.1", @@ -25084,17 +23593,11 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "optional": true, "requires": { "minimist": "^1.2.6" } }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true, - "peer": true - }, "mocha": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", @@ -25381,11 +23884,10 @@ "dev": true }, "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "peer": true + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "dev": true }, "npm-normalize-package-bin": { "version": "3.0.0", @@ -25613,19 +24115,11 @@ "word-wrap": "^1.2.3" } }, - "orbit-db-test-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/orbit-db-test-utils/-/orbit-db-test-utils-3.0.0.tgz", - "integrity": "sha512-Hrjjjs9Vaf8jwDYvtHHaSEPmj41amnpvnjYNOuPAgJnXSkPwv1Tr6OoOR2hyFcbaVacx6PAW/iOnYiveGZ4oNQ==", - "dev": true, - "requires": {} - }, "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, - "peer": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true }, "p-defer": { "version": "4.0.0", @@ -25796,15 +24290,6 @@ "integrity": "sha512-WyUjRAvK4CG9DUW21ZsNYcBj6guN7pgZAOFR8mUtyNXyPC5WUo3L48nxI5TsGEZ+VJhZXzyeH/Sxi2lxYcPp3A==", "dev": true }, - "p-wait-for": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-5.0.0.tgz", - "integrity": "sha512-nkxeZInKET8e78NTtqBgxpnxDLbiCiQnGdoTnkLkluovfTyI5UTCrGwPNOr6ewJ90NpWyxEFt1ToZ96LmIXXHQ==", - "dev": true, - "requires": { - "p-timeout": "^6.0.0" - } - }, "package-json": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", @@ -25815,120 +24300,13 @@ "registry-auth-token": "^5.0.1", "registry-url": "^6.0.0", "semver": "^7.3.7" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", - "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.1" - } - }, - "cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true - }, - "cacheable-request": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.8.tgz", - "integrity": "sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.2", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "got": { - "version": "12.5.3", - "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz", - "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==", - "dev": true, - "requires": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.1", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - } - }, - "http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - } - }, - "lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true - }, - "mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true - }, - "normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true - }, - "p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true - }, - "responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "requires": { - "lowercase-keys": "^3.0.0" - } - } } }, "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", - "dev": true, - "peer": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "dev": true }, "param-case": { "version": "3.0.4", @@ -25956,13 +24334,15 @@ "dev": true }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, "pascal-case": { @@ -26031,18 +24411,6 @@ "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", "dev": true }, - "peek-stream": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", - "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", - "dev": true, - "peer": true, - "requires": { - "buffer-from": "^1.0.0", - "duplexify": "^3.5.0", - "through2": "^2.0.3" - } - }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -26310,7 +24678,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "dev": true, + "optional": true }, "process-warning": { "version": "1.0.0", @@ -26456,6 +24825,11 @@ "long": "^5.0.0" }, "dependencies": { + "@types/node": { + "version": "18.14.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.3.tgz", + "integrity": "sha512-1y36CC5iL5CMyKALzwX9cwwxcWIxvIBe3gzs4GrXWXEQ8klQnCZ2U/WDGiNrXHmQcUhnaun17XG9TEIDlGj2RA==" + }, "long": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", @@ -26496,31 +24870,6 @@ "once": "^1.3.1" } }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "peer": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "peer": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -26557,9 +24906,9 @@ "dev": true }, "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.1.tgz", + "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==", "dev": true }, "rabin-wasm": { @@ -26655,6 +25004,14 @@ "requires": { "json-parse-even-better-errors": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" + }, + "dependencies": { + "json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true + } } }, "read-pkg": { @@ -26667,32 +25024,6 @@ "normalize-package-data": "^3.0.2", "parse-json": "^5.2.0", "type-fest": "^1.0.1" - }, - "dependencies": { - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - } } }, "read-pkg-up": { @@ -26704,14 +25035,6 @@ "find-up": "^5.0.0", "read-pkg": "^6.0.0", "type-fest": "^1.0.1" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - } } }, "readable-stream": { @@ -26719,6 +25042,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -26733,7 +25057,8 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "optional": true } } }, @@ -26967,13 +25292,12 @@ "dev": true }, "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "dev": true, - "peer": true, "requires": { - "lowercase-keys": "^2.0.0" + "lowercase-keys": "^3.0.0" } }, "retimer": { @@ -27437,13 +25761,6 @@ } } }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true, - "peer": true - }, "stream-to-it": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/stream-to-it/-/stream-to-it-0.2.4.tgz", @@ -27663,79 +25980,6 @@ } } }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "peer": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true, - "peer": true - } - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "peer": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "peer": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "peer": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "readable-stream": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", - "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", - "dev": true, - "peer": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "tdigest": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", @@ -27751,18 +25995,6 @@ "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true }, - "temp-write": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-5.0.0.tgz", - "integrity": "sha512-cJhnzBW7DjNox7VcZDXeNlQSkIh3mX/h+M0n0Fh+zgT7YAHwI9c+OngKx4MCiQCVx9iXxV104xYlJgDBCCtawA==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.6", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "uuid": "^8.3.2" - } - }, "tempy": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.0.0.tgz", @@ -27775,12 +26007,6 @@ "unique-string": "^3.0.0" }, "dependencies": { - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, "type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", @@ -27832,6 +26058,7 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, + "optional": true, "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -27913,13 +26140,6 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "dev": true, - "peer": true - }, "trim-newlines": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.0.2.tgz", @@ -27986,11 +26206,10 @@ } }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "peer": true + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true }, "typed-array-length": { "version": "1.0.4", @@ -28157,6 +26376,12 @@ "yaml": "^2.0.0" }, "dependencies": { + "@types/node": { + "version": "18.14.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.3.tgz", + "integrity": "sha512-1y36CC5iL5CMyKALzwX9cwwxcWIxvIBe3gzs4GrXWXEQ8klQnCZ2U/WDGiNrXHmQcUhnaun17XG9TEIDlGj2RA==", + "dev": true + }, "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -28197,12 +26422,6 @@ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, "lines-and-columns": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", @@ -28306,17 +26525,6 @@ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true }, - "unzip-stream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/unzip-stream/-/unzip-stream-0.3.1.tgz", - "integrity": "sha512-RzaGXLNt+CW+T41h1zl6pGz3EaeVhYlK+rdAap+7DxW5kqsqePO8kRtWPaCiVqdhZc86EctSPVYNix30YOMzmw==", - "dev": true, - "peer": true, - "requires": { - "binary": "^0.3.0", - "mkdirp": "^0.5.1" - } - }, "update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -28641,12 +26849,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true } } }, @@ -28945,7 +27147,8 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "dev": true, + "optional": true }, "y18n": { "version": "5.0.8", diff --git a/package.json b/package.json index db8aa7b..ce08af9 100644 --- a/package.json +++ b/package.json @@ -34,11 +34,9 @@ "cross-env": "^7.0.3", "fs-extra": "^11.1.0", "ipfs": "^0.66.0", - "ipfsd-ctl": "^13.0.0", "it-all": "^2.0.0", "mocha": "^10.2.0", "open-cli": "^7.1.0", - "orbit-db-test-utils": "^3.0.0", "p-map-series": "^3.0.0", "path-browserify": "^1.0.1", "remark-cli": "^11.0.0", diff --git a/src/access-controllers/manifest.js b/src/access-controllers/manifest.js index 63e2fce..bf480ce 100644 --- a/src/access-controllers/manifest.js +++ b/src/access-controllers/manifest.js @@ -1,33 +1,33 @@ -import * as io from 'orbit-db-io' +// import * as io from 'orbit-db-io' -export default class AccessControllerManifest { - constructor (type, params = {}) { - this.type = type - this.params = params - } +// export default class AccessControllerManifest { +// constructor (type, params = {}) { +// this.type = type +// this.params = params +// } - static async resolve (ipfs, manifestHash, options = {}) { - if (options.skipManifest) { - if (!options.type) { - throw new Error('No manifest, access-controller type required') - } - return new AccessControllerManifest(options.type, { address: manifestHash }) - } else { - // TODO: ensure this is a valid multihash - if (manifestHash.indexOf('/ipfs') === 0) { manifestHash = manifestHash.split('/')[2] } - const { type, params } = await io.read(ipfs, manifestHash) - return new AccessControllerManifest(type, params) - } - } +// static async resolve (ipfs, manifestHash, options = {}) { +// if (options.skipManifest) { +// if (!options.type) { +// throw new Error('No manifest, access-controller type required') +// } +// return new AccessControllerManifest(options.type, { address: manifestHash }) +// } else { +// // TODO: ensure this is a valid multihash +// if (manifestHash.indexOf('/ipfs') === 0) { manifestHash = manifestHash.split('/')[2] } +// const { type, params } = await io.read(ipfs, manifestHash) +// return new AccessControllerManifest(type, params) +// } +// } - static async create (ipfs, type, params) { - if (params.skipManifest) { - return params.address - } - const manifest = { - type, - params - } - return io.write(ipfs, 'dag-cbor', manifest) - } -} +// static async create (ipfs, type, params) { +// if (params.skipManifest) { +// return params.address +// } +// const manifest = { +// type, +// params +// } +// return io.write(ipfs, 'dag-cbor', manifest) +// } +// } diff --git a/test/access-controllers/access-controller-handlers.test.js b/test/access-controllers/access-controller-handlers.test.js index 5c79503..df8c73c 100644 --- a/test/access-controllers/access-controller-handlers.test.js +++ b/test/access-controllers/access-controller-handlers.test.js @@ -1,143 +1,143 @@ -import assert from 'assert' -import rmrf from 'rimraf' -import Web3 from 'web3' -import OrbitDB from '../../src/OrbitDB.js' +// import assert from 'assert' +// import rmrf from 'rimraf' +// import Web3 from 'web3' +// import OrbitDB from '../../src/OrbitDB.js' -import IdentityProvider from 'orbit-db-identity-provider' -import Keystore from 'orbit-db-keystore' -import AccessControllers from 'orbit-db-access-controllers' -import ContractAccessController from 'orbit-db-access-controllers/contract' -import ganache from 'ganache-cli' -import Access from './Access.json' assert {type: "json"} +// import IdentityProvider from 'orbit-db-identity-provider' +// import Keystore from 'orbit-db-keystore' +// import AccessControllers from 'orbit-db-access-controllers' +// import ContractAccessController from 'orbit-db-access-controllers/contract' +// import ganache from 'ganache-cli' +// import Access from './Access.json' assert {type: "json"} -// Include test utilities -import { - config, - startIpfs, - stopIpfs, - testAPIs -} from 'orbit-db-test-utils' +// // Include test utilities +// import { +// config, +// startIpfs, +// stopIpfs, +// testAPIs +// } from 'orbit-db-test-utils' -const abi = Access.abi -const bytecode = Access.bytecode -const dbPath1 = './orbitdb/tests/orbitdb-access-controller/1' -const dbPath2 = './orbitdb/tests/orbitdb-access-controller/2' +// const abi = Access.abi +// const bytecode = Access.bytecode +// const dbPath1 = './orbitdb/tests/orbitdb-access-controller/1' +// const dbPath2 = './orbitdb/tests/orbitdb-access-controller/2' -Object.keys(testAPIs).forEach(API => { - describe(`orbit-db - Access Controller Handlers (${API})`, function () { - this.timeout(config.timeout) +// Object.keys(testAPIs).forEach(API => { +// describe(`orbit-db - Access Controller Handlers (${API})`, function () { +// this.timeout(config.timeout) - let web3, contract, ipfsd1, ipfsd2, ipfs1, ipfs2, id1, id2 - let orbitdb1, orbitdb2 +// let web3, contract, ipfsd1, ipfsd2, ipfs1, ipfs2, id1, id2 +// let orbitdb1, orbitdb2 - before(async () => { - rmrf.sync(dbPath1) - rmrf.sync(dbPath2) - ipfsd1 = await startIpfs(API, config.daemon1) - ipfsd2 = await startIpfs(API, config.daemon2) - ipfs1 = ipfsd1.api - ipfs2 = ipfsd2.api +// before(async () => { +// rmrf.sync(dbPath1) +// rmrf.sync(dbPath2) +// ipfsd1 = await startIpfs(API, config.daemon1) +// ipfsd2 = await startIpfs(API, config.daemon2) +// ipfs1 = ipfsd1.api +// ipfs2 = ipfsd2.api - const keystore1 = new Keystore(dbPath1 + '/keys') - const keystore2 = new Keystore(dbPath2 + '/keys') +// const keystore1 = new Keystore(dbPath1 + '/keys') +// const keystore2 = new Keystore(dbPath2 + '/keys') - id1 = await IdentityProvider.createIdentity({ id: 'A', keystore: keystore1 }) - id2 = await IdentityProvider.createIdentity({ id: 'B', keystore: keystore2 }) +// id1 = await IdentityProvider.createIdentity({ id: 'A', keystore: keystore1 }) +// id2 = await IdentityProvider.createIdentity({ id: 'B', keystore: keystore2 }) - orbitdb1 = await OrbitDB.createInstance(ipfs1, { - AccessControllers: AccessControllers, - directory: dbPath1, - identity: id1 - }) +// orbitdb1 = await OrbitDB.createInstance(ipfs1, { +// AccessControllers: AccessControllers, +// directory: dbPath1, +// identity: id1 +// }) - orbitdb2 = await OrbitDB.createInstance(ipfs2, { - AccessControllers: AccessControllers, - directory: dbPath2, - identity: id2 - }) - }) +// orbitdb2 = await OrbitDB.createInstance(ipfs2, { +// AccessControllers: AccessControllers, +// directory: dbPath2, +// identity: id2 +// }) +// }) - after(async () => { - if (orbitdb1) { await orbitdb1.stop() } +// after(async () => { +// if (orbitdb1) { await orbitdb1.stop() } - if (orbitdb2) { await orbitdb2.stop() } +// if (orbitdb2) { await orbitdb2.stop() } - if (ipfsd1) { await stopIpfs(ipfsd1) } +// if (ipfsd1) { await stopIpfs(ipfsd1) } - if (ipfsd2) { await stopIpfs(ipfsd2) } - }) +// if (ipfsd2) { await stopIpfs(ipfsd2) } +// }) - describe('isSupported', function () { - it('supports default access controllers', () => { - assert.strictEqual(AccessControllers.isSupported('ipfs'), true) - assert.strictEqual(AccessControllers.isSupported('orbitdb'), true) - }) +// describe('isSupported', function () { +// it('supports default access controllers', () => { +// assert.strictEqual(AccessControllers.isSupported('ipfs'), true) +// assert.strictEqual(AccessControllers.isSupported('orbitdb'), true) +// }) - it('doesn\'t support smart contract access controller by default', () => { - assert.strictEqual(AccessControllers.isSupported(ContractAccessController.type), false) - }) - }) +// it('doesn\'t support smart contract access controller by default', () => { +// assert.strictEqual(AccessControllers.isSupported(ContractAccessController.type), false) +// }) +// }) - describe('addAccessController', function () { - it('supports added access controller', () => { - const options = { - AccessController: ContractAccessController, - web3: web3, - abi: abi - } - AccessControllers.addAccessController(options) - assert.strictEqual(AccessControllers.isSupported(ContractAccessController.type), true) - }) - }) +// describe('addAccessController', function () { +// it('supports added access controller', () => { +// const options = { +// AccessController: ContractAccessController, +// web3: web3, +// abi: abi +// } +// AccessControllers.addAccessController(options) +// assert.strictEqual(AccessControllers.isSupported(ContractAccessController.type), true) +// }) +// }) - describe('create access controllers', function () { - let options = { - AccessController: ContractAccessController - } +// describe('create access controllers', function () { +// let options = { +// AccessController: ContractAccessController +// } - before(async () => { - web3 = new Web3(ganache.provider()) - const accounts = await web3.eth.getAccounts() - contract = await new web3.eth.Contract(abi) - .deploy({ data: bytecode }) - .send({ from: accounts[0], gas: '1000000' }) - options = Object.assign({}, options, { web3, abi, contractAddress: contract._address, defaultAccount: accounts[0] }) - AccessControllers.addAccessController(options) - }) +// before(async () => { +// web3 = new Web3(ganache.provider()) +// const accounts = await web3.eth.getAccounts() +// contract = await new web3.eth.Contract(abi) +// .deploy({ data: bytecode }) +// .send({ from: accounts[0], gas: '1000000' }) +// options = Object.assign({}, options, { web3, abi, contractAddress: contract._address, defaultAccount: accounts[0] }) +// AccessControllers.addAccessController(options) +// }) - it('throws an error if AccessController is not defined', async () => { - let err - try { - AccessControllers.addAccessController({}) - } catch (e) { - err = e.toString() - } - assert.strictEqual(err, 'Error: AccessController class needs to be given as an option') - }) +// it('throws an error if AccessController is not defined', async () => { +// let err +// try { +// AccessControllers.addAccessController({}) +// } catch (e) { +// err = e.toString() +// } +// assert.strictEqual(err, 'Error: AccessController class needs to be given as an option') +// }) - it('throws an error if AccessController doesn\'t define type', async () => { - let err - try { - AccessControllers.addAccessController({ AccessController: {} }) - } catch (e) { - err = e.toString() - } - assert.strictEqual(err, 'Error: Given AccessController class needs to implement: static get type() { /* return a string */}.') - }) +// it('throws an error if AccessController doesn\'t define type', async () => { +// let err +// try { +// AccessControllers.addAccessController({ AccessController: {} }) +// } catch (e) { +// err = e.toString() +// } +// assert.strictEqual(err, 'Error: Given AccessController class needs to implement: static get type() { /* return a string */}.') +// }) - it('creates a custom access controller', async () => { - const type = ContractAccessController.type - const acManifestHash = await AccessControllers.create(orbitdb1, type, options) - assert.notStrictEqual(acManifestHash, null) +// it('creates a custom access controller', async () => { +// const type = ContractAccessController.type +// const acManifestHash = await AccessControllers.create(orbitdb1, type, options) +// assert.notStrictEqual(acManifestHash, null) - const ac = await AccessControllers.resolve(orbitdb1, acManifestHash, options) - assert.strictEqual(ac.type, type) - }) +// const ac = await AccessControllers.resolve(orbitdb1, acManifestHash, options) +// assert.strictEqual(ac.type, type) +// }) - it('removes the custom access controller', async () => { - AccessControllers.removeAccessController(ContractAccessController.type) - assert.strictEqual(AccessControllers.isSupported(ContractAccessController.type), false) - }) - }) - }) -}) +// it('removes the custom access controller', async () => { +// AccessControllers.removeAccessController(ContractAccessController.type) +// assert.strictEqual(AccessControllers.isSupported(ContractAccessController.type), false) +// }) +// }) +// }) +// }) diff --git a/test/access-controllers/contract-access-controller-integration.test.js b/test/access-controllers/contract-access-controller-integration.test.js index 77fb4ac..4bfd25d 100644 --- a/test/access-controllers/contract-access-controller-integration.test.js +++ b/test/access-controllers/contract-access-controller-integration.test.js @@ -1,275 +1,275 @@ -import assert from 'assert' -import rmrf from 'rimraf' -import OrbitDB from '../../src/OrbitDB.js' -import IdentityProvider from 'orbit-db-identity-provider' -import EthIdentityProvider from 'orbit-db-identity-provider/ethereum' -import Keystore from 'orbit-db-keystore' -import AccessControllers from 'orbit-db-access-controllers' -import ContractAccessController from 'orbit-db-access-controllers/contract' -import DepositContractAccessController from 'orbit-db-access-controllers/deposit-contract' -import ganache from 'ganache-cli' -import Web3 from 'web3' -import * as io from 'orbit-db-io' -import Access from './Access.json' assert {type: "json"} -import PayDeposit from './PayDeposit.json' assert {type: "json"} +// import assert from 'assert' +// import rmrf from 'rimraf' +// import OrbitDB from '../../src/OrbitDB.js' +// import IdentityProvider from 'orbit-db-identity-provider' +// import EthIdentityProvider from 'orbit-db-identity-provider/ethereum' +// import Keystore from 'orbit-db-keystore' +// import AccessControllers from 'orbit-db-access-controllers' +// import ContractAccessController from 'orbit-db-access-controllers/contract' +// import DepositContractAccessController from 'orbit-db-access-controllers/deposit-contract' +// import ganache from 'ganache-cli' +// import Web3 from 'web3' +// import * as io from 'orbit-db-io' +// import Access from './Access.json' assert {type: "json"} +// import PayDeposit from './PayDeposit.json' assert {type: "json"} -// Include test utilities -import { - config, - startIpfs, - stopIpfs, - testAPIs, - connectPeers -} from 'orbit-db-test-utils' +// // Include test utilities +// import { +// config, +// startIpfs, +// stopIpfs, +// testAPIs, +// connectPeers +// } from 'orbit-db-test-utils' -const dbPath1 = './orbitdb/tests/contract-access-controller-integration/1' -const dbPath2 = './orbitdb/tests/contract-access-controller-integration/2' +// const dbPath1 = './orbitdb/tests/contract-access-controller-integration/1' +// const dbPath2 = './orbitdb/tests/contract-access-controller-integration/2' -const accessControllers = [ - { - AccessController: ContractAccessController, - contract: Access - }, - { - AccessController: DepositContractAccessController, - contract: PayDeposit - } -] +// const accessControllers = [ +// { +// AccessController: ContractAccessController, +// contract: Access +// }, +// { +// AccessController: DepositContractAccessController, +// contract: PayDeposit +// } +// ] -Object.keys(testAPIs).forEach(API => { - describe(`orbit-db - ContractAccessController Integration (${API})`, function () { - this.timeout(config.timeout * 2) +// Object.keys(testAPIs).forEach(API => { +// describe(`orbit-db - ContractAccessController Integration (${API})`, function () { +// this.timeout(config.timeout * 2) - let ipfsd1, ipfsd2, ipfs1, ipfs2, id1, id2 - let orbitdb1, orbitdb2 - let web3, accounts +// let ipfsd1, ipfsd2, ipfs1, ipfs2, id1, id2 +// let orbitdb1, orbitdb2 +// let web3, accounts - before(async () => { - rmrf.sync(dbPath1) - rmrf.sync(dbPath2) - ipfsd1 = await startIpfs(API, config.daemon1) - ipfsd2 = await startIpfs(API, config.daemon2) - ipfs1 = ipfsd1.api - ipfs2 = ipfsd2.api +// before(async () => { +// rmrf.sync(dbPath1) +// rmrf.sync(dbPath2) +// ipfsd1 = await startIpfs(API, config.daemon1) +// ipfsd2 = await startIpfs(API, config.daemon2) +// ipfs1 = ipfsd1.api +// ipfs2 = ipfsd2.api - // Connect the peers manually to speed up test times - const isLocalhostAddress = (addr) => addr.toString().includes('127.0.0.1') - await connectPeers(ipfs1, ipfs2, { filter: isLocalhostAddress }) +// // Connect the peers manually to speed up test times +// const isLocalhostAddress = (addr) => addr.toString().includes('127.0.0.1') +// await connectPeers(ipfs1, ipfs2, { filter: isLocalhostAddress }) - const keystore1 = new Keystore(dbPath1 + '/keys') - const keystore2 = new Keystore(dbPath2 + '/keys') - IdentityProvider.addIdentityProvider(EthIdentityProvider) +// const keystore1 = new Keystore(dbPath1 + '/keys') +// const keystore2 = new Keystore(dbPath2 + '/keys') +// IdentityProvider.addIdentityProvider(EthIdentityProvider) - id1 = await IdentityProvider.createIdentity({ type: 'ethereum', keystore: keystore1 }) - id2 = await IdentityProvider.createIdentity({ type: 'ethereum', keystore: keystore2 }) +// id1 = await IdentityProvider.createIdentity({ type: 'ethereum', keystore: keystore1 }) +// id2 = await IdentityProvider.createIdentity({ type: 'ethereum', keystore: keystore2 }) - web3 = new Web3(ganache.provider()) - accounts = await web3.eth.getAccounts() +// web3 = new Web3(ganache.provider()) +// accounts = await web3.eth.getAccounts() - accessControllers.forEach(ac => AccessControllers.addAccessController(ac)) +// accessControllers.forEach(ac => AccessControllers.addAccessController(ac)) - orbitdb1 = await OrbitDB.createInstance(ipfs1, { - AccessControllers: AccessControllers, - directory: dbPath1, - identity: id1 - }) +// orbitdb1 = await OrbitDB.createInstance(ipfs1, { +// AccessControllers: AccessControllers, +// directory: dbPath1, +// identity: id1 +// }) - orbitdb2 = await OrbitDB.createInstance(ipfs2, { - AccessControllers: AccessControllers, - directory: dbPath2, - identity: id2 - }) - }) +// orbitdb2 = await OrbitDB.createInstance(ipfs2, { +// AccessControllers: AccessControllers, +// directory: dbPath2, +// identity: id2 +// }) +// }) - after(async () => { - if (orbitdb1) { - await orbitdb1.stop() - } +// after(async () => { +// if (orbitdb1) { +// await orbitdb1.stop() +// } - if (orbitdb2) { - await orbitdb2.stop() - } +// if (orbitdb2) { +// await orbitdb2.stop() +// } - if (ipfsd1) { - await stopIpfs(ipfsd1) - } +// if (ipfsd1) { +// await stopIpfs(ipfsd1) +// } - if (ipfsd2) { - await stopIpfs(ipfsd2) - } - }) +// if (ipfsd2) { +// await stopIpfs(ipfsd2) +// } +// }) - describe('OrbitDB Integration', function () { - accessControllers.forEach(async (ac, i) => { - let db, db2 - let dbManifest, acManifest, access - let contract +// describe('OrbitDB Integration', function () { +// accessControllers.forEach(async (ac, i) => { +// let db, db2 +// let dbManifest, acManifest, access +// let contract - before(async () => { - contract = await new web3.eth.Contract(ac.contract.abi) - .deploy({ data: ac.contract.bytecode }) - .send({ from: accounts[i], gas: '1000000' }) +// before(async () => { +// contract = await new web3.eth.Contract(ac.contract.abi) +// .deploy({ data: ac.contract.bytecode }) +// .send({ from: accounts[i], gas: '1000000' }) - // DB creator needs to provide ac-type, abi and contract-address - db = await orbitdb1.feed('AABB', { - identity: id1, - accessController: { - type: ac.AccessController.type, - web3: web3, - abi: ac.contract.abi, - contractAddress: contract._address, - defaultAccount: accounts[i] - }, - timeout: 1000 - }) +// // DB creator needs to provide ac-type, abi and contract-address +// db = await orbitdb1.feed('AABB', { +// identity: id1, +// accessController: { +// type: ac.AccessController.type, +// web3: web3, +// abi: ac.contract.abi, +// contractAddress: contract._address, +// defaultAccount: accounts[i] +// }, +// timeout: 1000 +// }) - // DB peer needs to provide web3 instance - db2 = await orbitdb2.feed(db.address, { - identity: id2, - accessController: { - web3: web3, - defaultAccount: accounts[(i + 1) % accessControllers.length] // peer owns different eth-account - }, - timeout: 1000 - }) +// // DB peer needs to provide web3 instance +// db2 = await orbitdb2.feed(db.address, { +// identity: id2, +// accessController: { +// web3: web3, +// defaultAccount: accounts[(i + 1) % accessControllers.length] // peer owns different eth-account +// }, +// timeout: 1000 +// }) - await db2.load() +// await db2.load() - dbManifest = await io.read(ipfs1, db.address.root) - const hash = dbManifest.accessController.split('/').pop() - acManifest = await io.read(ipfs1, hash) - access = await io.read(ipfs1, acManifest.params.address) - }) +// dbManifest = await io.read(ipfs1, db.address.root) +// const hash = dbManifest.accessController.split('/').pop() +// acManifest = await io.read(ipfs1, hash) +// access = await io.read(ipfs1, acManifest.params.address) +// }) - it('makes database use the correct access controller', async () => { - assert.strictEqual(access.contractAddress, db.access.address) - }) +// it('makes database use the correct access controller', async () => { +// assert.strictEqual(access.contractAddress, db.access.address) +// }) - it('saves database manifest file locally', async () => { - assert.notStrictEqual(dbManifest, null) - }) +// it('saves database manifest file locally', async () => { +// assert.notStrictEqual(dbManifest, null) +// }) - it('saves access controller manifest file locally', async () => { - assert.notStrictEqual(acManifest, null) - }) +// it('saves access controller manifest file locally', async () => { +// assert.notStrictEqual(acManifest, null) +// }) - describe('database manifest', () => { - it('has correct name', async () => { - assert.strictEqual(dbManifest.name, 'AABB') - }) +// describe('database manifest', () => { +// it('has correct name', async () => { +// assert.strictEqual(dbManifest.name, 'AABB') +// }) - it('has correct type', async () => { - assert.strictEqual(dbManifest.type, 'feed') - }) +// it('has correct type', async () => { +// assert.strictEqual(dbManifest.type, 'feed') +// }) - it('has correct address', async () => { - assert.notStrictEqual(dbManifest.accessController, null) - assert.strictEqual(dbManifest.accessController.indexOf('/ipfs'), 0) - }) - }) +// it('has correct address', async () => { +// assert.notStrictEqual(dbManifest.accessController, null) +// assert.strictEqual(dbManifest.accessController.indexOf('/ipfs'), 0) +// }) +// }) - describe('access controller manifest', () => { - it('has correct type', async () => { - assert.strictEqual(acManifest.type, ac.AccessController.type) - }) +// describe('access controller manifest', () => { +// it('has correct type', async () => { +// assert.strictEqual(acManifest.type, ac.AccessController.type) +// }) - it('has correct address', async () => { - assert.strictEqual(access.contractAddress.indexOf('0x'), 0) - assert.strictEqual(access.contractAddress, db.access.address) - }) - }) +// it('has correct address', async () => { +// assert.strictEqual(access.contractAddress.indexOf('0x'), 0) +// assert.strictEqual(access.contractAddress, db.access.address) +// }) +// }) - describe('access controls', () => { - it('throws error if key not permitted to write', async () => { - let err - try { - await db.add('hello?') // should throw error - assert.strictEqual('Should not end here', false) - } catch (e) { - err = e.toString() - } - assert.strictEqual(err, `Error: Could not append entry, key "${id1.id}" is not allowed to write to the log`) - }) +// describe('access controls', () => { +// it('throws error if key not permitted to write', async () => { +// let err +// try { +// await db.add('hello?') // should throw error +// assert.strictEqual('Should not end here', false) +// } catch (e) { +// err = e.toString() +// } +// assert.strictEqual(err, `Error: Could not append entry, key "${id1.id}" is not allowed to write to the log`) +// }) - it('granting access enables to write to the database', async () => { - await db.access.grant('write', id1.id) - const doChanges = () => { - return new Promise((resolve, reject) => { - try { - db2.events.once('replicated', () => { - // FIXME: timeout to get rid of the "libp2p node not started yet" errors - setTimeout(() => resolve(), 1000) - }) - db.add('hello!') - } catch (e) { - reject(e) - } - }) - } - // Try adding something again - await doChanges() +// it('granting access enables to write to the database', async () => { +// await db.access.grant('write', id1.id) +// const doChanges = () => { +// return new Promise((resolve, reject) => { +// try { +// db2.events.once('replicated', () => { +// // FIXME: timeout to get rid of the "libp2p node not started yet" errors +// setTimeout(() => resolve(), 1000) +// }) +// db.add('hello!') +// } catch (e) { +// reject(e) +// } +// }) +// } +// // Try adding something again +// await doChanges() - const res1 = await db.iterator().collect().map(e => e.payload.value) - const res2 = await db2.iterator().collect().map(e => e.payload.value) - assert.deepStrictEqual(res1, ['hello!']) - assert.deepStrictEqual(res2, ['hello!']) - }) +// const res1 = await db.iterator().collect().map(e => e.payload.value) +// const res2 = await db2.iterator().collect().map(e => e.payload.value) +// assert.deepStrictEqual(res1, ['hello!']) +// assert.deepStrictEqual(res2, ['hello!']) +// }) - it('can\'t grant access if not admin', async () => { - await db2.access.grant('write', id2.id) - const canAppend = await db2.access.canAppend({ identity: id2 }, id2.provider) - assert.strictEqual(canAppend, false) - }) +// it('can\'t grant access if not admin', async () => { +// await db2.access.grant('write', id2.id) +// const canAppend = await db2.access.canAppend({ identity: id2 }, id2.provider) +// assert.strictEqual(canAppend, false) +// }) - it('can\'t revoke access if not admin', async () => { - await db2.access.revoke('write', id1.id) - const canAppend = await db2.access.canAppend({ identity: id1 }, id1.provider) - assert.strictEqual(canAppend, true) - }) +// it('can\'t revoke access if not admin', async () => { +// await db2.access.revoke('write', id1.id) +// const canAppend = await db2.access.canAppend({ identity: id1 }, id1.provider) +// assert.strictEqual(canAppend, true) +// }) - it('can check permissions without defaultAccount set', async () => { - db2.access.defaultAccount = null - const canAppend = await db2.access.canAppend({ identity: id1 }, id1.provider) - assert.strictEqual(canAppend, true) - }) +// it('can check permissions without defaultAccount set', async () => { +// db2.access.defaultAccount = null +// const canAppend = await db2.access.canAppend({ identity: id1 }, id1.provider) +// assert.strictEqual(canAppend, true) +// }) - it('can\'t change permissions without from address if no defaultAccount set', async () => { - let err - db2.access.defaultAccount = null - try { - await db2.access.grant('write', id2.id) - } catch (e) { - err = e.toString() - } - assert.strictEqual(err, 'Error: No "from" address specified in neither the given options, nor the default options.') - }) +// it('can\'t change permissions without from address if no defaultAccount set', async () => { +// let err +// db2.access.defaultAccount = null +// try { +// await db2.access.grant('write', id2.id) +// } catch (e) { +// err = e.toString() +// } +// assert.strictEqual(err, 'Error: No "from" address specified in neither the given options, nor the default options.') +// }) - it('can change permissions by passing in from address', async () => { - let err - db2.access.defaultAccount = null - try { - await db2.access.grant('write', id2.id, { from: accounts[i] }) // from address can grant/revoke access - } catch (e) { - err = e.toString() - } - assert.strictEqual(err, undefined) - const canAppend = await db2.access.canAppend({ identity: id2 }, id2.provider) - assert.strictEqual(canAppend, true) - }) +// it('can change permissions by passing in from address', async () => { +// let err +// db2.access.defaultAccount = null +// try { +// await db2.access.grant('write', id2.id, { from: accounts[i] }) // from address can grant/revoke access +// } catch (e) { +// err = e.toString() +// } +// assert.strictEqual(err, undefined) +// const canAppend = await db2.access.canAppend({ identity: id2 }, id2.provider) +// assert.strictEqual(canAppend, true) +// }) - it('revoking access disables ability to write to the database', async () => { - let err - try { - // Revoke user's access - await db.access.revoke('write', id2.id) - await db2.add('hello?') - } catch (e) { - err = e.toString() - } - assert.strictEqual(err, `Error: Could not append entry, key "${id2.id}" is not allowed to write to the log`) - }) - }) - }) - }) - }) -}) +// it('revoking access disables ability to write to the database', async () => { +// let err +// try { +// // Revoke user's access +// await db.access.revoke('write', id2.id) +// await db2.add('hello?') +// } catch (e) { +// err = e.toString() +// } +// assert.strictEqual(err, `Error: Could not append entry, key "${id2.id}" is not allowed to write to the log`) +// }) +// }) +// }) +// }) +// }) +// }) diff --git a/test/access-controllers/contract-access-controller.test.js b/test/access-controllers/contract-access-controller.test.js index 1d3cff2..c360124 100644 --- a/test/access-controllers/contract-access-controller.test.js +++ b/test/access-controllers/contract-access-controller.test.js @@ -1,183 +1,183 @@ -import assert from 'assert' -import rmrf from 'rimraf' -import OrbitDB from '../../src/OrbitDB.js' -import IdentityProvider from 'orbit-db-identity-provider' -import EthIdentityProvider from 'orbit-db-identity-provider/ethereum' -import Keystore from 'orbit-db-keystore' -import ContractAccessController from 'orbit-db-access-controllers/contract' -import DepositContractAccessController from 'orbit-db-access-controllers/deposit-contract' -import AccessControllers from 'orbit-db-access-controllers' -import Web3 from 'web3' -import ganache from 'ganache-cli' -import * as io from 'orbit-db-io' -import Access from './Access.json' assert { 'type': 'json' } -import PayDeposit from './PayDeposit.json' assert { 'type': 'json' } -// Include test utilities -import { - config, - startIpfs, - stopIpfs, - testAPIs -} from 'orbit-db-test-utils' +// import assert from 'assert' +// import rmrf from 'rimraf' +// import OrbitDB from '../../src/OrbitDB.js' +// import IdentityProvider from 'orbit-db-identity-provider' +// import EthIdentityProvider from 'orbit-db-identity-provider/ethereum' +// import Keystore from 'orbit-db-keystore' +// import ContractAccessController from 'orbit-db-access-controllers/contract' +// import DepositContractAccessController from 'orbit-db-access-controllers/deposit-contract' +// import AccessControllers from 'orbit-db-access-controllers' +// import Web3 from 'web3' +// import ganache from 'ganache-cli' +// import * as io from 'orbit-db-io' +// import Access from './Access.json' assert { 'type': 'json' } +// import PayDeposit from './PayDeposit.json' assert { 'type': 'json' } +// // Include test utilities +// import { +// config, +// startIpfs, +// stopIpfs, +// testAPIs +// } from 'orbit-db-test-utils' -const dbPath1 = './orbitdb/tests/contract-access-controller/1' -const dbPath2 = './orbitdb/tests/contract-access-controller/2' +// const dbPath1 = './orbitdb/tests/contract-access-controller/1' +// const dbPath2 = './orbitdb/tests/contract-access-controller/2' -const accessControllers = [ - { - AccessController: ContractAccessController, - contract: Access - }, - { - AccessController: DepositContractAccessController, - contract: PayDeposit - } -] +// const accessControllers = [ +// { +// AccessController: ContractAccessController, +// contract: Access +// }, +// { +// AccessController: DepositContractAccessController, +// contract: PayDeposit +// } +// ] -Object.keys(testAPIs).forEach(API => { - describe(`orbit-db - ContractAccessController (${API})`, function () { - this.timeout(config.timeout) +// Object.keys(testAPIs).forEach(API => { +// describe(`orbit-db - ContractAccessController (${API})`, function () { +// this.timeout(config.timeout) - let ipfsd1, ipfsd2, ipfs1, ipfs2, id1, id2 - let orbitdb1, orbitdb2 - let web3, accounts +// let ipfsd1, ipfsd2, ipfs1, ipfs2, id1, id2 +// let orbitdb1, orbitdb2 +// let web3, accounts - before(async () => { - rmrf.sync(dbPath1) - rmrf.sync(dbPath2) - ipfsd1 = await startIpfs(API, config.daemon1) - ipfsd2 = await startIpfs(API, config.daemon2) - ipfs1 = ipfsd1.api - ipfs2 = ipfsd2.api +// before(async () => { +// rmrf.sync(dbPath1) +// rmrf.sync(dbPath2) +// ipfsd1 = await startIpfs(API, config.daemon1) +// ipfsd2 = await startIpfs(API, config.daemon2) +// ipfs1 = ipfsd1.api +// ipfs2 = ipfsd2.api - const keystore1 = new Keystore(dbPath1 + '/keys') - const keystore2 = new Keystore(dbPath2 + '/keys') +// const keystore1 = new Keystore(dbPath1 + '/keys') +// const keystore2 = new Keystore(dbPath2 + '/keys') - IdentityProvider.addIdentityProvider(EthIdentityProvider) +// IdentityProvider.addIdentityProvider(EthIdentityProvider) - id1 = await IdentityProvider.createIdentity({ type: EthIdentityProvider.type, keystore: keystore1 }) - id2 = await IdentityProvider.createIdentity({ type: EthIdentityProvider.type, keystore: keystore2 }) +// id1 = await IdentityProvider.createIdentity({ type: EthIdentityProvider.type, keystore: keystore1 }) +// id2 = await IdentityProvider.createIdentity({ type: EthIdentityProvider.type, keystore: keystore2 }) - web3 = new Web3(ganache.provider()) - accounts = await web3.eth.getAccounts() +// web3 = new Web3(ganache.provider()) +// accounts = await web3.eth.getAccounts() - orbitdb1 = await OrbitDB.createInstance(ipfs1, { - AccessControllers: AccessControllers, - directory: dbPath1, - identity: id1 - }) +// orbitdb1 = await OrbitDB.createInstance(ipfs1, { +// AccessControllers: AccessControllers, +// directory: dbPath1, +// identity: id1 +// }) - orbitdb2 = await OrbitDB.createInstance(ipfs2, { - AccessControllers: AccessControllers, - directory: dbPath2, - identity: id2 - }) - }) +// orbitdb2 = await OrbitDB.createInstance(ipfs2, { +// AccessControllers: AccessControllers, +// directory: dbPath2, +// identity: id2 +// }) +// }) - after(async () => { - if (orbitdb1) { - await orbitdb1.stop() - } +// after(async () => { +// if (orbitdb1) { +// await orbitdb1.stop() +// } - if (orbitdb2) { - await orbitdb2.stop() - } +// if (orbitdb2) { +// await orbitdb2.stop() +// } - if (ipfsd1) { - await stopIpfs(ipfsd1) - } +// if (ipfsd1) { +// await stopIpfs(ipfsd1) +// } - if (ipfsd2) { - await stopIpfs(ipfsd2) - } - }) +// if (ipfsd2) { +// await stopIpfs(ipfsd2) +// } +// }) - describe('Constructor', function () { - accessControllers.forEach(async (ac, i) => { - let accessController, contract - before(async () => { - contract = await new web3.eth.Contract(ac.contract.abi) - .deploy({ data: ac.contract.bytecode }) - .send({ from: accounts[i], gas: '1000000' }) +// describe('Constructor', function () { +// accessControllers.forEach(async (ac, i) => { +// let accessController, contract +// before(async () => { +// contract = await new web3.eth.Contract(ac.contract.abi) +// .deploy({ data: ac.contract.bytecode }) +// .send({ from: accounts[i], gas: '1000000' }) - accessController = await ac.AccessController.create(orbitdb1, { - type: ac.AccessController.type, - web3: web3, - abi: ac.contract.abi, - contractAddress: contract._address, - defaultAccount: accounts[i] - }) - await accessController.load() - }) +// accessController = await ac.AccessController.create(orbitdb1, { +// type: ac.AccessController.type, +// web3: web3, +// abi: ac.contract.abi, +// contractAddress: contract._address, +// defaultAccount: accounts[i] +// }) +// await accessController.load() +// }) - it('creates an access controller', () => { - assert.notStrictEqual(accessController, null) - assert.notStrictEqual(accessController, undefined) - }) +// it('creates an access controller', () => { +// assert.notStrictEqual(accessController, null) +// assert.notStrictEqual(accessController, undefined) +// }) - it('sets the controller type', () => { - assert.strictEqual(accessController.type, ac.AccessController.type) - }) +// it('sets the controller type', () => { +// assert.strictEqual(accessController.type, ac.AccessController.type) +// }) - it('grants access to key', async () => { - const mockEntry = { - identity: id1 - // ... - // doesn't matter what we put here, only identity is used for the check - } - await accessController.grant('write', id1.id) - const canAppend = await accessController.canAppend(mockEntry, id1.provider) - assert.strictEqual(canAppend, true) - }) +// it('grants access to key', async () => { +// const mockEntry = { +// identity: id1 +// // ... +// // doesn't matter what we put here, only identity is used for the check +// } +// await accessController.grant('write', id1.id) +// const canAppend = await accessController.canAppend(mockEntry, id1.provider) +// assert.strictEqual(canAppend, true) +// }) - it('grants access to multiple keys', async () => { - const canAppend1 = await accessController.canAppend({ identity: orbitdb1.identity }, orbitdb1.identity.provider) - const canAppend2 = await accessController.canAppend({ identity: orbitdb2.identity }, orbitdb2.identity.provider) +// it('grants access to multiple keys', async () => { +// const canAppend1 = await accessController.canAppend({ identity: orbitdb1.identity }, orbitdb1.identity.provider) +// const canAppend2 = await accessController.canAppend({ identity: orbitdb2.identity }, orbitdb2.identity.provider) - await accessController.grant('write', orbitdb2.identity.id) - const canAppend3 = await accessController.canAppend({ identity: orbitdb2.identity }, orbitdb2.identity.provider) +// await accessController.grant('write', orbitdb2.identity.id) +// const canAppend3 = await accessController.canAppend({ identity: orbitdb2.identity }, orbitdb2.identity.provider) - assert.strictEqual(canAppend1, true) - assert.strictEqual(canAppend2, false) - assert.strictEqual(canAppend3, true) - }) +// assert.strictEqual(canAppend1, true) +// assert.strictEqual(canAppend2, false) +// assert.strictEqual(canAppend3, true) +// }) - describe('save and load', function () { - let accessController, manifest +// describe('save and load', function () { +// let accessController, manifest - before(async () => { - accessController = await ac.AccessController.create(orbitdb1, { - type: ac.AccessController.type, - web3: web3, - abi: ac.contract.abi, - contractAddress: contract._address, - defaultAccount: accounts[i] - }) - manifest = await accessController.save() - const access = await io.read(ipfs1, manifest.address) +// before(async () => { +// accessController = await ac.AccessController.create(orbitdb1, { +// type: ac.AccessController.type, +// web3: web3, +// abi: ac.contract.abi, +// contractAddress: contract._address, +// defaultAccount: accounts[i] +// }) +// manifest = await accessController.save() +// const access = await io.read(ipfs1, manifest.address) - accessController = await ac.AccessController.create(orbitdb1, { - type: ac.AccessController.type, - web3: web3, - abi: JSON.parse(access.abi), - contractAddress: access.contractAddress, - defaultAccount: accounts[i] - }) +// accessController = await ac.AccessController.create(orbitdb1, { +// type: ac.AccessController.type, +// web3: web3, +// abi: JSON.parse(access.abi), +// contractAddress: access.contractAddress, +// defaultAccount: accounts[i] +// }) - await accessController.load(manifest.address) - }) +// await accessController.load(manifest.address) +// }) - it('has correct capabalities', async () => { - const canAppend1 = await accessController.canAppend({ identity: orbitdb1.identity }, orbitdb1.identity.provider) - const canAppend2 = await accessController.canAppend({ identity: orbitdb2.identity }, orbitdb2.identity.provider) - const canAppend3 = await accessController.canAppend({ identity: { id: 'someotherid' } }, orbitdb1.identity.provider) +// it('has correct capabalities', async () => { +// const canAppend1 = await accessController.canAppend({ identity: orbitdb1.identity }, orbitdb1.identity.provider) +// const canAppend2 = await accessController.canAppend({ identity: orbitdb2.identity }, orbitdb2.identity.provider) +// const canAppend3 = await accessController.canAppend({ identity: { id: 'someotherid' } }, orbitdb1.identity.provider) - assert.strictEqual(canAppend1, true) - assert.strictEqual(canAppend2, true) - assert.strictEqual(canAppend3, false) - }) - }) - }) - }) - }) -}) +// assert.strictEqual(canAppend1, true) +// assert.strictEqual(canAppend2, true) +// assert.strictEqual(canAppend3, false) +// }) +// }) +// }) +// }) +// }) +// }) diff --git a/test/access-controllers/ipfs-access-controller-integration.test.js b/test/access-controllers/ipfs-access-controller-integration.test.js index 5bf4412..96d324c 100644 --- a/test/access-controllers/ipfs-access-controller-integration.test.js +++ b/test/access-controllers/ipfs-access-controller-integration.test.js @@ -1,159 +1,159 @@ -import assert from 'assert' -import rmrf from 'rimraf' -import OrbitDB from '../../src/OrbitDB.js' -import IdentityProvider from 'orbit-db-identity-provider' -import Keystore from 'orbit-db-keystore' -import AccessControllers from 'orbit-db-access-controllers' -import * as io from 'orbit-db-io' -// Include test utilities -import { - config, - startIpfs, - stopIpfs, - testAPIs, - connectPeers -} from 'orbit-db-test-utils' +// import assert from 'assert' +// import rmrf from 'rimraf' +// import OrbitDB from '../../src/OrbitDB.js' +// import IdentityProvider from 'orbit-db-identity-provider' +// import Keystore from 'orbit-db-keystore' +// import AccessControllers from 'orbit-db-access-controllers' +// import * as io from 'orbit-db-io' +// // Include test utilities +// import { +// config, +// startIpfs, +// stopIpfs, +// testAPIs, +// connectPeers +// } from 'orbit-db-test-utils' -const dbPath1 = './orbitdb/tests/orbitdb-access-controller-integration/1' -const dbPath2 = './orbitdb/tests/orbitdb-access-controller-integration/2' +// const dbPath1 = './orbitdb/tests/orbitdb-access-controller-integration/1' +// const dbPath2 = './orbitdb/tests/orbitdb-access-controller-integration/2' -Object.keys(testAPIs).forEach(API => { - describe(`orbit-db - IPFSAccessController Integration (${API})`, function () { - this.timeout(config.timeout) +// Object.keys(testAPIs).forEach(API => { +// describe(`orbit-db - IPFSAccessController Integration (${API})`, function () { +// this.timeout(config.timeout) - let ipfsd1, ipfsd2, ipfs1, ipfs2, id1, id2 - let orbitdb1, orbitdb2 +// let ipfsd1, ipfsd2, ipfs1, ipfs2, id1, id2 +// let orbitdb1, orbitdb2 - before(async () => { - rmrf.sync(dbPath1) - rmrf.sync(dbPath2) - ipfsd1 = await startIpfs(API, config.daemon1) - ipfsd2 = await startIpfs(API, config.daemon2) - ipfs1 = ipfsd1.api - ipfs2 = ipfsd2.api +// before(async () => { +// rmrf.sync(dbPath1) +// rmrf.sync(dbPath2) +// ipfsd1 = await startIpfs(API, config.daemon1) +// ipfsd2 = await startIpfs(API, config.daemon2) +// ipfs1 = ipfsd1.api +// ipfs2 = ipfsd2.api - // Connect the peers manually to speed up test times - const isLocalhostAddress = (addr) => addr.toString().includes('127.0.0.1') - await connectPeers(ipfs1, ipfs2, { filter: isLocalhostAddress }) +// // Connect the peers manually to speed up test times +// const isLocalhostAddress = (addr) => addr.toString().includes('127.0.0.1') +// await connectPeers(ipfs1, ipfs2, { filter: isLocalhostAddress }) - const keystore1 = new Keystore(dbPath1 + '/keys') - const keystore2 = new Keystore(dbPath2 + '/keys') +// const keystore1 = new Keystore(dbPath1 + '/keys') +// const keystore2 = new Keystore(dbPath2 + '/keys') - id1 = await IdentityProvider.createIdentity({ id: 'A', keystore: keystore1 }) - id2 = await IdentityProvider.createIdentity({ id: 'B', keystore: keystore2 }) +// id1 = await IdentityProvider.createIdentity({ id: 'A', keystore: keystore1 }) +// id2 = await IdentityProvider.createIdentity({ id: 'B', keystore: keystore2 }) - orbitdb1 = await OrbitDB.createInstance(ipfs1, { - AccessControllers, - directory: dbPath1, - identity: id1 - }) +// orbitdb1 = await OrbitDB.createInstance(ipfs1, { +// AccessControllers, +// directory: dbPath1, +// identity: id1 +// }) - orbitdb2 = await OrbitDB.createInstance(ipfs2, { - AccessControllers, - directory: dbPath2, - identity: id2 - }) - }) +// orbitdb2 = await OrbitDB.createInstance(ipfs2, { +// AccessControllers, +// directory: dbPath2, +// identity: id2 +// }) +// }) - after(async () => { - if (orbitdb1) { await orbitdb1.stop() } +// after(async () => { +// if (orbitdb1) { await orbitdb1.stop() } - if (orbitdb2) { await orbitdb2.stop() } +// if (orbitdb2) { await orbitdb2.stop() } - if (ipfsd1) { await stopIpfs(ipfsd1) } +// if (ipfsd1) { await stopIpfs(ipfsd1) } - if (ipfsd2) { await stopIpfs(ipfsd2) } - }) +// if (ipfsd2) { await stopIpfs(ipfsd2) } +// }) - describe('OrbitDB Integration', function () { - let db, db2 - let dbManifest, acManifest +// describe('OrbitDB Integration', function () { +// let db, db2 +// let dbManifest, acManifest - before(async () => { - db = await orbitdb1.feed('AABB', { - identity: id1, - accessController: { - type: 'ipfs', - write: [id1.id] - } - }) +// before(async () => { +// db = await orbitdb1.feed('AABB', { +// identity: id1, +// accessController: { +// type: 'ipfs', +// write: [id1.id] +// } +// }) - db2 = await orbitdb2.feed(db.address, { - identity: id2 - }) - await db2.load() +// db2 = await orbitdb2.feed(db.address, { +// identity: id2 +// }) +// await db2.load() - dbManifest = await io.read(ipfs1, db.address.root) - const hash = dbManifest.accessController.split('/').pop() - acManifest = await io.read(ipfs1, hash) - }) +// dbManifest = await io.read(ipfs1, db.address.root) +// const hash = dbManifest.accessController.split('/').pop() +// acManifest = await io.read(ipfs1, hash) +// }) - it('has the correct access rights after creating the database', async () => { - assert.deepStrictEqual(db.access.write, [id1.id]) - }) +// it('has the correct access rights after creating the database', async () => { +// assert.deepStrictEqual(db.access.write, [id1.id]) +// }) - it('makes database use the correct access controller', async () => { - const { address } = await db.access.save() - assert.strictEqual(acManifest.params.address, address) - }) +// it('makes database use the correct access controller', async () => { +// const { address } = await db.access.save() +// assert.strictEqual(acManifest.params.address, address) +// }) - it('saves database manifest file locally', async () => { - assert.notStrictEqual(dbManifest, null) - }) +// it('saves database manifest file locally', async () => { +// assert.notStrictEqual(dbManifest, null) +// }) - it('saves access controller manifest file locally', async () => { - assert.notStrictEqual(acManifest, null) - }) +// it('saves access controller manifest file locally', async () => { +// assert.notStrictEqual(acManifest, null) +// }) - it('has correct type', async () => { - assert.strictEqual(acManifest.type, 'ipfs') - }) +// it('has correct type', async () => { +// assert.strictEqual(acManifest.type, 'ipfs') +// }) - describe('database manifest', () => { - it('has correct name', async () => { - assert.strictEqual(dbManifest.name, 'AABB') - }) +// describe('database manifest', () => { +// it('has correct name', async () => { +// assert.strictEqual(dbManifest.name, 'AABB') +// }) - it('has correct type', async () => { - assert.strictEqual(dbManifest.type, 'feed') - }) +// it('has correct type', async () => { +// assert.strictEqual(dbManifest.type, 'feed') +// }) - it('has correct address', async () => { - assert.notStrictEqual(dbManifest.accessController, null) - assert.strictEqual(dbManifest.accessController.indexOf('/ipfs'), 0) - }) - }) +// it('has correct address', async () => { +// assert.notStrictEqual(dbManifest.accessController, null) +// assert.strictEqual(dbManifest.accessController.indexOf('/ipfs'), 0) +// }) +// }) - describe('access controls', () => { - it('allows to write if user has write access', async () => { - let err - try { - await db.add('hello?') - } catch (e) { - err = e.toString() - } +// describe('access controls', () => { +// it('allows to write if user has write access', async () => { +// let err +// try { +// await db.add('hello?') +// } catch (e) { +// err = e.toString() +// } - const res = await db.iterator().collect().map(e => e.payload.value) - assert.strictEqual(err, undefined) - assert.deepStrictEqual(res, ['hello?']) - }) +// const res = await db.iterator().collect().map(e => e.payload.value) +// assert.strictEqual(err, undefined) +// assert.deepStrictEqual(res, ['hello?']) +// }) - it('doesn\'t allow to write without write access', async () => { - let err - try { - await db2.add('hello!!') - assert.strictEqual('Should not end here', false) - } catch (e) { - err = e - } +// it('doesn\'t allow to write without write access', async () => { +// let err +// try { +// await db2.add('hello!!') +// assert.strictEqual('Should not end here', false) +// } catch (e) { +// err = e +// } - const res = await db2.iterator().collect().map(e => e.payload.value) - assert.strictEqual(err.message, `Could not append entry, key "${db2.identity.id}" is not allowed to write to the log`) - assert.deepStrictEqual(res.includes(e => e === 'hello!!'), false) - }) - }) - }) - }) - // TODO: use two separate peers for testing the AC - // TODO: add tests for revocation correctness with a database (integration tests) -}) +// const res = await db2.iterator().collect().map(e => e.payload.value) +// assert.strictEqual(err.message, `Could not append entry, key "${db2.identity.id}" is not allowed to write to the log`) +// assert.deepStrictEqual(res.includes(e => e === 'hello!!'), false) +// }) +// }) +// }) +// }) +// // TODO: use two separate peers for testing the AC +// // TODO: add tests for revocation correctness with a database (integration tests) +// }) diff --git a/test/access-controllers/ipfs-access-controller.test.js b/test/access-controllers/ipfs-access-controller.test.js index 69bc808..3a6b947 100644 --- a/test/access-controllers/ipfs-access-controller.test.js +++ b/test/access-controllers/ipfs-access-controller.test.js @@ -1,128 +1,128 @@ -import assert from 'assert' -import rmrf from 'rimraf' -import OrbitDB from '../../src/OrbitDB.js' -import IdentityProvider from 'orbit-db-identity-provider' -import Keystore from 'orbit-db-keystore' -import IPFSAccessController from 'orbit-db-access-controllers/ipfs' -import AccessControllers from 'orbit-db-access-controllers' +// import assert from 'assert' +// import rmrf from 'rimraf' +// import OrbitDB from '../../src/OrbitDB.js' +// import IdentityProvider from 'orbit-db-identity-provider' +// import Keystore from 'orbit-db-keystore' +// import IPFSAccessController from 'orbit-db-access-controllers/ipfs' +// import AccessControllers from 'orbit-db-access-controllers' -// Include test utilities -import { - config, - startIpfs, - stopIpfs, - testAPIs -} from 'orbit-db-test-utils' +// // Include test utilities +// import { +// config, +// startIpfs, +// stopIpfs, +// testAPIs +// } from 'orbit-db-test-utils' -const dbPath1 = './orbitdb/tests/ipfs-access-controller/1' -const dbPath2 = './orbitdb/tests/ipfs-access-controller/2' +// const dbPath1 = './orbitdb/tests/ipfs-access-controller/1' +// const dbPath2 = './orbitdb/tests/ipfs-access-controller/2' -Object.keys(testAPIs).forEach(API => { - describe(`orbit-db - IPFSAccessController (${API})`, function () { - this.timeout(config.timeout) +// Object.keys(testAPIs).forEach(API => { +// describe(`orbit-db - IPFSAccessController (${API})`, function () { +// this.timeout(config.timeout) - let ipfsd1, ipfsd2, ipfs1, ipfs2, id1, id2 - let orbitdb1, orbitdb2 +// let ipfsd1, ipfsd2, ipfs1, ipfs2, id1, id2 +// let orbitdb1, orbitdb2 - before(async () => { - rmrf.sync(dbPath1) - rmrf.sync(dbPath2) - ipfsd1 = await startIpfs(API, config.daemon1) - ipfsd2 = await startIpfs(API, config.daemon2) - ipfs1 = ipfsd1.api - ipfs2 = ipfsd2.api +// before(async () => { +// rmrf.sync(dbPath1) +// rmrf.sync(dbPath2) +// ipfsd1 = await startIpfs(API, config.daemon1) +// ipfsd2 = await startIpfs(API, config.daemon2) +// ipfs1 = ipfsd1.api +// ipfs2 = ipfsd2.api - const keystore1 = new Keystore(dbPath1 + '/keys') - const keystore2 = new Keystore(dbPath2 + '/keys') +// const keystore1 = new Keystore(dbPath1 + '/keys') +// const keystore2 = new Keystore(dbPath2 + '/keys') - id1 = await IdentityProvider.createIdentity({ id: 'A', keystore: keystore1 }) - id2 = await IdentityProvider.createIdentity({ id: 'B', keystore: keystore2 }) +// id1 = await IdentityProvider.createIdentity({ id: 'A', keystore: keystore1 }) +// id2 = await IdentityProvider.createIdentity({ id: 'B', keystore: keystore2 }) - orbitdb1 = await OrbitDB.createInstance(ipfs1, { - AccessControllers, - directory: dbPath1, - identity: id1 - }) +// orbitdb1 = await OrbitDB.createInstance(ipfs1, { +// AccessControllers, +// directory: dbPath1, +// identity: id1 +// }) - orbitdb2 = await OrbitDB.createInstance(ipfs2, { - AccessControllers, - directory: dbPath2, - identity: id2 - }) - }) +// orbitdb2 = await OrbitDB.createInstance(ipfs2, { +// AccessControllers, +// directory: dbPath2, +// identity: id2 +// }) +// }) - after(async () => { - if (orbitdb1) { - await orbitdb1.stop() - } +// after(async () => { +// if (orbitdb1) { +// await orbitdb1.stop() +// } - if (orbitdb2) { - await orbitdb2.stop() - } +// if (orbitdb2) { +// await orbitdb2.stop() +// } - if (ipfsd1) { - await stopIpfs(ipfsd1) - } +// if (ipfsd1) { +// await stopIpfs(ipfsd1) +// } - if (ipfsd2) { - await stopIpfs(ipfsd2) - } - }) +// if (ipfsd2) { +// await stopIpfs(ipfsd2) +// } +// }) - describe('Constructor', function () { - let accessController +// describe('Constructor', function () { +// let accessController - before(async () => { - accessController = await IPFSAccessController.create(orbitdb1, { - write: [id1.id] - }) - }) +// before(async () => { +// accessController = await IPFSAccessController.create(orbitdb1, { +// write: [id1.id] +// }) +// }) - it('creates an access controller', () => { - assert.notStrictEqual(accessController, null) - assert.notStrictEqual(accessController, undefined) - }) +// it('creates an access controller', () => { +// assert.notStrictEqual(accessController, null) +// assert.notStrictEqual(accessController, undefined) +// }) - it('sets the controller type', () => { - assert.strictEqual(accessController.type, 'ipfs') - }) +// it('sets the controller type', () => { +// assert.strictEqual(accessController.type, 'ipfs') +// }) - it('has IPFS instance', async () => { - const peerId1 = await accessController._ipfs.id() - const peerId2 = await ipfs1.id() - assert.strictEqual(String(peerId1.id), String(peerId2.id)) - }) +// it('has IPFS instance', async () => { +// const peerId1 = await accessController._ipfs.id() +// const peerId2 = await ipfs1.id() +// assert.strictEqual(String(peerId1.id), String(peerId2.id)) +// }) - it('sets default capabilities', async () => { - assert.deepStrictEqual(accessController.write, [id1.id]) - }) +// it('sets default capabilities', async () => { +// assert.deepStrictEqual(accessController.write, [id1.id]) +// }) - it('allows owner to append after creation', async () => { - const mockEntry = { - identity: id1, - v: 1 - // ... - // doesn't matter what we put here, only identity is used for the check - } - const canAppend = await accessController.canAppend(mockEntry, id1.provider) - assert.strictEqual(canAppend, true) - }) - }) +// it('allows owner to append after creation', async () => { +// const mockEntry = { +// identity: id1, +// v: 1 +// // ... +// // doesn't matter what we put here, only identity is used for the check +// } +// const canAppend = await accessController.canAppend(mockEntry, id1.provider) +// assert.strictEqual(canAppend, true) +// }) +// }) - describe('save and load', function () { - let accessController, manifest +// describe('save and load', function () { +// let accessController, manifest - before(async () => { - accessController = await IPFSAccessController.create(orbitdb1, { - write: ['A', 'B', id1.id] - }) - manifest = await accessController.save() - await accessController.load(manifest.address) - }) +// before(async () => { +// accessController = await IPFSAccessController.create(orbitdb1, { +// write: ['A', 'B', id1.id] +// }) +// manifest = await accessController.save() +// await accessController.load(manifest.address) +// }) - it('has correct capabalities', async () => { - assert.deepStrictEqual(accessController.write, ['A', 'B', id1.id]) - }) - }) - }) -}) +// it('has correct capabalities', async () => { +// assert.deepStrictEqual(accessController.write, ['A', 'B', id1.id]) +// }) +// }) +// }) +// }) diff --git a/test/access-controllers/orbit-db-access-controller-integration.test.js b/test/access-controllers/orbit-db-access-controller-integration.test.js index c28fb05..6737e3c 100644 --- a/test/access-controllers/orbit-db-access-controller-integration.test.js +++ b/test/access-controllers/orbit-db-access-controller-integration.test.js @@ -1,231 +1,231 @@ -import assert from 'assert' -import rmrf from 'rimraf' -import OrbitDB from '../../src/OrbitDB.js' -import IdentityProvider from 'orbit-db-identity-provider' -import Keystore from 'orbit-db-keystore' -import AccessControllers from 'orbit-db-access-controllers' -import * as io from 'orbit-db-io' -// Include test utilities -import { - config, - startIpfs, - stopIpfs, - testAPIs, - connectPeers -} from 'orbit-db-test-utils' +// import assert from 'assert' +// import rmrf from 'rimraf' +// import OrbitDB from '../../src/OrbitDB.js' +// import IdentityProvider from 'orbit-db-identity-provider' +// import Keystore from 'orbit-db-keystore' +// import AccessControllers from 'orbit-db-access-controllers' +// import * as io from 'orbit-db-io' +// // Include test utilities +// import { +// config, +// startIpfs, +// stopIpfs, +// testAPIs, +// connectPeers +// } from 'orbit-db-test-utils' -const dbPath1 = './orbitdb/tests/orbitdb-access-controller-integration/1' -const dbPath2 = './orbitdb/tests/orbitdb-access-controller-integration/2' +// const dbPath1 = './orbitdb/tests/orbitdb-access-controller-integration/1' +// const dbPath2 = './orbitdb/tests/orbitdb-access-controller-integration/2' -Object.keys(testAPIs).forEach(API => { - describe(`orbit-db - OrbitDBAccessController Integration (${API})`, function () { - this.timeout(config.timeout) +// Object.keys(testAPIs).forEach(API => { +// describe(`orbit-db - OrbitDBAccessController Integration (${API})`, function () { +// this.timeout(config.timeout) - let ipfsd1, ipfsd2, ipfs1, ipfs2, id1, id2 - let orbitdb1, orbitdb2 +// let ipfsd1, ipfsd2, ipfs1, ipfs2, id1, id2 +// let orbitdb1, orbitdb2 - before(async () => { - rmrf.sync(dbPath1) - rmrf.sync(dbPath2) - ipfsd1 = await startIpfs(API, config.daemon1) - ipfsd2 = await startIpfs(API, config.daemon2) - ipfs1 = ipfsd1.api - ipfs2 = ipfsd2.api +// before(async () => { +// rmrf.sync(dbPath1) +// rmrf.sync(dbPath2) +// ipfsd1 = await startIpfs(API, config.daemon1) +// ipfsd2 = await startIpfs(API, config.daemon2) +// ipfs1 = ipfsd1.api +// ipfs2 = ipfsd2.api - // Connect the peers manually to speed up test times - const isLocalhostAddress = (addr) => addr.toString().includes('127.0.0.1') - await connectPeers(ipfs1, ipfs2, { filter: isLocalhostAddress }) +// // Connect the peers manually to speed up test times +// const isLocalhostAddress = (addr) => addr.toString().includes('127.0.0.1') +// await connectPeers(ipfs1, ipfs2, { filter: isLocalhostAddress }) - const keystore1 = new Keystore(dbPath1 + '/keys') - const keystore2 = new Keystore(dbPath2 + '/keys') +// const keystore1 = new Keystore(dbPath1 + '/keys') +// const keystore2 = new Keystore(dbPath2 + '/keys') - id1 = await IdentityProvider.createIdentity({ id: 'A', keystore: keystore1 }) - id2 = await IdentityProvider.createIdentity({ id: 'B', keystore: keystore2 }) +// id1 = await IdentityProvider.createIdentity({ id: 'A', keystore: keystore1 }) +// id2 = await IdentityProvider.createIdentity({ id: 'B', keystore: keystore2 }) - orbitdb1 = await OrbitDB.createInstance(ipfs1, { - AccessControllers, - directory: dbPath1, - identity: id1 - }) +// orbitdb1 = await OrbitDB.createInstance(ipfs1, { +// AccessControllers, +// directory: dbPath1, +// identity: id1 +// }) - orbitdb2 = await OrbitDB.createInstance(ipfs2, { - AccessControllers, - directory: dbPath2, - identity: id2 - }) - }) +// orbitdb2 = await OrbitDB.createInstance(ipfs2, { +// AccessControllers, +// directory: dbPath2, +// identity: id2 +// }) +// }) - after(async () => { - if (orbitdb1) { - await orbitdb1.stop() - } +// after(async () => { +// if (orbitdb1) { +// await orbitdb1.stop() +// } - if (orbitdb2) { - await orbitdb2.stop() - } +// if (orbitdb2) { +// await orbitdb2.stop() +// } - if (ipfsd1) { - await stopIpfs(ipfsd1) - } +// if (ipfsd1) { +// await stopIpfs(ipfsd1) +// } - if (ipfsd2) { - await stopIpfs(ipfsd2) - } - }) +// if (ipfsd2) { +// await stopIpfs(ipfsd2) +// } +// }) - describe('OrbitDB Integration', function () { - let db, db2 - let dbManifest, acManifest +// describe('OrbitDB Integration', function () { +// let db, db2 +// let dbManifest, acManifest - before(async () => { - db = await orbitdb1.feed('AABB', { - identity: id1, - accessController: { - type: 'orbitdb', - write: [id1.id] - } - }) +// before(async () => { +// db = await orbitdb1.feed('AABB', { +// identity: id1, +// accessController: { +// type: 'orbitdb', +// write: [id1.id] +// } +// }) - db2 = await orbitdb2.feed(db.address, { identity: id2 }) - await db2.load() +// db2 = await orbitdb2.feed(db.address, { identity: id2 }) +// await db2.load() - dbManifest = await io.read(ipfs1, db.address.root) - const hash = dbManifest.accessController.split('/').pop() - acManifest = await io.read(ipfs1, hash) - }) +// dbManifest = await io.read(ipfs1, db.address.root) +// const hash = dbManifest.accessController.split('/').pop() +// acManifest = await io.read(ipfs1, hash) +// }) - it('has the correct access rights after creating the database', async () => { - assert.deepStrictEqual(db.access.capabilities, { - admin: new Set([id1.id]), - write: new Set([id1.id]) - }) - }) +// it('has the correct access rights after creating the database', async () => { +// assert.deepStrictEqual(db.access.capabilities, { +// admin: new Set([id1.id]), +// write: new Set([id1.id]) +// }) +// }) - it('makes database use the correct access controller', async () => { - assert.strictEqual(acManifest.params.address, db.access._db.address.toString()) - }) +// it('makes database use the correct access controller', async () => { +// assert.strictEqual(acManifest.params.address, db.access._db.address.toString()) +// }) - it('saves database manifest file locally', async () => { - assert.notStrictEqual(dbManifest, null) - }) +// it('saves database manifest file locally', async () => { +// assert.notStrictEqual(dbManifest, null) +// }) - it('saves access controller manifest file locally', async () => { - assert.notStrictEqual(acManifest, null) - }) +// it('saves access controller manifest file locally', async () => { +// assert.notStrictEqual(acManifest, null) +// }) - describe('database manifest', () => { - it('has correct name', async () => { - assert.strictEqual(dbManifest.name, 'AABB') - }) +// describe('database manifest', () => { +// it('has correct name', async () => { +// assert.strictEqual(dbManifest.name, 'AABB') +// }) - it('has correct type', async () => { - assert.strictEqual(dbManifest.type, 'feed') - }) +// it('has correct type', async () => { +// assert.strictEqual(dbManifest.type, 'feed') +// }) - it('has correct address', async () => { - assert.notStrictEqual(dbManifest.accessController, null) - assert.strictEqual(dbManifest.accessController.indexOf('/ipfs'), 0) - }) - }) +// it('has correct address', async () => { +// assert.notStrictEqual(dbManifest.accessController, null) +// assert.strictEqual(dbManifest.accessController.indexOf('/ipfs'), 0) +// }) +// }) - describe('access controller manifest', () => { - it('has correct type', async () => { - assert.strictEqual(acManifest.type, 'orbitdb') - }) +// describe('access controller manifest', () => { +// it('has correct type', async () => { +// assert.strictEqual(acManifest.type, 'orbitdb') +// }) - it('has correct address', async () => { - assert.strictEqual(acManifest.params.address.indexOf('/orbitdb'), 0) - assert.strictEqual(acManifest.params.address.split('/').pop(), '_access') - }) - }) +// it('has correct address', async () => { +// assert.strictEqual(acManifest.params.address.indexOf('/orbitdb'), 0) +// assert.strictEqual(acManifest.params.address.split('/').pop(), '_access') +// }) +// }) - describe('access controls', () => { - it('granting access enables to write to the database', async () => { - let err - try { - await db2.add('hello?') - assert.strictEqual('Should not end here', false) - } catch (e) { - err = e.toString() - } +// describe('access controls', () => { +// it('granting access enables to write to the database', async () => { +// let err +// try { +// await db2.add('hello?') +// assert.strictEqual('Should not end here', false) +// } catch (e) { +// err = e.toString() +// } - assert.strictEqual(err, `Error: Could not append entry, key "${db2.identity.id}" is not allowed to write to the log`) +// assert.strictEqual(err, `Error: Could not append entry, key "${db2.identity.id}" is not allowed to write to the log`) - const doChanges = () => { - return new Promise((resolve, reject) => { - try { - // Wait for the second user's AC to notify it was updated - db2.access.once('updated', async () => { - // Wait for the first user's db to replicate the update - db.events.once('replicated', () => { - // FIXME: timeout to get rid of the "libp2p node not started yet" errors - setTimeout(() => resolve(), 1000) - }) - // Try adding something again - await db2.add('hello!') - }) - // Give access to the second user - db.access.grant('write', id2.id) - } catch (e) { - reject(e) - } - }) - } - await doChanges() - const res1 = await db.iterator().collect().map(e => e.payload.value) - const res2 = await db2.iterator().collect().map(e => e.payload.value) - assert.deepStrictEqual(res1, ['hello!']) - assert.deepStrictEqual(res2, ['hello!']) - }) +// const doChanges = () => { +// return new Promise((resolve, reject) => { +// try { +// // Wait for the second user's AC to notify it was updated +// db2.access.once('updated', async () => { +// // Wait for the first user's db to replicate the update +// db.events.once('replicated', () => { +// // FIXME: timeout to get rid of the "libp2p node not started yet" errors +// setTimeout(() => resolve(), 1000) +// }) +// // Try adding something again +// await db2.add('hello!') +// }) +// // Give access to the second user +// db.access.grant('write', id2.id) +// } catch (e) { +// reject(e) +// } +// }) +// } +// await doChanges() +// const res1 = await db.iterator().collect().map(e => e.payload.value) +// const res2 = await db2.iterator().collect().map(e => e.payload.value) +// assert.deepStrictEqual(res1, ['hello!']) +// assert.deepStrictEqual(res2, ['hello!']) +// }) - it('can\'t grant access if doesn\'t have write access', async () => { - let err - try { - await db2.access.grant('write', id2.id) - } catch (e) { - err = e.toString() - } - assert.strictEqual(err, `Error: Could not append entry, key "${db2.identity.id}" is not allowed to write to the log`) - }) +// it('can\'t grant access if doesn\'t have write access', async () => { +// let err +// try { +// await db2.access.grant('write', id2.id) +// } catch (e) { +// err = e.toString() +// } +// assert.strictEqual(err, `Error: Could not append entry, key "${db2.identity.id}" is not allowed to write to the log`) +// }) - it('can\'t revoke access if doesn\'t have write access', async () => { - let err - try { - await db2.access.revoke('write', id1.id) - } catch (e) { - err = e.toString() - } - assert.strictEqual(err, `Error: Could not append entry, key "${db2.identity.id}" is not allowed to write to the log`) - }) +// it('can\'t revoke access if doesn\'t have write access', async () => { +// let err +// try { +// await db2.access.revoke('write', id1.id) +// } catch (e) { +// err = e.toString() +// } +// assert.strictEqual(err, `Error: Could not append entry, key "${db2.identity.id}" is not allowed to write to the log`) +// }) - it('revoking access disables ability to write to the database', async () => { - const getError = () => { - return new Promise((resolve, reject) => { - try { - // Wait for the second user's AC to notify it was updated - db2.access.once('updated', async () => { - let err - try { - // Try adding something again - await db2.add('hello?') - } catch (e) { - err = e.toString() - } - resolve(err) - }) - // Revoke user's access - db.access.revoke('write', id2.id) - } catch (e) { - reject(e) - } - }) - } - const err = await getError() - assert.strictEqual(err, `Error: Could not append entry, key "${db2.identity.id}" is not allowed to write to the log`) - }) - }) - }) - }) - // TODO: use two separate peers for testing the AC - // TODO: add tests for revocation correctness with a database (integration tests) -}) +// it('revoking access disables ability to write to the database', async () => { +// const getError = () => { +// return new Promise((resolve, reject) => { +// try { +// // Wait for the second user's AC to notify it was updated +// db2.access.once('updated', async () => { +// let err +// try { +// // Try adding something again +// await db2.add('hello?') +// } catch (e) { +// err = e.toString() +// } +// resolve(err) +// }) +// // Revoke user's access +// db.access.revoke('write', id2.id) +// } catch (e) { +// reject(e) +// } +// }) +// } +// const err = await getError() +// assert.strictEqual(err, `Error: Could not append entry, key "${db2.identity.id}" is not allowed to write to the log`) +// }) +// }) +// }) +// }) +// // TODO: use two separate peers for testing the AC +// // TODO: add tests for revocation correctness with a database (integration tests) +// }) diff --git a/test/access-controllers/orbit-db-access-controller.test.js b/test/access-controllers/orbit-db-access-controller.test.js index 4a142b0..a98d72b 100644 --- a/test/access-controllers/orbit-db-access-controller.test.js +++ b/test/access-controllers/orbit-db-access-controller.test.js @@ -1,336 +1,336 @@ -import assert from 'assert' -import rmrf from 'rimraf' -import OrbitDB from '../../src/OrbitDB.js' -import IdentityProvider from 'orbit-db-identity-provider' -import Keystore from 'orbit-db-keystore' -import OrbitDBAccessController from 'orbit-db-access-controllers/orbitdb' -import AccessControllers from 'orbit-db-access-controllers' +// import assert from 'assert' +// import rmrf from 'rimraf' +// import OrbitDB from '../../src/OrbitDB.js' +// import IdentityProvider from 'orbit-db-identity-provider' +// import Keystore from 'orbit-db-keystore' +// import OrbitDBAccessController from 'orbit-db-access-controllers/orbitdb' +// import AccessControllers from 'orbit-db-access-controllers' -// Include test utilities -import { - config, - startIpfs, - stopIpfs, - testAPIs -} from 'orbit-db-test-utils' +// // Include test utilities +// import { +// config, +// startIpfs, +// stopIpfs, +// testAPIs +// } from 'orbit-db-test-utils' -const dbPath1 = './orbitdb/tests/orbitdb-access-controller/1' -const dbPath2 = './orbitdb/tests/orbitdb-access-controller/2' +// const dbPath1 = './orbitdb/tests/orbitdb-access-controller/1' +// const dbPath2 = './orbitdb/tests/orbitdb-access-controller/2' -Object.keys(testAPIs).forEach(API => { - describe(`orbit-db - OrbitDBAccessController (${API})`, function () { - this.timeout(config.timeout) +// Object.keys(testAPIs).forEach(API => { +// describe(`orbit-db - OrbitDBAccessController (${API})`, function () { +// this.timeout(config.timeout) - let ipfsd1, ipfsd2, ipfs1, ipfs2, id1, id2 - let orbitdb1, orbitdb2 +// let ipfsd1, ipfsd2, ipfs1, ipfs2, id1, id2 +// let orbitdb1, orbitdb2 - before(async () => { - rmrf.sync(dbPath1) - rmrf.sync(dbPath2) - ipfsd1 = await startIpfs(API, config.daemon1) - ipfsd2 = await startIpfs(API, config.daemon2) - ipfs1 = ipfsd1.api - ipfs2 = ipfsd2.api +// before(async () => { +// rmrf.sync(dbPath1) +// rmrf.sync(dbPath2) +// ipfsd1 = await startIpfs(API, config.daemon1) +// ipfsd2 = await startIpfs(API, config.daemon2) +// ipfs1 = ipfsd1.api +// ipfs2 = ipfsd2.api - const keystore1 = new Keystore(dbPath1 + '/keys') - const keystore2 = new Keystore(dbPath2 + '/keys') +// const keystore1 = new Keystore(dbPath1 + '/keys') +// const keystore2 = new Keystore(dbPath2 + '/keys') - id1 = await IdentityProvider.createIdentity({ id: 'A', keystore: keystore1 }) - id2 = await IdentityProvider.createIdentity({ id: 'B', keystore: keystore2 }) +// id1 = await IdentityProvider.createIdentity({ id: 'A', keystore: keystore1 }) +// id2 = await IdentityProvider.createIdentity({ id: 'B', keystore: keystore2 }) - orbitdb1 = await OrbitDB.createInstance(ipfs1, { - AccessControllers, - directory: dbPath1, - identity: id1 - }) +// orbitdb1 = await OrbitDB.createInstance(ipfs1, { +// AccessControllers, +// directory: dbPath1, +// identity: id1 +// }) - orbitdb2 = await OrbitDB.createInstance(ipfs2, { - AccessControllers, - directory: dbPath2, - identity: id2 - }) - }) +// orbitdb2 = await OrbitDB.createInstance(ipfs2, { +// AccessControllers, +// directory: dbPath2, +// identity: id2 +// }) +// }) - after(async () => { - if (orbitdb1) { - await orbitdb1.stop() - } +// after(async () => { +// if (orbitdb1) { +// await orbitdb1.stop() +// } - if (orbitdb2) { - await orbitdb2.stop() - } +// if (orbitdb2) { +// await orbitdb2.stop() +// } - if (ipfsd1) { - await stopIpfs(ipfsd1) - } +// if (ipfsd1) { +// await stopIpfs(ipfsd1) +// } - if (ipfsd2) { - await stopIpfs(ipfsd2) - } - }) +// if (ipfsd2) { +// await stopIpfs(ipfsd2) +// } +// }) - describe('Constructor', function () { - let accessController +// describe('Constructor', function () { +// let accessController - before(async () => { - accessController = await OrbitDBAccessController.create(orbitdb1) - }) +// before(async () => { +// accessController = await OrbitDBAccessController.create(orbitdb1) +// }) - it('creates an access controller', () => { - assert.notStrictEqual(accessController, null) - assert.notStrictEqual(accessController, undefined) - }) +// it('creates an access controller', () => { +// assert.notStrictEqual(accessController, null) +// assert.notStrictEqual(accessController, undefined) +// }) - it('sets the controller type', () => { - assert.strictEqual(accessController.type, 'orbitdb') - }) +// it('sets the controller type', () => { +// assert.strictEqual(accessController.type, 'orbitdb') +// }) - it('has OrbitDB instance', async () => { - assert.notStrictEqual(accessController._orbitdb, null) - assert.strictEqual(accessController._orbitdb.id, orbitdb1.id) - }) +// it('has OrbitDB instance', async () => { +// assert.notStrictEqual(accessController._orbitdb, null) +// assert.strictEqual(accessController._orbitdb.id, orbitdb1.id) +// }) - it('has IPFS instance', async () => { - const peerId1 = await accessController._orbitdb._ipfs.id() - const peerId2 = await ipfs1.id() - assert.strictEqual(String(peerId1.id), String(peerId2.id)) - }) +// it('has IPFS instance', async () => { +// const peerId1 = await accessController._orbitdb._ipfs.id() +// const peerId2 = await ipfs1.id() +// assert.strictEqual(String(peerId1.id), String(peerId2.id)) +// }) - it('sets default capabilities', async () => { - assert.deepStrictEqual(accessController.capabilities, { - admin: new Set([id1.id]) - }) - }) +// it('sets default capabilities', async () => { +// assert.deepStrictEqual(accessController.capabilities, { +// admin: new Set([id1.id]) +// }) +// }) - it('allows owner to append after creation', async () => { - const mockEntry = { - identity: id1 - // ... - // doesn't matter what we put here, only identity is used for the check - } - const canAppend = await accessController.canAppend(mockEntry, id1.provider) - assert.strictEqual(canAppend, true) - }) - }) +// it('allows owner to append after creation', async () => { +// const mockEntry = { +// identity: id1 +// // ... +// // doesn't matter what we put here, only identity is used for the check +// } +// const canAppend = await accessController.canAppend(mockEntry, id1.provider) +// assert.strictEqual(canAppend, true) +// }) +// }) - describe('grant', function () { - let accessController +// describe('grant', function () { +// let accessController - before(async () => { - accessController = new OrbitDBAccessController(orbitdb1) - await accessController.load('testdb/add') - }) +// before(async () => { +// accessController = new OrbitDBAccessController(orbitdb1) +// await accessController.load('testdb/add') +// }) - it('loads the root access controller from IPFS', () => { - assert.strictEqual(accessController._db.access.type, 'ipfs') - assert.deepStrictEqual(accessController._db.access.write, [id1.id]) - }) +// it('loads the root access controller from IPFS', () => { +// assert.strictEqual(accessController._db.access.type, 'ipfs') +// assert.deepStrictEqual(accessController._db.access.write, [id1.id]) +// }) - it('adds a capability', async () => { - try { - await accessController.grant('write', id1.id) - } catch (e) { - assert(e, null) - } - assert.deepStrictEqual(accessController.capabilities, { - admin: new Set([id1.id]), - write: new Set([id1.id]) - }) - }) +// it('adds a capability', async () => { +// try { +// await accessController.grant('write', id1.id) +// } catch (e) { +// assert(e, null) +// } +// assert.deepStrictEqual(accessController.capabilities, { +// admin: new Set([id1.id]), +// write: new Set([id1.id]) +// }) +// }) - it('adds more capabilities', async () => { - try { - await accessController.grant('read', 'ABCD') - await accessController.grant('delete', 'ABCD') - } catch (e) { - assert.strictEqual(e, null) - } - assert.deepStrictEqual(accessController.capabilities, { - admin: new Set([id1.id]), - write: new Set([id1.id]), - read: new Set(['ABCD']), - delete: new Set(['ABCD']) - }) - }) +// it('adds more capabilities', async () => { +// try { +// await accessController.grant('read', 'ABCD') +// await accessController.grant('delete', 'ABCD') +// } catch (e) { +// assert.strictEqual(e, null) +// } +// assert.deepStrictEqual(accessController.capabilities, { +// admin: new Set([id1.id]), +// write: new Set([id1.id]), +// read: new Set(['ABCD']), +// delete: new Set(['ABCD']) +// }) +// }) - it('emit \'updated\' event when a capability was added', async () => { - return new Promise((resolve, reject) => { - accessController.on('updated', () => { - try { - assert.deepStrictEqual(accessController.capabilities, { - admin: new Set([id1.id]), - write: new Set([id1.id]), - read: new Set(['ABCD', 'AXES']), - delete: new Set(['ABCD']) - }) - resolve() - } catch (e) { - reject(e) - } - }) - accessController.grant('read', 'AXES') - }) - }) +// it('emit \'updated\' event when a capability was added', async () => { +// return new Promise((resolve, reject) => { +// accessController.on('updated', () => { +// try { +// assert.deepStrictEqual(accessController.capabilities, { +// admin: new Set([id1.id]), +// write: new Set([id1.id]), +// read: new Set(['ABCD', 'AXES']), +// delete: new Set(['ABCD']) +// }) +// resolve() +// } catch (e) { +// reject(e) +// } +// }) +// accessController.grant('read', 'AXES') +// }) +// }) - it('can append after acquiring capability', async () => { - try { - await accessController.grant('write', id1.id) - await accessController.grant('write', id2.id) - } catch (e) { - assert(e, null) - } - const mockEntry1 = { - identity: id1 - } - const mockEntry2 = { - identity: id2 - } - const canAppend1 = await accessController.canAppend(mockEntry1, id1.provider) - const canAppend2 = await accessController.canAppend(mockEntry2, id2.provider) - assert.strictEqual(canAppend1, true) - assert.strictEqual(canAppend2, true) - }) - }) +// it('can append after acquiring capability', async () => { +// try { +// await accessController.grant('write', id1.id) +// await accessController.grant('write', id2.id) +// } catch (e) { +// assert(e, null) +// } +// const mockEntry1 = { +// identity: id1 +// } +// const mockEntry2 = { +// identity: id2 +// } +// const canAppend1 = await accessController.canAppend(mockEntry1, id1.provider) +// const canAppend2 = await accessController.canAppend(mockEntry2, id2.provider) +// assert.strictEqual(canAppend1, true) +// assert.strictEqual(canAppend2, true) +// }) +// }) - describe('revoke', function () { - let accessController +// describe('revoke', function () { +// let accessController - before(async () => { - accessController = new OrbitDBAccessController(orbitdb1) - await accessController.load('testdb/remove') - }) +// before(async () => { +// accessController = new OrbitDBAccessController(orbitdb1) +// await accessController.load('testdb/remove') +// }) - it('removes a capability', async () => { - try { - await accessController.grant('write', id1.id) - await accessController.grant('write', 'AABB') - await accessController.revoke('write', 'AABB') - } catch (e) { - assert.strictEqual(e, null) - } - assert.deepStrictEqual(accessController.capabilities, { - admin: new Set([id1.id]), - write: new Set([id1.id]) - }) - }) +// it('removes a capability', async () => { +// try { +// await accessController.grant('write', id1.id) +// await accessController.grant('write', 'AABB') +// await accessController.revoke('write', 'AABB') +// } catch (e) { +// assert.strictEqual(e, null) +// } +// assert.deepStrictEqual(accessController.capabilities, { +// admin: new Set([id1.id]), +// write: new Set([id1.id]) +// }) +// }) - it('can remove the creator\'s write access', async () => { - try { - await accessController.revoke('write', id1.id) - } catch (e) { - assert.strictEqual(e, null) - } - assert.deepStrictEqual(accessController.capabilities, { - admin: new Set([id1.id]) - }) - }) +// it('can remove the creator\'s write access', async () => { +// try { +// await accessController.revoke('write', id1.id) +// } catch (e) { +// assert.strictEqual(e, null) +// } +// assert.deepStrictEqual(accessController.capabilities, { +// admin: new Set([id1.id]) +// }) +// }) - it('can\'t remove the creator\'s admin access', async () => { - try { - await accessController.revoke('admin', id1.id) - } catch (e) { - assert.strictEqual(e, null) - } - assert.deepStrictEqual(accessController.capabilities, { - admin: new Set([id1.id]) - }) - }) +// it('can\'t remove the creator\'s admin access', async () => { +// try { +// await accessController.revoke('admin', id1.id) +// } catch (e) { +// assert.strictEqual(e, null) +// } +// assert.deepStrictEqual(accessController.capabilities, { +// admin: new Set([id1.id]) +// }) +// }) - it('removes more capabilities', async () => { - try { - await accessController.grant('read', 'ABCD') - await accessController.grant('delete', 'ABCD') - await accessController.grant('write', id1.id) - await accessController.revoke('read', 'ABCDE') - await accessController.revoke('delete', 'ABCDE') - } catch (e) { - assert.strictEqual(e, null) - } - assert.deepStrictEqual(accessController.capabilities, { - admin: new Set([id1.id]), - delete: new Set(['ABCD']), - read: new Set(['ABCD']), - write: new Set([id1.id]) - }) - }) +// it('removes more capabilities', async () => { +// try { +// await accessController.grant('read', 'ABCD') +// await accessController.grant('delete', 'ABCD') +// await accessController.grant('write', id1.id) +// await accessController.revoke('read', 'ABCDE') +// await accessController.revoke('delete', 'ABCDE') +// } catch (e) { +// assert.strictEqual(e, null) +// } +// assert.deepStrictEqual(accessController.capabilities, { +// admin: new Set([id1.id]), +// delete: new Set(['ABCD']), +// read: new Set(['ABCD']), +// write: new Set([id1.id]) +// }) +// }) - it('can\'t append after revoking capability', async () => { - try { - await accessController.grant('write', id2.id) - await accessController.revoke('write', id2.id) - } catch (e) { - assert(e, null) - } - const mockEntry1 = { - identity: id1 - } - const mockEntry2 = { - identity: id2 - } - const canAppend = await accessController.canAppend(mockEntry1, id1.provider) - const noAppend = await accessController.canAppend(mockEntry2, id2.provider) - assert.strictEqual(canAppend, true) - assert.strictEqual(noAppend, false) - }) +// it('can\'t append after revoking capability', async () => { +// try { +// await accessController.grant('write', id2.id) +// await accessController.revoke('write', id2.id) +// } catch (e) { +// assert(e, null) +// } +// const mockEntry1 = { +// identity: id1 +// } +// const mockEntry2 = { +// identity: id2 +// } +// const canAppend = await accessController.canAppend(mockEntry1, id1.provider) +// const noAppend = await accessController.canAppend(mockEntry2, id2.provider) +// assert.strictEqual(canAppend, true) +// assert.strictEqual(noAppend, false) +// }) - it('emits \'updated\' event when a capability was removed', async () => { - await accessController.grant('admin', 'cats') - await accessController.grant('admin', 'dogs') +// it('emits \'updated\' event when a capability was removed', async () => { +// await accessController.grant('admin', 'cats') +// await accessController.grant('admin', 'dogs') - return new Promise((resolve, reject) => { - accessController.on('updated', () => { - try { - assert.deepStrictEqual(accessController.capabilities, { - admin: new Set([id1.id, 'dogs']), - delete: new Set(['ABCD']), - read: new Set(['ABCD']), - write: new Set([id1.id]) - }) - resolve() - } catch (e) { - reject(e) - } - }) - accessController.revoke('admin', 'cats') - }) - }) - }) +// return new Promise((resolve, reject) => { +// accessController.on('updated', () => { +// try { +// assert.deepStrictEqual(accessController.capabilities, { +// admin: new Set([id1.id, 'dogs']), +// delete: new Set(['ABCD']), +// read: new Set(['ABCD']), +// write: new Set([id1.id]) +// }) +// resolve() +// } catch (e) { +// reject(e) +// } +// }) +// accessController.revoke('admin', 'cats') +// }) +// }) +// }) - describe('save and load', function () { - let accessController, dbName +// describe('save and load', function () { +// let accessController, dbName - before(async () => { - dbName = 'testdb-load-' + new Date().getTime() - accessController = new OrbitDBAccessController(orbitdb1) - await accessController.load(dbName) - await accessController.grant('write', 'A') - await accessController.grant('write', 'B') - await accessController.grant('write', 'C') - await accessController.grant('write', 'C') // double entry - await accessController.grant('another', 'AA') - await accessController.grant('another', 'BB') - await accessController.revoke('another', 'AA') - await accessController.grant('admin', id1.id) - return new Promise((resolve) => { - // Test that the access controller emits 'updated' after it was loaded - accessController.on('updated', () => resolve()) - accessController.load(accessController.address) - }) - }) +// before(async () => { +// dbName = 'testdb-load-' + new Date().getTime() +// accessController = new OrbitDBAccessController(orbitdb1) +// await accessController.load(dbName) +// await accessController.grant('write', 'A') +// await accessController.grant('write', 'B') +// await accessController.grant('write', 'C') +// await accessController.grant('write', 'C') // double entry +// await accessController.grant('another', 'AA') +// await accessController.grant('another', 'BB') +// await accessController.revoke('another', 'AA') +// await accessController.grant('admin', id1.id) +// return new Promise((resolve) => { +// // Test that the access controller emits 'updated' after it was loaded +// accessController.on('updated', () => resolve()) +// accessController.load(accessController.address) +// }) +// }) - it('has the correct database address for the internal db', async () => { - const addr = accessController._db.address.toString().split('/') - assert.strictEqual(addr[addr.length - 1], '_access') - assert.strictEqual(addr[addr.length - 2], dbName) - }) +// it('has the correct database address for the internal db', async () => { +// const addr = accessController._db.address.toString().split('/') +// assert.strictEqual(addr[addr.length - 1], '_access') +// assert.strictEqual(addr[addr.length - 2], dbName) +// }) - it('has correct capabalities', async () => { - assert.deepStrictEqual(accessController.get('admin'), new Set([id1.id])) - assert.deepStrictEqual(accessController.get('write'), new Set(['A', 'B', 'C'])) - assert.deepStrictEqual(accessController.get('another'), new Set(['BB'])) - }) - }) - }) - // TODO: use two separate peers for testing the AC - // TODO: add tests for revocation correctness with a database (integration tests) -}) +// it('has correct capabalities', async () => { +// assert.deepStrictEqual(accessController.get('admin'), new Set([id1.id])) +// assert.deepStrictEqual(accessController.get('write'), new Set(['A', 'B', 'C'])) +// assert.deepStrictEqual(accessController.get('another'), new Set(['BB'])) +// }) +// }) +// }) +// // TODO: use two separate peers for testing the AC +// // TODO: add tests for revocation correctness with a database (integration tests) +// }) diff --git a/test/access-controllers/utils/connect-peers.js b/test/access-controllers/utils/connect-peers.js deleted file mode 100644 index fd04bb5..0000000 --- a/test/access-controllers/utils/connect-peers.js +++ /dev/null @@ -1,6 +0,0 @@ -export default async (ipfs1, ipfs2) => { - const id1 = await ipfs1.id() - const id2 = await ipfs2.id() - await ipfs1.swarm.connect(id2.addresses[0]) - await ipfs2.swarm.connect(id1.addresses[0]) -} diff --git a/test/access-controllers/utils/custom-test-keystore.js b/test/access-controllers/utils/custom-test-keystore.js deleted file mode 100644 index 65bcdbf..0000000 --- a/test/access-controllers/utils/custom-test-keystore.js +++ /dev/null @@ -1,54 +0,0 @@ -// import pkg from 'elliptic' -// const { ec: EC } = pkg -// const ec = new EC('secp256k1') - -// /** -// * A custom keystore example -// */ -// class CustomTestKeystore { -// constructor (signer) { -// this.createKey() -// } - -// createKey () { -// const key = ec.genKeyPair() -// this.key = ec.keyPair({ -// pub: key.getPublic('hex'), -// priv: key.getPrivate('hex'), -// privEnc: 'hex', -// pubEnc: 'hex' -// }) - -// return this.key -// } - -// getKey () { -// return this.key -// } - -// // TODO: check if this is really in use -// generateKey () { -// return Promise.resolve(this.createKey()) -// } - -// importPublicKey (key) { -// return Promise.resolve(ec.keyFromPublic(key, 'hex')) -// } - -// importPrivateKey (key) { -// return Promise.resolve(ec.keyFromPrivate(key, 'hex')) -// } - -// sign (key, data) { -// const sig = ec.sign(data, key) -// return Promise.resolve(sig.toDER('hex')) -// } - -// verify (signature, key, data) { -// let res = false -// res = ec.verify(data, signature, key) -// return Promise.resolve(res) -// } -// } - -// export default new CustomTestKeystore() diff --git a/test/access-controllers/utils/index.js b/test/access-controllers/utils/index.js deleted file mode 100644 index b44336d..0000000 --- a/test/access-controllers/utils/index.js +++ /dev/null @@ -1,8 +0,0 @@ -// TODO: these should be replace with orbit-db-test-utils -export { default as config } from './config.js' -export { testAPIs } from './test-apis.js' -export { default as startIpfs } from './start-ipfs.js' -export { default as stopIpfs } from './stop-ipfs.js' -export { default as waitForPeers } from './wait-for-peers.js' -export { default as connectPeers } from './connect-peers.js' -export { default as CustomTestKeystore } from './custom-test-keystore.js' diff --git a/test/access-controllers/utils/start-ipfs.js b/test/access-controllers/utils/start-ipfs.js deleted file mode 100644 index 8643c0b..0000000 --- a/test/access-controllers/utils/start-ipfs.js +++ /dev/null @@ -1,26 +0,0 @@ -import * as IPFSFactory from 'ipfsd-ctl' -import { testAPIs } from './test-apis.js' - -/** - * Start an IPFS instance - * @param {Object} config [IPFS configuration to use] - * @return {[Promise]} [IPFS instance] - */ -export default (type, config = {}) => { - return new Promise((resolve, reject) => { - if (!testAPIs[type]) { - reject(new Error(`Wanted API type ${JSON.stringify(type)} is unknown. Available types: ${Object.keys(testAPIs).join(', ')}`)) - } - - // Spawn an IPFS daemon (type defined in) - IPFSFactory - .create(testAPIs[type]) - .spawn(config, async (err, ipfsd) => { - if (err) { - reject(err) - } - - resolve(ipfsd) - }) - }) -} diff --git a/test/access-controllers/utils/stop-ipfs.js b/test/access-controllers/utils/stop-ipfs.js deleted file mode 100644 index 3ba6efe..0000000 --- a/test/access-controllers/utils/stop-ipfs.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Stop an IPFS or ipfsd-ctl instance - * @param {Object} config [IPFS ipfsd-ctl to stop] - * @return {None} - */ -export default (ipfs) => { - return new Promise((resolve, reject) => { - ipfs.stop((err) => { - if (err) { reject(err) } - resolve() - }) - }) -} diff --git a/test/access-controllers/utils/test-apis.js b/test/access-controllers/utils/test-apis.js deleted file mode 100644 index 36931ab..0000000 --- a/test/access-controllers/utils/test-apis.js +++ /dev/null @@ -1,32 +0,0 @@ -import * as IPFS from 'ipfs' - -/** - * IPFS daemons to run the tests with. - */ - -// Available daemon types are defined in: -// https://github.com/ipfs/js-ipfsd-ctl#ipfsfactory---const-f--ipfsfactorycreateoptions -const jsIpfs = { - 'js-ipfs': { - type: 'proc', - exec: IPFS - } -} - -const goIpfs = { - 'go-ipfs': { - type: 'go' - } -} - -// By default, we run tests against js-ipfs. -let testAPIs = Object.assign({}, jsIpfs) - -// Setting env variable 'TEST=all' will make tests run with js-ipfs and go-ipfs. -// Setting env variable 'TEST=go' will make tests run with go-ipfs. -// Eg. 'TEST=go mocha' runs tests with go-ipfs -if (process.env.TEST === 'all') { testAPIs = Object.assign({}, testAPIs, goIpfs) } else if (process.env.TEST === 'go') { testAPIs = Object.assign({}, goIpfs) } - -export { - testAPIs -} diff --git a/test/access-controllers/utils/wait-for-peers.js b/test/access-controllers/utils/wait-for-peers.js deleted file mode 100644 index 8613df0..0000000 --- a/test/access-controllers/utils/wait-for-peers.js +++ /dev/null @@ -1,12 +0,0 @@ -export default (ipfs, peersToWait, topic, callback) => { - return new Promise((resolve, reject) => { - const i = setInterval(async () => { - const peers = await ipfs.pubsub.peers(topic) - const hasAllPeers = peersToWait.map((e) => peers.includes(e)).filter((e) => e === false).length === 0 - if (hasAllPeers) { - clearInterval(i) - resolve() - } - }, 500) - }) -} diff --git a/test/access-controllers/utils/config.js b/test/config.js similarity index 83% rename from test/access-controllers/utils/config.js rename to test/config.js index c0d1b7b..c00bb80 100644 --- a/test/access-controllers/utils/config.js +++ b/test/config.js @@ -1,8 +1,9 @@ export default { timeout: 30000, - dbname: 'orbit-db-tests', defaultIpfsConfig: { - start: true, + preload: { + enabled: false + }, EXPERIMENTAL: { pubsub: true }, @@ -16,7 +17,7 @@ export default { Discovery: { MDNS: { Enabled: true, - Interval: 1 + Interval: 0 }, webRTCStar: { Enabled: false @@ -25,8 +26,6 @@ export default { } }, daemon1: { - repo: './ipfs/orbitdb/tests/daemon1', - start: true, EXPERIMENTAL: { pubsub: true }, @@ -40,7 +39,7 @@ export default { Discovery: { MDNS: { Enabled: true, - Interval: 1 + Interval: 0 }, webRTCStar: { Enabled: false @@ -49,8 +48,6 @@ export default { } }, daemon2: { - repo: './ipfs/orbitdb/tests/daemon2', - start: true, EXPERIMENTAL: { pubsub: true }, @@ -64,7 +61,7 @@ export default { Discovery: { MDNS: { Enabled: true, - Interval: 1 + Interval: 0 }, webRTCStar: { Enabled: false diff --git a/test/db/document-store.test.js b/test/db/document-store.test.js index 658b6c3..ccc5a52 100644 --- a/test/db/document-store.test.js +++ b/test/db/document-store.test.js @@ -1,17 +1,16 @@ import { deepStrictEqual, strictEqual } from 'assert' import rmrf from 'rimraf' import { copy } from 'fs-extra' +import * as IPFS from 'ipfs' import { Log, Entry, Database, KeyStore, Identities } from '../../src/index.js' import { DocumentStore } from '../../src/db/index.js' -import { config, startIpfs, stopIpfs } from 'orbit-db-test-utils' +import config from '../config.js' import testKeysPath from '../fixtures/test-keys-path.js ' const OpLog = { Log, Entry } const keysPath = './testkeys' -const IPFS = 'js-ipfs' describe('DocumentStore Database', function () { - let ipfsd let ipfs let keystore let accessController @@ -22,8 +21,7 @@ describe('DocumentStore Database', function () { const databaseId = 'documentstore-AAA' before(async () => { - ipfsd = await startIpfs(IPFS, config.daemon1) - ipfs = ipfsd.api + ipfs = await IPFS.create({ ...config.daemon1, repo: './ipfs1' }) await copy(testKeysPath, keysPath) keystore = await KeyStore({ path: keysPath }) @@ -32,8 +30,8 @@ describe('DocumentStore Database', function () { }) after(async () => { - if (ipfsd) { - await stopIpfs(ipfsd) + if (ipfs) { + await ipfs.stop() } if (keystore) { @@ -42,6 +40,7 @@ describe('DocumentStore Database', function () { await rmrf(keysPath) await rmrf('./orbitdb') + await rmrf('./ipfs1') }) describe('Default index \'_id\'', () => { diff --git a/test/db/event-store.test.js b/test/db/event-store.test.js index ae6cfb3..f53b777 100644 --- a/test/db/event-store.test.js +++ b/test/db/event-store.test.js @@ -2,17 +2,16 @@ import { deepStrictEqual, strictEqual } from 'assert' import mapSeries from 'p-map-series' import rmrf from 'rimraf' import { copy } from 'fs-extra' +import * as IPFS from 'ipfs' import { Log, Entry, Database, KeyStore, Identities } from '../../src/index.js' import { EventStore } from '../../src/db/index.js' -import { config, startIpfs, stopIpfs } from 'orbit-db-test-utils' +import config from '../config.js' import testKeysPath from '../fixtures/test-keys-path.js ' const OpLog = { Log, Entry } const keysPath = './testkeys' -const IPFS = 'js-ipfs' describe('EventStore Database', function () { - let ipfsd let ipfs let keystore let accessController @@ -23,8 +22,7 @@ describe('EventStore Database', function () { const databaseId = 'eventstore-AAA' before(async () => { - ipfsd = await startIpfs(IPFS, config.daemon1) - ipfs = ipfsd.api + ipfs = await IPFS.create({ ...config.daemon1, repo: './ipfs1' }) await copy(testKeysPath, keysPath) keystore = await KeyStore({ path: keysPath }) @@ -33,8 +31,8 @@ describe('EventStore Database', function () { }) after(async () => { - if (ipfsd) { - await stopIpfs(ipfsd) + if (ipfs) { + await ipfs.stop() } if (keystore) { @@ -43,6 +41,7 @@ describe('EventStore Database', function () { await rmrf(keysPath) await rmrf('./orbitdb') + await rmrf('./ipfs1') }) beforeEach(async () => { diff --git a/test/db/keyvalue-persisted.js b/test/db/keyvalue-persisted.js index 44e49bf..df78b42 100644 --- a/test/db/keyvalue-persisted.js +++ b/test/db/keyvalue-persisted.js @@ -1,17 +1,16 @@ import { deepStrictEqual, strictEqual } from 'assert' import rmrf from 'rimraf' import { copy } from 'fs-extra' +import * as IPFS from 'ipfs' import { Log, Entry, Database, KeyStore, Identities } from '../../src/index.js' import { KeyValuePersisted, KeyValue } from '../../src/db/index.js' -import { config, startIpfs, stopIpfs } from 'orbit-db-test-utils' +import config from '../config.js' import testKeysPath from '../fixtures/test-keys-path.js ' const OpLog = { Log, Entry } const keysPath = './testkeys' -const IPFS = 'js-ipfs' describe('KeyValuePersisted Database', function () { - let ipfsd let ipfs let keystore let accessController @@ -22,8 +21,7 @@ describe('KeyValuePersisted Database', function () { const databaseId = 'keyvalue-AAA' before(async () => { - ipfsd = await startIpfs(IPFS, config.daemon1) - ipfs = ipfsd.api + ipfs = await IPFS.create({ ...config.daemon1, repo: './ipfs1' }) await copy(testKeysPath, keysPath) keystore = await KeyStore({ path: keysPath }) @@ -32,8 +30,8 @@ describe('KeyValuePersisted Database', function () { }) after(async () => { - if (ipfsd) { - await stopIpfs(ipfsd) + if (ipfs) { + await ipfs.stop() } if (keystore) { @@ -42,6 +40,7 @@ describe('KeyValuePersisted Database', function () { await rmrf(keysPath) await rmrf('./orbitdb') + await rmrf('./ipfs1') }) beforeEach(async () => { diff --git a/test/db/keyvalue.test.js b/test/db/keyvalue.test.js index 6029a22..7c796bb 100644 --- a/test/db/keyvalue.test.js +++ b/test/db/keyvalue.test.js @@ -1,17 +1,16 @@ import { deepStrictEqual, strictEqual } from 'assert' import rmrf from 'rimraf' import { copy } from 'fs-extra' +import * as IPFS from 'ipfs' import { Log, Entry, Database, KeyStore, Identities } from '../../src/index.js' import { KeyValue } from '../../src/db/index.js' -import { config, startIpfs, stopIpfs } from 'orbit-db-test-utils' +import config from '../config.js' import testKeysPath from '../fixtures/test-keys-path.js ' const OpLog = { Log, Entry } const keysPath = './testkeys' -const IPFS = 'js-ipfs' describe('KeyValue Database', function () { - let ipfsd let ipfs let keystore let accessController @@ -22,8 +21,7 @@ describe('KeyValue Database', function () { const databaseId = 'keyvalue-AAA' before(async () => { - ipfsd = await startIpfs(IPFS, config.daemon1) - ipfs = ipfsd.api + ipfs = await IPFS.create({ ...config.daemon1, repo: './ipfs1' }) await copy(testKeysPath, keysPath) keystore = await KeyStore({ path: keysPath }) @@ -32,8 +30,8 @@ describe('KeyValue Database', function () { }) after(async () => { - if (ipfsd) { - await stopIpfs(ipfsd) + if (ipfs) { + await ipfs.stop() } if (keystore) { @@ -42,6 +40,7 @@ describe('KeyValue Database', function () { await rmrf(keysPath) await rmrf('./orbitdb') + await rmrf('./ipfs1') }) beforeEach(async () => { diff --git a/test/db/replication/document-store.test.js b/test/db/replication/document-store.test.js index d9755f9..46aac39 100644 --- a/test/db/replication/document-store.test.js +++ b/test/db/replication/document-store.test.js @@ -1,21 +1,20 @@ import { deepStrictEqual } from 'assert' import rmrf from 'rimraf' import { copy } from 'fs-extra' +import * as IPFS from 'ipfs' import { Log, Entry, Database, KeyStore, Identities } from '../../../src/index.js' import { DocumentStore } from '../../../src/db/index.js' -import { config, startIpfs, stopIpfs } from 'orbit-db-test-utils' +import config from '../../config.js' import testKeysPath from '../../fixtures/test-keys-path.js ' import connectPeers from '../../utils/connect-nodes.js' import waitFor from '../../utils/wait-for.js' const OpLog = { Log, Entry } const keysPath = './testkeys' -const IPFS = 'js-ipfs' describe('Documents Database Replication', function () { this.timeout(30000) - let ipfsd1, ipfsd2 let ipfs1, ipfs2 let keystore let identities @@ -33,11 +32,8 @@ describe('Documents Database Replication', function () { } before(async () => { - ipfsd1 = await startIpfs(IPFS, config.daemon1) - ipfsd2 = await startIpfs(IPFS, config.daemon2) - ipfs1 = ipfsd1.api - ipfs2 = ipfsd2.api - + ipfs1 = await IPFS.create({ ...config.daemon1, repo: './ipfs1' }) + ipfs2 = await IPFS.create({ ...config.daemon2, repo: './ipfs2' }) await connectPeers(ipfs1, ipfs2) await copy(testKeysPath, keysPath) @@ -48,12 +44,12 @@ describe('Documents Database Replication', function () { }) after(async () => { - if (ipfsd1) { - await stopIpfs(ipfsd1) + if (ipfs1) { + await ipfs1.stop() } - if (ipfsd2) { - await stopIpfs(ipfsd2) + if (ipfs2) { + await ipfs2.stop() } if (keystore) { @@ -63,6 +59,8 @@ describe('Documents Database Replication', function () { await rmrf(keysPath) await rmrf('./orbitdb1') await rmrf('./orbitdb2') + await rmrf('./ipfs1') + await rmrf('./ipfs2') }) beforeEach(async () => { diff --git a/test/db/replication/event-store.test.js b/test/db/replication/event-store.test.js index 8dbb0be..4558c56 100644 --- a/test/db/replication/event-store.test.js +++ b/test/db/replication/event-store.test.js @@ -1,21 +1,20 @@ import { deepStrictEqual } from 'assert' import rmrf from 'rimraf' import { copy } from 'fs-extra' +import * as IPFS from 'ipfs' import { Log, Entry, Database, KeyStore, Identities } from '../../../src/index.js' import { EventStore } from '../../../src/db/index.js' -import { config, startIpfs, stopIpfs } from 'orbit-db-test-utils' +import config from '../../config.js' import testKeysPath from '../../fixtures/test-keys-path.js ' import connectPeers from '../../utils/connect-nodes.js' import waitFor from '../../utils/wait-for.js' const OpLog = { Log, Entry } const keysPath = './testkeys' -const IPFS = 'js-ipfs' describe('Events Database Replication', function () { - this.timeout(5000) + this.timeout(30000) - let ipfsd1, ipfsd2 let ipfs1, ipfs2 let keystore let identities @@ -43,11 +42,8 @@ describe('Events Database Replication', function () { ] before(async () => { - ipfsd1 = await startIpfs(IPFS, config.daemon1) - ipfsd2 = await startIpfs(IPFS, config.daemon2) - ipfs1 = ipfsd1.api - ipfs2 = ipfsd2.api - + ipfs1 = await IPFS.create({ ...config.daemon1, repo: './ipfs1' }) + ipfs2 = await IPFS.create({ ...config.daemon2, repo: './ipfs2' }) await connectPeers(ipfs1, ipfs2) await copy(testKeysPath, keysPath) @@ -58,12 +54,12 @@ describe('Events Database Replication', function () { }) after(async () => { - if (ipfsd1) { - await stopIpfs(ipfsd1) + if (ipfs1) { + await ipfs1.stop() } - if (ipfsd2) { - await stopIpfs(ipfsd2) + if (ipfs2) { + await ipfs2.stop() } if (keystore) { @@ -73,6 +69,8 @@ describe('Events Database Replication', function () { await rmrf(keysPath) await rmrf('./orbitdb1') await rmrf('./orbitdb2') + await rmrf('./ipfs1') + await rmrf('./ipfs2') }) afterEach(async () => { diff --git a/test/db/replication/keyvalue.test.js b/test/db/replication/keyvalue.test.js index 923f926..59406a6 100644 --- a/test/db/replication/keyvalue.test.js +++ b/test/db/replication/keyvalue.test.js @@ -1,21 +1,20 @@ import { deepStrictEqual } from 'assert' import rmrf from 'rimraf' import { copy } from 'fs-extra' +import * as IPFS from 'ipfs' import { Log, Entry, Database, KeyStore, Identities } from '../../../src/index.js' import { KeyValue, KeyValuePersisted } from '../../../src/db/index.js' -import { config, startIpfs, stopIpfs } from 'orbit-db-test-utils' +import config from '../../config.js' import testKeysPath from '../../fixtures/test-keys-path.js ' import connectPeers from '../../utils/connect-nodes.js' import waitFor from '../../utils/wait-for.js' const OpLog = { Log, Entry } const keysPath = './testkeys' -const IPFS = 'js-ipfs' describe('KeyValue Database Replication', function () { - this.timeout(5000) + this.timeout(30000) - let ipfsd1, ipfsd2 let ipfs1, ipfs2 let keystore let identities @@ -32,11 +31,8 @@ describe('KeyValue Database Replication', function () { } before(async () => { - ipfsd1 = await startIpfs(IPFS, config.daemon1) - ipfsd2 = await startIpfs(IPFS, config.daemon2) - ipfs1 = ipfsd1.api - ipfs2 = ipfsd2.api - + ipfs1 = await IPFS.create({ ...config.daemon1, repo: './ipfs1' }) + ipfs2 = await IPFS.create({ ...config.daemon2, repo: './ipfs2' }) await connectPeers(ipfs1, ipfs2) await copy(testKeysPath, keysPath) @@ -47,12 +43,12 @@ describe('KeyValue Database Replication', function () { }) after(async () => { - if (ipfsd1) { - await stopIpfs(ipfsd1) + if (ipfs1) { + await ipfs1.stop() } - if (ipfsd2) { - await stopIpfs(ipfsd2) + if (ipfs2) { + await ipfs2.stop() } if (keystore) { @@ -62,6 +58,8 @@ describe('KeyValue Database Replication', function () { await rmrf(keysPath) await rmrf('./orbitdb1') await rmrf('./orbitdb2') + await rmrf('./ipfs1') + await rmrf('./ipfs2') }) afterEach(async () => { diff --git a/test/oplog/load.test.js b/test/oplog/load.test.js index 32f3670..8226f3a 100644 --- a/test/oplog/load.test.js +++ b/test/oplog/load.test.js @@ -1,858 +1,858 @@ -import { strictEqual, deepStrictEqual, notStrictEqual, throws } from 'assert' -import rimraf from 'rimraf' -import { copy } from 'fs-extra' -import { Log, Entry, Sorting } from '../../src/oplog/index.js' -import { Identities, KeyStore } from '../../src/index.js' -import bigLogString from '../fixtures/big-log.fixture.js' -import LogCreator from './utils/log-creator.js' -import testKeysPath from '../fixtures/test-keys-path.js ' -import { config, testAPIs, startIpfs, stopIpfs } from 'orbit-db-test-utils' - -const { sync: rmrf } = rimraf -const { LastWriteWins } = Sorting -const { createIdentity } = Identities -const { fromJSON, fromEntryHash, fromEntry, fromMultihash: _fromMultihash } = Log -const { fromMultihash, create, compare } = Entry -const { createLogWithSixteenEntries, createLogWithTwoHundredEntries } = LogCreator - -// Alternate tiebreaker. Always does the opposite of LastWriteWins -const FirstWriteWins = (a, b) => LastWriteWins(a, b) * -1 -const BadComparatorReturnsZero = (a, b) => 0 - -let ipfsd, ipfs, testIdentity, testIdentity2, testIdentity3, testIdentity4 - -const last = (arr) => { - return arr[arr.length - 1] -} - -Object.keys(testAPIs).forEach((IPFS) => { - describe.skip('Log - Load (' + IPFS + ')', function () { - this.timeout(config.timeout) - - const { identityKeyFixtures, signingKeyFixtures, identityKeysPath } = config - - const firstWriteExpectedData = [ - 'entryA6', 'entryA7', 'entryA8', 'entryA9', - 'entryA10', 'entryB1', 'entryB2', 'entryB3', - 'entryB4', 'entryB5', 'entryA1', 'entryA2', - 'entryA3', 'entryA4', 'entryA5', 'entryC0' - ] - - let keystore - - before(async () => { - rmrf(identityKeysPath) - - await copy(identityKeyFixtures, identityKeysPath) - await copy(signingKeyFixtures, identityKeysPath) - - keystore = await KeyStore({ path: testKeysPath }) - - testIdentity = await createIdentity({ id: 'userC', keystore }) - testIdentity2 = await createIdentity({ id: 'userB', keystore }) - testIdentity3 = await createIdentity({ id: 'userD', keystore }) - testIdentity4 = await createIdentity({ id: 'userA', keystore }) - ipfsd = await startIpfs(IPFS, config.defaultIpfsConfig) - ipfs = ipfsd.api - }) - - after(async () => { - await stopIpfs(ipfsd) - await keystore.close() - rmrf(identityKeysPath) - }) - - describe('fromJSON', async () => { - let identities - - before(async () => { - identities = [testIdentity, testIdentity2, testIdentity3, testIdentity4] - }) - - it('creates a log from an entry', async () => { - const fixture = await createLogWithSixteenEntries(Log, ipfs, identities) - const data = fixture.log - const json = fixture.json - - json.heads = await Promise.all(json.heads.map(headHash => fromMultihash(ipfs, headHash))) - - const log = await fromJSON(ipfs, testIdentity, json, { logId: 'X' }) - - strictEqual(log.id, data.heads[0].id) - strictEqual(log.length, 16) - deepStrictEqual(log.values.map(e => e.payload), fixture.expectedData) - }) - - it('creates a log from an entry with custom tiebreaker', async () => { - const fixture = await createLogWithSixteenEntries(Log, ipfs, identities) - const data = fixture.log - const json = fixture.json - - json.heads = await Promise.all(json.heads.map(headHash => fromMultihash(ipfs, headHash))) - - const log = await fromJSON(ipfs, testIdentity, json, - { length: -1, logId: 'X', sortFn: FirstWriteWins }) - - strictEqual(log.id, data.heads[0].id) - strictEqual(log.length, 16) - deepStrictEqual(log.values.map(e => e.payload), firstWriteExpectedData) - }) - - it('respects timeout parameter', async () => { - const fixture = await createLogWithSixteenEntries(Log, ipfs, identities) - const json = fixture.json - json.heads = [{ hash: 'zdpuAwNuRc2Kc1aNDdcdSWuxfNpHRJQw8L8APBNHCEFXbogus' }] - - const timeout = 500 - const st = new Date().getTime() - const log = await fromJSON(ipfs, testIdentity, json, { logId: 'X', timeout }) - const et = new Date().getTime() - // Allow for a few millseconds of skew - strictEqual((et - st) >= (timeout - 10), true, '' + (et - st) + ' should be greater than timeout ' + timeout) - strictEqual(log.length, 0) - deepStrictEqual(log.values.map(e => e.payload), []) - }) - }) - - describe('fromEntryHash', () => { - let identities - - before(async () => { - identities = [testIdentity, testIdentity2, testIdentity3, testIdentity4] - }) - - it('creates a log from an entry hash', async () => { - const fixture = await createLogWithSixteenEntries(Log, ipfs, identities) - const data = fixture.log - const json = fixture.json - - const log1 = await fromEntryHash(ipfs, testIdentity, json.heads[0], - { logId: 'X' }) - const log2 = await fromEntryHash(ipfs, testIdentity, json.heads[1], - { logId: 'X' }) - - await log1.join(log2) - - strictEqual(log1.id, data.heads[0].id) - strictEqual(log1.length, 16) - deepStrictEqual(log1.values.map(e => e.payload), fixture.expectedData) - }) - - it('creates a log from an entry hash with custom tiebreaker', async () => { - const fixture = await createLogWithSixteenEntries(Log, ipfs, identities) - const data = fixture.log - const json = fixture.json - const log1 = await fromEntryHash(ipfs, testIdentity, json.heads[0], - { logId: 'X', sortFn: FirstWriteWins }) - const log2 = await fromEntryHash(ipfs, testIdentity, json.heads[1], - { logId: 'X', sortFn: FirstWriteWins }) - - await log1.join(log2) - - strictEqual(log1.id, data.heads[0].id) - strictEqual(log1.length, 16) - deepStrictEqual(log1.values.map(e => e.payload), firstWriteExpectedData) - }) - - it('respects timeout parameter', async () => { - const timeout = 500 - const st = new Date().getTime() - const log = await fromEntryHash(ipfs, testIdentity, 'zdpuAwNuRc2Kc1aNDdcdSWuxfNpHRJQw8L8APBNHCEFXbogus', { logId: 'X', timeout }) - const et = new Date().getTime() - strictEqual((et - st) >= timeout, true, '' + (et - st) + ' should be greater than timeout ' + timeout) - strictEqual(log.length, 0) - deepStrictEqual(log.values.map(e => e.payload), []) - }) - }) - - describe('fromEntry', () => { - let identities - - before(async () => { - identities = [testIdentity3, testIdentity2, testIdentity, testIdentity4] - }) - - it('creates a log from an entry', async () => { - const fixture = await createLogWithSixteenEntries(Log, ipfs, identities) - const data = fixture.log - - const log = await fromEntry(ipfs, testIdentity, data.heads, { length: -1 }) - strictEqual(log.id, data.heads[0].id) - strictEqual(log.length, 16) - deepStrictEqual(log.values.map(e => e.payload), fixture.expectedData) - }) - - it('creates a log from an entry with custom tiebreaker', async () => { - const fixture = await createLogWithSixteenEntries(Log, ipfs, identities) - const data = fixture.log - - const log = await fromEntry(ipfs, testIdentity, data.heads, - { length: -1, sortFn: FirstWriteWins }) - strictEqual(log.id, data.heads[0].id) - strictEqual(log.length, 16) - deepStrictEqual(log.values.map(e => e.payload), firstWriteExpectedData) - }) - - it('keeps the original heads', async () => { - const fixture = await createLogWithSixteenEntries(Log, ipfs, identities) - const data = fixture.log - - const log1 = await fromEntry(ipfs, testIdentity, data.heads, - { length: data.heads.length }) - strictEqual(log1.id, data.heads[0].id) - strictEqual(log1.length, data.heads.length) - strictEqual(log1.values[0].payload, 'entryC0') - strictEqual(log1.values[1].payload, 'entryA10') - - const log2 = await fromEntry(ipfs, testIdentity, data.heads, { length: 4 }) - strictEqual(log2.id, data.heads[0].id) - strictEqual(log2.length, 4) - strictEqual(log2.values[0].payload, 'entryC0') - strictEqual(log2.values[1].payload, 'entryA8') - strictEqual(log2.values[2].payload, 'entryA9') - strictEqual(log2.values[3].payload, 'entryA10') - - const log3 = await fromEntry(ipfs, testIdentity, data.heads, { length: 7 }) - strictEqual(log3.id, data.heads[0].id) - strictEqual(log3.length, 7) - strictEqual(log3.values[0].payload, 'entryB5') - strictEqual(log3.values[1].payload, 'entryA6') - strictEqual(log3.values[2].payload, 'entryC0') - strictEqual(log3.values[3].payload, 'entryA7') - strictEqual(log3.values[4].payload, 'entryA8') - strictEqual(log3.values[5].payload, 'entryA9') - strictEqual(log3.values[6].payload, 'entryA10') - }) - - it('onProgress callback is fired for each entry', async () => { - const items1 = [] - const amount = 100 - for (let i = 1; i <= amount; i++) { - const prev1 = last(items1) - const n1 = await create(ipfs, testIdentity, 'A', 'entryA' + i, [prev1]) - items1.push(n1) - } - - let i = 0 - const callback = (entry) => { - notStrictEqual(entry, null) - strictEqual(entry.hash, items1[items1.length - i - 1].hash) - strictEqual(entry.payload, items1[items1.length - i - 1].payload) - i++ - } - - await fromEntry(ipfs, testIdentity, last(items1), - { length: -1, exclude: [], onProgressCallback: callback }) - }) - - it('retrieves partial log from an entry hash', async () => { - const log1 = await Log(testIdentity, { logId: 'X' }) - const log2 = await Log(testIdentity2, { logId: 'X' }) - const log3 = await Log(testIdentity3, { logId: 'X' }) - const items1 = [] - const items2 = [] - const items3 = [] - const amount = 100 - for (let i = 1; i <= amount; i++) { - const prev1 = last(items1) - const prev2 = last(items2) - const prev3 = last(items3) - const n1 = await create(ipfs, log1._identity, 'X', 'entryA' + i, [prev1]) - const n2 = await create(ipfs, log2._identity, 'X', 'entryB' + i, [prev2, n1]) - const n3 = await create(ipfs, log3._identity, 'X', 'entryC' + i, [prev3, n1, n2]) - items1.push(n1) - items2.push(n2) - items3.push(n3) - } - - // limit to 10 entries - const a = await fromEntry(ipfs, testIdentity, last(items1), { length: 10 }) - strictEqual(a.length, 10) - - // limit to 42 entries - const b = await fromEntry(ipfs, testIdentity, last(items1), { length: 42 }) - strictEqual(b.length, 42) - }) - - it('throws an error if trying to create a log from a hash of an entry', async () => { - const items1 = [] - const amount = 5 - for (let i = 1; i <= amount; i++) { - const prev1 = last(items1) - const n1 = await create(ipfs, testIdentity, 'A', 'entryA' + i, [prev1]) - items1.push(n1) - } - - let err - try { - await fromEntry(ipfs, testIdentity, last(items1).hash, { length: 1 }) - } catch (e) { - err = e - } - strictEqual(err.message, '\'sourceEntries\' argument must be an array of Entry instances or a single Entry') - }) - - it('retrieves full log from an entry hash', async () => { - const log1 = await Log(testIdentity, { logId: 'X' }) - const log2 = await Log(testIdentity2, { logId: 'X' }) - const log3 = await Log(testIdentity3, { logId: 'X' }) - const items1 = [] - const items2 = [] - const items3 = [] - const amount = 10 - for (let i = 1; i <= amount; i++) { - const prev1 = last(items1) - const prev2 = last(items2) - const prev3 = last(items3) - const n1 = await create(ipfs, log1._identity, 'X', 'entryA' + i, [prev1]) - const n2 = await create(ipfs, log2._identity, 'X', 'entryB' + i, [prev2, n1]) - const n3 = await create(ipfs, log3._identity, 'X', 'entryC' + i, [prev3, n2]) - items1.push(n1) - items2.push(n2) - items3.push(n3) - } - - const a = await fromEntry(ipfs, testIdentity, [last(items1)], - { length: amount }) - strictEqual(a.length, amount) - - const b = await fromEntry(ipfs, testIdentity2, [last(items2)], - { length: amount * 2 }) - strictEqual(b.length, amount * 2) - - const c = await fromEntry(ipfs, testIdentity3, [last(items3)], - { length: amount * 3 }) - strictEqual(c.length, amount * 3) - }) - - it('retrieves full log from an entry hash 2', async () => { - const log1 = await Log(testIdentity, { logId: 'X' }) - const log2 = await Log(testIdentity2, { logId: 'X' }) - const log3 = await Log(testIdentity3, { logId: 'X' }) - const items1 = [] - const items2 = [] - const items3 = [] - const amount = 10 - for (let i = 1; i <= amount; i++) { - const prev1 = last(items1) - const prev2 = last(items2) - const prev3 = last(items3) - const n1 = await create(ipfs, log1._identity, 'X', 'entryA' + i, [prev1]) - const n2 = await create(ipfs, log2._identity, 'X', 'entryB' + i, [prev2, n1]) - const n3 = await create(ipfs, log3._identity, 'X', 'entryC' + i, [prev3, n1, n2]) - items1.push(n1) - items2.push(n2) - items3.push(n3) - } - - const a = await fromEntry(ipfs, testIdentity, last(items1), - { length: amount }) - strictEqual(a.length, amount) - - const b = await fromEntry(ipfs, testIdentity2, last(items2), - { length: amount * 2 }) - strictEqual(b.length, amount * 2) - - const c = await fromEntry(ipfs, testIdentity3, last(items3), - { length: amount * 3 }) - strictEqual(c.length, amount * 3) - }) - - it('retrieves full log from an entry hash 3', async () => { - const log1 = await Log(testIdentity, { logId: 'X' }) - const log2 = await Log(testIdentity2, { logId: 'X' }) - const log3 = await Log(testIdentity4, { logId: 'X' }) - const items1 = [] - const items2 = [] - const items3 = [] - const amount = 10 - for (let i = 1; i <= amount; i++) { - const prev1 = last(items1) - const prev2 = last(items2) - const prev3 = last(items3) - log1.clock().tick() - log2.clock().tick() - log3.clock().tick() - const n1 = await create(ipfs, log1._identity, 'X', 'entryA' + i, [prev1], log1.clock()) - const n2 = await create(ipfs, log2._identity, 'X', 'entryB' + i, [prev2, n1], log2.clock()) - const n3 = await create(ipfs, log3._identity, 'X', 'entryC' + i, [prev3, n1, n2], log3.clock()) - log1.clock().merge(log2.clock()) - log1.clock().merge(log3.clock()) - log2.clock().merge(log1.clock()) - log2.clock().merge(log3.clock()) - log3.clock().merge(log1.clock()) - log3.clock().merge(log2.clock()) - items1.push(n1) - items2.push(n2) - items3.push(n3) - } - - const a = await fromEntry(ipfs, testIdentity, last(items1), - { length: amount }) - strictEqual(a.length, amount) - - const itemsInB = [ - 'entryA1', - 'entryB1', - 'entryA2', - 'entryB2', - 'entryA3', - 'entryB3', - 'entryA4', - 'entryB4', - 'entryA5', - 'entryB5', - 'entryA6', - 'entryB6', - 'entryA7', - 'entryB7', - 'entryA8', - 'entryB8', - 'entryA9', - 'entryB9', - 'entryA10', - 'entryB10' - ] - - const b = await fromEntry(ipfs, testIdentity2, last(items2), - { length: amount * 2 }) - strictEqual(b.length, amount * 2) - deepStrictEqual(b.values.map((e) => e.payload), itemsInB) - - const c = await fromEntry(ipfs, testIdentity4, last(items3), - { length: amount * 3 }) - await c.append('EOF') - strictEqual(c.length, amount * 3 + 1) - - const tmp = [ - 'entryA1', - 'entryB1', - 'entryC1', - 'entryA2', - 'entryB2', - 'entryC2', - 'entryA3', - 'entryB3', - 'entryC3', - 'entryA4', - 'entryB4', - 'entryC4', - 'entryA5', - 'entryB5', - 'entryC5', - 'entryA6', - 'entryB6', - 'entryC6', - 'entryA7', - 'entryB7', - 'entryC7', - 'entryA8', - 'entryB8', - 'entryC8', - 'entryA9', - 'entryB9', - 'entryC9', - 'entryA10', - 'entryB10', - 'entryC10', - 'EOF' - ] - deepStrictEqual(c.values.map(e => e.payload), tmp) - - // make sure logX comes after A, B and C - const logX = await Log(testIdentity4, { logId: 'X' }) - await logX.append('1') - await logX.append('2') - await logX.append('3') - const d = await fromEntry(ipfs, testIdentity3, last(logX.values), - { length: -1 }) - - await c.join(d) - await d.join(c) - - await c.append('DONE') - await d.append('DONE') - const f = await fromEntry(ipfs, testIdentity3, last(c.values), - { amount: -1, exclude: [] }) - const g = await fromEntry(ipfs, testIdentity3, last(d.values), - { length: -1, exclude: [] }) - - strictEqual(f.toString(), bigLogString) - strictEqual(g.toString(), bigLogString) - }) - - it('retrieves full log of randomly joined log', async () => { - const log1 = await Log(testIdentity, { logId: 'X' }) - const log2 = await Log(testIdentity3, { logId: 'X' }) - const log3 = await Log(testIdentity4, { logId: 'X' }) - - for (let i = 1; i <= 5; i++) { - await log1.append('entryA' + i) - } - - for (let i = 1; i <= 5; i++) { - await log2.append('entryB' + i) - } - - await log3.join(log1) - await log3.join(log2) - - for (let i = 6; i <= 10; i++) { - await log1.append('entryA' + i) - } - - await log1.join(log3) - - for (let i = 11; i <= 15; i++) { - await log1.append('entryA' + i) - } - - const expectedData = [ - 'entryA1', 'entryB1', 'entryA2', 'entryB2', - 'entryA3', 'entryB3', 'entryA4', 'entryB4', - 'entryA5', 'entryB5', - 'entryA6', 'entryA7', 'entryA8', 'entryA9', 'entryA10', - 'entryA11', 'entryA12', 'entryA13', 'entryA14', 'entryA15' - ] - - deepStrictEqual(log1.values.map(e => e.payload), expectedData) - }) - - it('retrieves randomly joined log deterministically', async () => { - const logA = await Log(testIdentity, { logId: 'X' }) - const logB = await Log(testIdentity3, { logId: 'X' }) - const log3 = await Log(testIdentity4, { logId: 'X' }) - const log = await Log(testIdentity2, { logId: 'X' }) - - for (let i = 1; i <= 5; i++) { - await logA.append('entryA' + i) - } - - for (let i = 1; i <= 5; i++) { - await logB.append('entryB' + i) - } - - await log3.join(logA) - await log3.join(logB) - - for (let i = 6; i <= 10; i++) { - await logA.append('entryA' + i) - } - - await log.join(log3) - await log.append('entryC0') - await log.join(logA, 16) - - const expectedData = [ - 'entryA1', 'entryB1', 'entryA2', 'entryB2', - 'entryA3', 'entryB3', 'entryA4', 'entryB4', - 'entryA5', 'entryB5', - 'entryA6', - 'entryC0', 'entryA7', 'entryA8', 'entryA9', 'entryA10' - ] - - deepStrictEqual(log.values.map(e => e.payload), expectedData) - }) - - it('sorts', async () => { - const testLog = await createLogWithSixteenEntries(Log, ipfs, identities) - const log = testLog.log - const expectedData = testLog.expectedData - - const expectedData2 = [ - 'entryA1', 'entryB1', 'entryA2', 'entryB2', - 'entryA3', 'entryB3', 'entryA4', 'entryB4', - 'entryA5', 'entryB5', - 'entryA6', 'entryA7', 'entryA8', 'entryA9', 'entryA10' - ] - - const expectedData3 = [ - 'entryA1', 'entryB1', 'entryA2', 'entryB2', - 'entryA3', 'entryB3', 'entryA4', 'entryB4', - 'entryA5', 'entryB5', 'entryA6', 'entryC0', - 'entryA7', 'entryA8', 'entryA9' - ] - - const expectedData4 = [ - 'entryA1', 'entryB1', 'entryA2', 'entryB2', - 'entryA3', 'entryB3', 'entryA4', 'entryB4', - 'entryA5', 'entryA6', 'entryC0', 'entryA7', - 'entryA8', 'entryA9', 'entryA10' - ] - - const fetchOrder = log.values.slice().sort(compare) - deepStrictEqual(fetchOrder.map(e => e.payload), expectedData) - - const reverseOrder = log.values.slice().reverse().sort(compare) - deepStrictEqual(fetchOrder, reverseOrder) - - const hashOrder = log.values.slice().sort((a, b) => a.hash > b.hash).sort(compare) - deepStrictEqual(fetchOrder, hashOrder) - - const randomOrder2 = log.values.slice().sort((a, b) => 0.5 - Math.random()).sort(compare) - deepStrictEqual(fetchOrder, randomOrder2) - - // partial data - const partialLog = log.values.filter(e => e.payload !== 'entryC0').sort(compare) - deepStrictEqual(partialLog.map(e => e.payload), expectedData2) - - const partialLog2 = log.values.filter(e => e.payload !== 'entryA10').sort(compare) - deepStrictEqual(partialLog2.map(e => e.payload), expectedData3) - - const partialLog3 = log.values.filter(e => e.payload !== 'entryB5').sort(compare) - deepStrictEqual(partialLog3.map(e => e.payload), expectedData4) - }) - - it('sorts deterministically from random order', async () => { - const testLog = await createLogWithSixteenEntries(Log, ipfs, identities) - const log = testLog.log - const expectedData = testLog.expectedData - - const fetchOrder = log.values.slice().sort(compare) - deepStrictEqual(fetchOrder.map(e => e.payload), expectedData) - - let sorted - for (let i = 0; i < 1000; i++) { - const randomOrder = log.values.slice().sort((a, b) => 0.5 - Math.random()) - sorted = randomOrder.sort(compare) - deepStrictEqual(sorted.map(e => e.payload), expectedData) - } - }) - - it('sorts entries correctly', async () => { - const testLog = await createLogWithTwoHundredEntries(Log, ipfs, identities) - const log = testLog.log - const expectedData = testLog.expectedData - deepStrictEqual(log.values.map(e => e.payload), expectedData) - }) - - it('sorts entries according to custom tiebreaker function', async () => { - const testLog = await createLogWithSixteenEntries(Log, ipfs, identities) - - const firstWriteWinsLog = - Log(identities[0], { logId: 'X', sortFn: FirstWriteWins }) - await firstWriteWinsLog.join(testLog.log) - deepStrictEqual(firstWriteWinsLog.values.map(e => e.payload), - firstWriteExpectedData) - }) - - it('throws an error if the tiebreaker returns zero', async () => { - const testLog = await createLogWithSixteenEntries(Log, ipfs, identities) - const firstWriteWinsLog = - Log(identities[0], { logId: 'X', sortFn: BadComparatorReturnsZero }) - await firstWriteWinsLog.join(testLog.log) - throws(() => firstWriteWinsLog.values, Error, 'Error Thrown') - }) - - it('retrieves partially joined log deterministically - single next pointer', async () => { - const nextPointerAmount = 1 +// import { strictEqual, deepStrictEqual, notStrictEqual, throws } from 'assert' +// import rimraf from 'rimraf' +// import { copy } from 'fs-extra' +// import { Log, Entry, Sorting } from '../../src/oplog/index.js' +// import { Identities, KeyStore } from '../../src/index.js' +// import bigLogString from '../fixtures/big-log.fixture.js' +// import LogCreator from './utils/log-creator.js' +// import testKeysPath from '../fixtures/test-keys-path.js ' +// import { config, testAPIs, startIpfs, stopIpfs } from 'orbit-db-test-utils' + +// const { sync: rmrf } = rimraf +// const { LastWriteWins } = Sorting +// const { createIdentity } = Identities +// const { fromJSON, fromEntryHash, fromEntry, fromMultihash: _fromMultihash } = Log +// const { fromMultihash, create, compare } = Entry +// const { createLogWithSixteenEntries, createLogWithTwoHundredEntries } = LogCreator + +// // Alternate tiebreaker. Always does the opposite of LastWriteWins +// const FirstWriteWins = (a, b) => LastWriteWins(a, b) * -1 +// const BadComparatorReturnsZero = (a, b) => 0 + +// let ipfsd, ipfs, testIdentity, testIdentity2, testIdentity3, testIdentity4 + +// const last = (arr) => { +// return arr[arr.length - 1] +// } + +// Object.keys(testAPIs).forEach((IPFS) => { +// describe.skip('Log - Load (' + IPFS + ')', function () { +// this.timeout(config.timeout) + +// const { identityKeyFixtures, signingKeyFixtures, identityKeysPath } = config + +// const firstWriteExpectedData = [ +// 'entryA6', 'entryA7', 'entryA8', 'entryA9', +// 'entryA10', 'entryB1', 'entryB2', 'entryB3', +// 'entryB4', 'entryB5', 'entryA1', 'entryA2', +// 'entryA3', 'entryA4', 'entryA5', 'entryC0' +// ] + +// let keystore + +// before(async () => { +// rmrf(identityKeysPath) + +// await copy(identityKeyFixtures, identityKeysPath) +// await copy(signingKeyFixtures, identityKeysPath) + +// keystore = await KeyStore({ path: testKeysPath }) + +// testIdentity = await createIdentity({ id: 'userC', keystore }) +// testIdentity2 = await createIdentity({ id: 'userB', keystore }) +// testIdentity3 = await createIdentity({ id: 'userD', keystore }) +// testIdentity4 = await createIdentity({ id: 'userA', keystore }) +// ipfsd = await startIpfs(IPFS, config.defaultIpfsConfig) +// ipfs = ipfsd.api +// }) + +// after(async () => { +// await stopIpfs(ipfsd) +// await keystore.close() +// rmrf(identityKeysPath) +// }) + +// describe('fromJSON', async () => { +// let identities + +// before(async () => { +// identities = [testIdentity, testIdentity2, testIdentity3, testIdentity4] +// }) + +// it('creates a log from an entry', async () => { +// const fixture = await createLogWithSixteenEntries(Log, ipfs, identities) +// const data = fixture.log +// const json = fixture.json + +// json.heads = await Promise.all(json.heads.map(headHash => fromMultihash(ipfs, headHash))) + +// const log = await fromJSON(ipfs, testIdentity, json, { logId: 'X' }) + +// strictEqual(log.id, data.heads[0].id) +// strictEqual(log.length, 16) +// deepStrictEqual(log.values.map(e => e.payload), fixture.expectedData) +// }) + +// it('creates a log from an entry with custom tiebreaker', async () => { +// const fixture = await createLogWithSixteenEntries(Log, ipfs, identities) +// const data = fixture.log +// const json = fixture.json + +// json.heads = await Promise.all(json.heads.map(headHash => fromMultihash(ipfs, headHash))) + +// const log = await fromJSON(ipfs, testIdentity, json, +// { length: -1, logId: 'X', sortFn: FirstWriteWins }) + +// strictEqual(log.id, data.heads[0].id) +// strictEqual(log.length, 16) +// deepStrictEqual(log.values.map(e => e.payload), firstWriteExpectedData) +// }) + +// it('respects timeout parameter', async () => { +// const fixture = await createLogWithSixteenEntries(Log, ipfs, identities) +// const json = fixture.json +// json.heads = [{ hash: 'zdpuAwNuRc2Kc1aNDdcdSWuxfNpHRJQw8L8APBNHCEFXbogus' }] + +// const timeout = 500 +// const st = new Date().getTime() +// const log = await fromJSON(ipfs, testIdentity, json, { logId: 'X', timeout }) +// const et = new Date().getTime() +// // Allow for a few millseconds of skew +// strictEqual((et - st) >= (timeout - 10), true, '' + (et - st) + ' should be greater than timeout ' + timeout) +// strictEqual(log.length, 0) +// deepStrictEqual(log.values.map(e => e.payload), []) +// }) +// }) + +// describe('fromEntryHash', () => { +// let identities + +// before(async () => { +// identities = [testIdentity, testIdentity2, testIdentity3, testIdentity4] +// }) + +// it('creates a log from an entry hash', async () => { +// const fixture = await createLogWithSixteenEntries(Log, ipfs, identities) +// const data = fixture.log +// const json = fixture.json + +// const log1 = await fromEntryHash(ipfs, testIdentity, json.heads[0], +// { logId: 'X' }) +// const log2 = await fromEntryHash(ipfs, testIdentity, json.heads[1], +// { logId: 'X' }) + +// await log1.join(log2) + +// strictEqual(log1.id, data.heads[0].id) +// strictEqual(log1.length, 16) +// deepStrictEqual(log1.values.map(e => e.payload), fixture.expectedData) +// }) + +// it('creates a log from an entry hash with custom tiebreaker', async () => { +// const fixture = await createLogWithSixteenEntries(Log, ipfs, identities) +// const data = fixture.log +// const json = fixture.json +// const log1 = await fromEntryHash(ipfs, testIdentity, json.heads[0], +// { logId: 'X', sortFn: FirstWriteWins }) +// const log2 = await fromEntryHash(ipfs, testIdentity, json.heads[1], +// { logId: 'X', sortFn: FirstWriteWins }) + +// await log1.join(log2) + +// strictEqual(log1.id, data.heads[0].id) +// strictEqual(log1.length, 16) +// deepStrictEqual(log1.values.map(e => e.payload), firstWriteExpectedData) +// }) + +// it('respects timeout parameter', async () => { +// const timeout = 500 +// const st = new Date().getTime() +// const log = await fromEntryHash(ipfs, testIdentity, 'zdpuAwNuRc2Kc1aNDdcdSWuxfNpHRJQw8L8APBNHCEFXbogus', { logId: 'X', timeout }) +// const et = new Date().getTime() +// strictEqual((et - st) >= timeout, true, '' + (et - st) + ' should be greater than timeout ' + timeout) +// strictEqual(log.length, 0) +// deepStrictEqual(log.values.map(e => e.payload), []) +// }) +// }) + +// describe('fromEntry', () => { +// let identities + +// before(async () => { +// identities = [testIdentity3, testIdentity2, testIdentity, testIdentity4] +// }) + +// it('creates a log from an entry', async () => { +// const fixture = await createLogWithSixteenEntries(Log, ipfs, identities) +// const data = fixture.log + +// const log = await fromEntry(ipfs, testIdentity, data.heads, { length: -1 }) +// strictEqual(log.id, data.heads[0].id) +// strictEqual(log.length, 16) +// deepStrictEqual(log.values.map(e => e.payload), fixture.expectedData) +// }) + +// it('creates a log from an entry with custom tiebreaker', async () => { +// const fixture = await createLogWithSixteenEntries(Log, ipfs, identities) +// const data = fixture.log + +// const log = await fromEntry(ipfs, testIdentity, data.heads, +// { length: -1, sortFn: FirstWriteWins }) +// strictEqual(log.id, data.heads[0].id) +// strictEqual(log.length, 16) +// deepStrictEqual(log.values.map(e => e.payload), firstWriteExpectedData) +// }) + +// it('keeps the original heads', async () => { +// const fixture = await createLogWithSixteenEntries(Log, ipfs, identities) +// const data = fixture.log + +// const log1 = await fromEntry(ipfs, testIdentity, data.heads, +// { length: data.heads.length }) +// strictEqual(log1.id, data.heads[0].id) +// strictEqual(log1.length, data.heads.length) +// strictEqual(log1.values[0].payload, 'entryC0') +// strictEqual(log1.values[1].payload, 'entryA10') + +// const log2 = await fromEntry(ipfs, testIdentity, data.heads, { length: 4 }) +// strictEqual(log2.id, data.heads[0].id) +// strictEqual(log2.length, 4) +// strictEqual(log2.values[0].payload, 'entryC0') +// strictEqual(log2.values[1].payload, 'entryA8') +// strictEqual(log2.values[2].payload, 'entryA9') +// strictEqual(log2.values[3].payload, 'entryA10') + +// const log3 = await fromEntry(ipfs, testIdentity, data.heads, { length: 7 }) +// strictEqual(log3.id, data.heads[0].id) +// strictEqual(log3.length, 7) +// strictEqual(log3.values[0].payload, 'entryB5') +// strictEqual(log3.values[1].payload, 'entryA6') +// strictEqual(log3.values[2].payload, 'entryC0') +// strictEqual(log3.values[3].payload, 'entryA7') +// strictEqual(log3.values[4].payload, 'entryA8') +// strictEqual(log3.values[5].payload, 'entryA9') +// strictEqual(log3.values[6].payload, 'entryA10') +// }) + +// it('onProgress callback is fired for each entry', async () => { +// const items1 = [] +// const amount = 100 +// for (let i = 1; i <= amount; i++) { +// const prev1 = last(items1) +// const n1 = await create(ipfs, testIdentity, 'A', 'entryA' + i, [prev1]) +// items1.push(n1) +// } + +// let i = 0 +// const callback = (entry) => { +// notStrictEqual(entry, null) +// strictEqual(entry.hash, items1[items1.length - i - 1].hash) +// strictEqual(entry.payload, items1[items1.length - i - 1].payload) +// i++ +// } + +// await fromEntry(ipfs, testIdentity, last(items1), +// { length: -1, exclude: [], onProgressCallback: callback }) +// }) + +// it('retrieves partial log from an entry hash', async () => { +// const log1 = await Log(testIdentity, { logId: 'X' }) +// const log2 = await Log(testIdentity2, { logId: 'X' }) +// const log3 = await Log(testIdentity3, { logId: 'X' }) +// const items1 = [] +// const items2 = [] +// const items3 = [] +// const amount = 100 +// for (let i = 1; i <= amount; i++) { +// const prev1 = last(items1) +// const prev2 = last(items2) +// const prev3 = last(items3) +// const n1 = await create(ipfs, log1._identity, 'X', 'entryA' + i, [prev1]) +// const n2 = await create(ipfs, log2._identity, 'X', 'entryB' + i, [prev2, n1]) +// const n3 = await create(ipfs, log3._identity, 'X', 'entryC' + i, [prev3, n1, n2]) +// items1.push(n1) +// items2.push(n2) +// items3.push(n3) +// } + +// // limit to 10 entries +// const a = await fromEntry(ipfs, testIdentity, last(items1), { length: 10 }) +// strictEqual(a.length, 10) + +// // limit to 42 entries +// const b = await fromEntry(ipfs, testIdentity, last(items1), { length: 42 }) +// strictEqual(b.length, 42) +// }) + +// it('throws an error if trying to create a log from a hash of an entry', async () => { +// const items1 = [] +// const amount = 5 +// for (let i = 1; i <= amount; i++) { +// const prev1 = last(items1) +// const n1 = await create(ipfs, testIdentity, 'A', 'entryA' + i, [prev1]) +// items1.push(n1) +// } + +// let err +// try { +// await fromEntry(ipfs, testIdentity, last(items1).hash, { length: 1 }) +// } catch (e) { +// err = e +// } +// strictEqual(err.message, '\'sourceEntries\' argument must be an array of Entry instances or a single Entry') +// }) + +// it('retrieves full log from an entry hash', async () => { +// const log1 = await Log(testIdentity, { logId: 'X' }) +// const log2 = await Log(testIdentity2, { logId: 'X' }) +// const log3 = await Log(testIdentity3, { logId: 'X' }) +// const items1 = [] +// const items2 = [] +// const items3 = [] +// const amount = 10 +// for (let i = 1; i <= amount; i++) { +// const prev1 = last(items1) +// const prev2 = last(items2) +// const prev3 = last(items3) +// const n1 = await create(ipfs, log1._identity, 'X', 'entryA' + i, [prev1]) +// const n2 = await create(ipfs, log2._identity, 'X', 'entryB' + i, [prev2, n1]) +// const n3 = await create(ipfs, log3._identity, 'X', 'entryC' + i, [prev3, n2]) +// items1.push(n1) +// items2.push(n2) +// items3.push(n3) +// } + +// const a = await fromEntry(ipfs, testIdentity, [last(items1)], +// { length: amount }) +// strictEqual(a.length, amount) + +// const b = await fromEntry(ipfs, testIdentity2, [last(items2)], +// { length: amount * 2 }) +// strictEqual(b.length, amount * 2) + +// const c = await fromEntry(ipfs, testIdentity3, [last(items3)], +// { length: amount * 3 }) +// strictEqual(c.length, amount * 3) +// }) + +// it('retrieves full log from an entry hash 2', async () => { +// const log1 = await Log(testIdentity, { logId: 'X' }) +// const log2 = await Log(testIdentity2, { logId: 'X' }) +// const log3 = await Log(testIdentity3, { logId: 'X' }) +// const items1 = [] +// const items2 = [] +// const items3 = [] +// const amount = 10 +// for (let i = 1; i <= amount; i++) { +// const prev1 = last(items1) +// const prev2 = last(items2) +// const prev3 = last(items3) +// const n1 = await create(ipfs, log1._identity, 'X', 'entryA' + i, [prev1]) +// const n2 = await create(ipfs, log2._identity, 'X', 'entryB' + i, [prev2, n1]) +// const n3 = await create(ipfs, log3._identity, 'X', 'entryC' + i, [prev3, n1, n2]) +// items1.push(n1) +// items2.push(n2) +// items3.push(n3) +// } + +// const a = await fromEntry(ipfs, testIdentity, last(items1), +// { length: amount }) +// strictEqual(a.length, amount) + +// const b = await fromEntry(ipfs, testIdentity2, last(items2), +// { length: amount * 2 }) +// strictEqual(b.length, amount * 2) + +// const c = await fromEntry(ipfs, testIdentity3, last(items3), +// { length: amount * 3 }) +// strictEqual(c.length, amount * 3) +// }) + +// it('retrieves full log from an entry hash 3', async () => { +// const log1 = await Log(testIdentity, { logId: 'X' }) +// const log2 = await Log(testIdentity2, { logId: 'X' }) +// const log3 = await Log(testIdentity4, { logId: 'X' }) +// const items1 = [] +// const items2 = [] +// const items3 = [] +// const amount = 10 +// for (let i = 1; i <= amount; i++) { +// const prev1 = last(items1) +// const prev2 = last(items2) +// const prev3 = last(items3) +// log1.clock().tick() +// log2.clock().tick() +// log3.clock().tick() +// const n1 = await create(ipfs, log1._identity, 'X', 'entryA' + i, [prev1], log1.clock()) +// const n2 = await create(ipfs, log2._identity, 'X', 'entryB' + i, [prev2, n1], log2.clock()) +// const n3 = await create(ipfs, log3._identity, 'X', 'entryC' + i, [prev3, n1, n2], log3.clock()) +// log1.clock().merge(log2.clock()) +// log1.clock().merge(log3.clock()) +// log2.clock().merge(log1.clock()) +// log2.clock().merge(log3.clock()) +// log3.clock().merge(log1.clock()) +// log3.clock().merge(log2.clock()) +// items1.push(n1) +// items2.push(n2) +// items3.push(n3) +// } + +// const a = await fromEntry(ipfs, testIdentity, last(items1), +// { length: amount }) +// strictEqual(a.length, amount) + +// const itemsInB = [ +// 'entryA1', +// 'entryB1', +// 'entryA2', +// 'entryB2', +// 'entryA3', +// 'entryB3', +// 'entryA4', +// 'entryB4', +// 'entryA5', +// 'entryB5', +// 'entryA6', +// 'entryB6', +// 'entryA7', +// 'entryB7', +// 'entryA8', +// 'entryB8', +// 'entryA9', +// 'entryB9', +// 'entryA10', +// 'entryB10' +// ] + +// const b = await fromEntry(ipfs, testIdentity2, last(items2), +// { length: amount * 2 }) +// strictEqual(b.length, amount * 2) +// deepStrictEqual(b.values.map((e) => e.payload), itemsInB) + +// const c = await fromEntry(ipfs, testIdentity4, last(items3), +// { length: amount * 3 }) +// await c.append('EOF') +// strictEqual(c.length, amount * 3 + 1) + +// const tmp = [ +// 'entryA1', +// 'entryB1', +// 'entryC1', +// 'entryA2', +// 'entryB2', +// 'entryC2', +// 'entryA3', +// 'entryB3', +// 'entryC3', +// 'entryA4', +// 'entryB4', +// 'entryC4', +// 'entryA5', +// 'entryB5', +// 'entryC5', +// 'entryA6', +// 'entryB6', +// 'entryC6', +// 'entryA7', +// 'entryB7', +// 'entryC7', +// 'entryA8', +// 'entryB8', +// 'entryC8', +// 'entryA9', +// 'entryB9', +// 'entryC9', +// 'entryA10', +// 'entryB10', +// 'entryC10', +// 'EOF' +// ] +// deepStrictEqual(c.values.map(e => e.payload), tmp) + +// // make sure logX comes after A, B and C +// const logX = await Log(testIdentity4, { logId: 'X' }) +// await logX.append('1') +// await logX.append('2') +// await logX.append('3') +// const d = await fromEntry(ipfs, testIdentity3, last(logX.values), +// { length: -1 }) + +// await c.join(d) +// await d.join(c) + +// await c.append('DONE') +// await d.append('DONE') +// const f = await fromEntry(ipfs, testIdentity3, last(c.values), +// { amount: -1, exclude: [] }) +// const g = await fromEntry(ipfs, testIdentity3, last(d.values), +// { length: -1, exclude: [] }) + +// strictEqual(f.toString(), bigLogString) +// strictEqual(g.toString(), bigLogString) +// }) + +// it('retrieves full log of randomly joined log', async () => { +// const log1 = await Log(testIdentity, { logId: 'X' }) +// const log2 = await Log(testIdentity3, { logId: 'X' }) +// const log3 = await Log(testIdentity4, { logId: 'X' }) + +// for (let i = 1; i <= 5; i++) { +// await log1.append('entryA' + i) +// } + +// for (let i = 1; i <= 5; i++) { +// await log2.append('entryB' + i) +// } + +// await log3.join(log1) +// await log3.join(log2) + +// for (let i = 6; i <= 10; i++) { +// await log1.append('entryA' + i) +// } + +// await log1.join(log3) + +// for (let i = 11; i <= 15; i++) { +// await log1.append('entryA' + i) +// } + +// const expectedData = [ +// 'entryA1', 'entryB1', 'entryA2', 'entryB2', +// 'entryA3', 'entryB3', 'entryA4', 'entryB4', +// 'entryA5', 'entryB5', +// 'entryA6', 'entryA7', 'entryA8', 'entryA9', 'entryA10', +// 'entryA11', 'entryA12', 'entryA13', 'entryA14', 'entryA15' +// ] + +// deepStrictEqual(log1.values.map(e => e.payload), expectedData) +// }) + +// it('retrieves randomly joined log deterministically', async () => { +// const logA = await Log(testIdentity, { logId: 'X' }) +// const logB = await Log(testIdentity3, { logId: 'X' }) +// const log3 = await Log(testIdentity4, { logId: 'X' }) +// const log = await Log(testIdentity2, { logId: 'X' }) + +// for (let i = 1; i <= 5; i++) { +// await logA.append('entryA' + i) +// } + +// for (let i = 1; i <= 5; i++) { +// await logB.append('entryB' + i) +// } + +// await log3.join(logA) +// await log3.join(logB) + +// for (let i = 6; i <= 10; i++) { +// await logA.append('entryA' + i) +// } + +// await log.join(log3) +// await log.append('entryC0') +// await log.join(logA, 16) + +// const expectedData = [ +// 'entryA1', 'entryB1', 'entryA2', 'entryB2', +// 'entryA3', 'entryB3', 'entryA4', 'entryB4', +// 'entryA5', 'entryB5', +// 'entryA6', +// 'entryC0', 'entryA7', 'entryA8', 'entryA9', 'entryA10' +// ] + +// deepStrictEqual(log.values.map(e => e.payload), expectedData) +// }) + +// it('sorts', async () => { +// const testLog = await createLogWithSixteenEntries(Log, ipfs, identities) +// const log = testLog.log +// const expectedData = testLog.expectedData + +// const expectedData2 = [ +// 'entryA1', 'entryB1', 'entryA2', 'entryB2', +// 'entryA3', 'entryB3', 'entryA4', 'entryB4', +// 'entryA5', 'entryB5', +// 'entryA6', 'entryA7', 'entryA8', 'entryA9', 'entryA10' +// ] + +// const expectedData3 = [ +// 'entryA1', 'entryB1', 'entryA2', 'entryB2', +// 'entryA3', 'entryB3', 'entryA4', 'entryB4', +// 'entryA5', 'entryB5', 'entryA6', 'entryC0', +// 'entryA7', 'entryA8', 'entryA9' +// ] + +// const expectedData4 = [ +// 'entryA1', 'entryB1', 'entryA2', 'entryB2', +// 'entryA3', 'entryB3', 'entryA4', 'entryB4', +// 'entryA5', 'entryA6', 'entryC0', 'entryA7', +// 'entryA8', 'entryA9', 'entryA10' +// ] + +// const fetchOrder = log.values.slice().sort(compare) +// deepStrictEqual(fetchOrder.map(e => e.payload), expectedData) + +// const reverseOrder = log.values.slice().reverse().sort(compare) +// deepStrictEqual(fetchOrder, reverseOrder) + +// const hashOrder = log.values.slice().sort((a, b) => a.hash > b.hash).sort(compare) +// deepStrictEqual(fetchOrder, hashOrder) + +// const randomOrder2 = log.values.slice().sort((a, b) => 0.5 - Math.random()).sort(compare) +// deepStrictEqual(fetchOrder, randomOrder2) + +// // partial data +// const partialLog = log.values.filter(e => e.payload !== 'entryC0').sort(compare) +// deepStrictEqual(partialLog.map(e => e.payload), expectedData2) + +// const partialLog2 = log.values.filter(e => e.payload !== 'entryA10').sort(compare) +// deepStrictEqual(partialLog2.map(e => e.payload), expectedData3) + +// const partialLog3 = log.values.filter(e => e.payload !== 'entryB5').sort(compare) +// deepStrictEqual(partialLog3.map(e => e.payload), expectedData4) +// }) + +// it('sorts deterministically from random order', async () => { +// const testLog = await createLogWithSixteenEntries(Log, ipfs, identities) +// const log = testLog.log +// const expectedData = testLog.expectedData + +// const fetchOrder = log.values.slice().sort(compare) +// deepStrictEqual(fetchOrder.map(e => e.payload), expectedData) + +// let sorted +// for (let i = 0; i < 1000; i++) { +// const randomOrder = log.values.slice().sort((a, b) => 0.5 - Math.random()) +// sorted = randomOrder.sort(compare) +// deepStrictEqual(sorted.map(e => e.payload), expectedData) +// } +// }) + +// it('sorts entries correctly', async () => { +// const testLog = await createLogWithTwoHundredEntries(Log, ipfs, identities) +// const log = testLog.log +// const expectedData = testLog.expectedData +// deepStrictEqual(log.values.map(e => e.payload), expectedData) +// }) + +// it('sorts entries according to custom tiebreaker function', async () => { +// const testLog = await createLogWithSixteenEntries(Log, ipfs, identities) + +// const firstWriteWinsLog = +// Log(identities[0], { logId: 'X', sortFn: FirstWriteWins }) +// await firstWriteWinsLog.join(testLog.log) +// deepStrictEqual(firstWriteWinsLog.values.map(e => e.payload), +// firstWriteExpectedData) +// }) + +// it('throws an error if the tiebreaker returns zero', async () => { +// const testLog = await createLogWithSixteenEntries(Log, ipfs, identities) +// const firstWriteWinsLog = +// Log(identities[0], { logId: 'X', sortFn: BadComparatorReturnsZero }) +// await firstWriteWinsLog.join(testLog.log) +// throws(() => firstWriteWinsLog.values, Error, 'Error Thrown') +// }) + +// it('retrieves partially joined log deterministically - single next pointer', async () => { +// const nextPointerAmount = 1 - const logA = await Log(testIdentity, { logId: 'X' }) - const logB = await Log(testIdentity3, { logId: 'X' }) - const log3 = await Log(testIdentity4, { logId: 'X' }) - const log = await Log(testIdentity2, { logId: 'X' }) +// const logA = await Log(testIdentity, { logId: 'X' }) +// const logB = await Log(testIdentity3, { logId: 'X' }) +// const log3 = await Log(testIdentity4, { logId: 'X' }) +// const log = await Log(testIdentity2, { logId: 'X' }) - for (let i = 1; i <= 5; i++) { - await logA.append('entryA' + i, nextPointerAmount) - } - - for (let i = 1; i <= 5; i++) { - await logB.append('entryB' + i, nextPointerAmount) - } +// for (let i = 1; i <= 5; i++) { +// await logA.append('entryA' + i, nextPointerAmount) +// } + +// for (let i = 1; i <= 5; i++) { +// await logB.append('entryB' + i, nextPointerAmount) +// } - await log3.join(logA) - await log3.join(logB) +// await log3.join(logA) +// await log3.join(logB) - for (let i = 6; i <= 10; i++) { - await logA.append('entryA' + i, nextPointerAmount) - } +// for (let i = 6; i <= 10; i++) { +// await logA.append('entryA' + i, nextPointerAmount) +// } - await log.join(log3) - await log.append('entryC0', nextPointerAmount) +// await log.join(log3) +// await log.append('entryC0', nextPointerAmount) - await log.join(logA) +// await log.join(logA) - const hash = await log.toMultihash() +// const hash = await log.toMultihash() - // First 5 - let res = await _fromMultihash(ipfs, testIdentity2, hash, { length: 5 }) +// // First 5 +// let res = await _fromMultihash(ipfs, testIdentity2, hash, { length: 5 }) - const first5 = [ - 'entryC0', 'entryA7', 'entryA8', 'entryA9', 'entryA10' - ] +// const first5 = [ +// 'entryC0', 'entryA7', 'entryA8', 'entryA9', 'entryA10' +// ] - deepStrictEqual(res.values.map(e => e.payload), first5) +// deepStrictEqual(res.values.map(e => e.payload), first5) - // First 11 - res = await _fromMultihash(ipfs, testIdentity2, hash, { length: 11 }) +// // First 11 +// res = await _fromMultihash(ipfs, testIdentity2, hash, { length: 11 }) - const first11 = [ - 'entryB3', 'entryA4', 'entryB4', - 'entryA5', 'entryB5', - 'entryA6', - 'entryC0', 'entryA7', 'entryA8', 'entryA9', 'entryA10' - ] - - deepStrictEqual(res.values.map(e => e.payload), first11) - - // All but one - res = await _fromMultihash(ipfs, testIdentity2, hash, { length: 16 - 1 }) - - const all = [ - /* excl */ 'entryB1', 'entryA2', 'entryB2', 'entryA3', 'entryB3', - 'entryA4', 'entryB4', 'entryA5', 'entryB5', - 'entryA6', - 'entryC0', 'entryA7', 'entryA8', 'entryA9', 'entryA10' - ] - - deepStrictEqual(res.values.map(e => e.payload), all) - }) - - it('retrieves partially joined log deterministically - multiple next pointers', async () => { - const nextPointersAmount = 64 - - const logA = await Log(testIdentity, { logId: 'X' }) - const logB = await Log(testIdentity3, { logId: 'X' }) - const log3 = await Log(testIdentity4, { logId: 'X' }) - const log = await Log(testIdentity2, { logId: 'X' }) - - for (let i = 1; i <= 5; i++) { - await logA.append('entryA' + i, nextPointersAmount) - } - - for (let i = 1; i <= 5; i++) { - await logB.append('entryB' + i, nextPointersAmount) - } - - await log3.join(logA) - await log3.join(logB) - - for (let i = 6; i <= 10; i++) { - await logA.append('entryA' + i, nextPointersAmount) - } - - await log.join(log3) - await log.append('entryC0', nextPointersAmount) - - await log.join(logA) - - const hash = await log.toMultihash() - - // First 5 - let res = await _fromMultihash(ipfs, testIdentity2, hash, { length: 5 }) - - const first5 = [ - 'entryC0', 'entryA7', 'entryA8', 'entryA9', 'entryA10' - ] - - deepStrictEqual(res.values.map(e => e.payload), first5) - - // First 11 - res = await _fromMultihash(ipfs, testIdentity2, hash, { length: 11 }) - - const first11 = [ - 'entryB3', 'entryA4', 'entryB4', 'entryA5', - 'entryB5', 'entryA6', - 'entryC0', - 'entryA7', 'entryA8', 'entryA9', 'entryA10' - ] - - deepStrictEqual(res.values.map(e => e.payload), first11) - - // All but one - res = await _fromMultihash(ipfs, testIdentity2, hash, { length: 16 - 1 }) - - const all = [ - /* excl */ 'entryB1', 'entryA2', 'entryB2', 'entryA3', 'entryB3', - 'entryA4', 'entryB4', 'entryA5', 'entryB5', - 'entryA6', - 'entryC0', 'entryA7', 'entryA8', 'entryA9', 'entryA10' - ] - - deepStrictEqual(res.values.map(e => e.payload), all) - }) - - it('throws an error if ipfs is not defined', async () => { - let err - try { - await fromEntry() - } catch (e) { - err = e - } - notStrictEqual(err, null) - strictEqual(err.message, 'IPFS instance not defined') - }) - - describe('fetches a log', () => { - const amount = 100 - let items1 = [] - let items2 = [] - let items3 = [] - let log1, log2, log3 - - beforeEach(async () => { - const ts = new Date().getTime() - log1 = await Log(testIdentity, { logId: 'X' }) - log2 = await Log(testIdentity2, { logId: 'X' }) - log3 = await Log(testIdentity3, { logId: 'X' }) - items1 = [] - items2 = [] - items3 = [] - for (let i = 1; i <= amount; i++) { - const prev1 = last(items1) - const prev2 = last(items2) - const prev3 = last(items3) - const n1 = await create(ipfs, log1._identity, log1.id, 'entryA' + i + '-' + ts, [prev1], log1.clock()) - const n2 = await create(ipfs, log2._identity, log2.id, 'entryB' + i + '-' + ts, [prev2, n1], log2.clock()) - const n3 = await create(ipfs, log3._identity, log3.id, 'entryC' + i + '-' + ts, [prev3, n1, n2], log3.clock()) - log1.clock().tick() - log2.clock().tick() - log3.clock().tick() - log1.clock().merge(log2.clock()) - log1.clock().merge(log3.clock()) - log2.clock().merge(log1.clock()) - log2.clock().merge(log3.clock()) - log3.clock().merge(log1.clock()) - log3.clock().merge(log2.clock()) - items1.push(n1) - items2.push(n2) - items3.push(n3) - } - }) - - it('returns all entries - no excluded entries', async () => { - const a = await fromEntry(ipfs, testIdentity, last(items1), - { length: -1 }) - strictEqual(a.length, amount) - strictEqual(a.values[0].hash, items1[0].hash) - }) - - it('returns all entries - including excluded entries', async () => { - // One entry - const a = await fromEntry(ipfs, testIdentity, last(items1), - { length: -1, exclude: [items1[0]] }) - strictEqual(a.length, amount) - strictEqual(a.values[0].hash, items1[0].hash) - - // All entries - const b = await fromEntry(ipfs, testIdentity, last(items1), - { length: -1, exclude: items1 }) - strictEqual(b.length, amount) - strictEqual(b.values[0].hash, items1[0].hash) - }) - - it('respects timeout parameter', async () => { - const e = last(items1) - e.hash = 'zdpuAwNuRc2Kc1aNDdcdSWuxfNpHRJQw8L8APBNHCEFXbogus' - const timeout = 500 - const st = new Date().getTime() - const log = await fromEntry(ipfs, testIdentity, e, { timeout }) - const et = new Date().getTime() - strictEqual((et - st) >= (timeout - 10), true, '' + (et - st) + ' should be greater than timeout ' + timeout) - strictEqual(log.length, 1) - deepStrictEqual(log.values.map(e => e.payload), [e.payload]) - }) - }) - }) - }) -}) +// const first11 = [ +// 'entryB3', 'entryA4', 'entryB4', +// 'entryA5', 'entryB5', +// 'entryA6', +// 'entryC0', 'entryA7', 'entryA8', 'entryA9', 'entryA10' +// ] + +// deepStrictEqual(res.values.map(e => e.payload), first11) + +// // All but one +// res = await _fromMultihash(ipfs, testIdentity2, hash, { length: 16 - 1 }) + +// const all = [ +// /* excl */ 'entryB1', 'entryA2', 'entryB2', 'entryA3', 'entryB3', +// 'entryA4', 'entryB4', 'entryA5', 'entryB5', +// 'entryA6', +// 'entryC0', 'entryA7', 'entryA8', 'entryA9', 'entryA10' +// ] + +// deepStrictEqual(res.values.map(e => e.payload), all) +// }) + +// it('retrieves partially joined log deterministically - multiple next pointers', async () => { +// const nextPointersAmount = 64 + +// const logA = await Log(testIdentity, { logId: 'X' }) +// const logB = await Log(testIdentity3, { logId: 'X' }) +// const log3 = await Log(testIdentity4, { logId: 'X' }) +// const log = await Log(testIdentity2, { logId: 'X' }) + +// for (let i = 1; i <= 5; i++) { +// await logA.append('entryA' + i, nextPointersAmount) +// } + +// for (let i = 1; i <= 5; i++) { +// await logB.append('entryB' + i, nextPointersAmount) +// } + +// await log3.join(logA) +// await log3.join(logB) + +// for (let i = 6; i <= 10; i++) { +// await logA.append('entryA' + i, nextPointersAmount) +// } + +// await log.join(log3) +// await log.append('entryC0', nextPointersAmount) + +// await log.join(logA) + +// const hash = await log.toMultihash() + +// // First 5 +// let res = await _fromMultihash(ipfs, testIdentity2, hash, { length: 5 }) + +// const first5 = [ +// 'entryC0', 'entryA7', 'entryA8', 'entryA9', 'entryA10' +// ] + +// deepStrictEqual(res.values.map(e => e.payload), first5) + +// // First 11 +// res = await _fromMultihash(ipfs, testIdentity2, hash, { length: 11 }) + +// const first11 = [ +// 'entryB3', 'entryA4', 'entryB4', 'entryA5', +// 'entryB5', 'entryA6', +// 'entryC0', +// 'entryA7', 'entryA8', 'entryA9', 'entryA10' +// ] + +// deepStrictEqual(res.values.map(e => e.payload), first11) + +// // All but one +// res = await _fromMultihash(ipfs, testIdentity2, hash, { length: 16 - 1 }) + +// const all = [ +// /* excl */ 'entryB1', 'entryA2', 'entryB2', 'entryA3', 'entryB3', +// 'entryA4', 'entryB4', 'entryA5', 'entryB5', +// 'entryA6', +// 'entryC0', 'entryA7', 'entryA8', 'entryA9', 'entryA10' +// ] + +// deepStrictEqual(res.values.map(e => e.payload), all) +// }) + +// it('throws an error if ipfs is not defined', async () => { +// let err +// try { +// await fromEntry() +// } catch (e) { +// err = e +// } +// notStrictEqual(err, null) +// strictEqual(err.message, 'IPFS instance not defined') +// }) + +// describe('fetches a log', () => { +// const amount = 100 +// let items1 = [] +// let items2 = [] +// let items3 = [] +// let log1, log2, log3 + +// beforeEach(async () => { +// const ts = new Date().getTime() +// log1 = await Log(testIdentity, { logId: 'X' }) +// log2 = await Log(testIdentity2, { logId: 'X' }) +// log3 = await Log(testIdentity3, { logId: 'X' }) +// items1 = [] +// items2 = [] +// items3 = [] +// for (let i = 1; i <= amount; i++) { +// const prev1 = last(items1) +// const prev2 = last(items2) +// const prev3 = last(items3) +// const n1 = await create(ipfs, log1._identity, log1.id, 'entryA' + i + '-' + ts, [prev1], log1.clock()) +// const n2 = await create(ipfs, log2._identity, log2.id, 'entryB' + i + '-' + ts, [prev2, n1], log2.clock()) +// const n3 = await create(ipfs, log3._identity, log3.id, 'entryC' + i + '-' + ts, [prev3, n1, n2], log3.clock()) +// log1.clock().tick() +// log2.clock().tick() +// log3.clock().tick() +// log1.clock().merge(log2.clock()) +// log1.clock().merge(log3.clock()) +// log2.clock().merge(log1.clock()) +// log2.clock().merge(log3.clock()) +// log3.clock().merge(log1.clock()) +// log3.clock().merge(log2.clock()) +// items1.push(n1) +// items2.push(n2) +// items3.push(n3) +// } +// }) + +// it('returns all entries - no excluded entries', async () => { +// const a = await fromEntry(ipfs, testIdentity, last(items1), +// { length: -1 }) +// strictEqual(a.length, amount) +// strictEqual(a.values[0].hash, items1[0].hash) +// }) + +// it('returns all entries - including excluded entries', async () => { +// // One entry +// const a = await fromEntry(ipfs, testIdentity, last(items1), +// { length: -1, exclude: [items1[0]] }) +// strictEqual(a.length, amount) +// strictEqual(a.values[0].hash, items1[0].hash) + +// // All entries +// const b = await fromEntry(ipfs, testIdentity, last(items1), +// { length: -1, exclude: items1 }) +// strictEqual(b.length, amount) +// strictEqual(b.values[0].hash, items1[0].hash) +// }) + +// it('respects timeout parameter', async () => { +// const e = last(items1) +// e.hash = 'zdpuAwNuRc2Kc1aNDdcdSWuxfNpHRJQw8L8APBNHCEFXbogus' +// const timeout = 500 +// const st = new Date().getTime() +// const log = await fromEntry(ipfs, testIdentity, e, { timeout }) +// const et = new Date().getTime() +// strictEqual((et - st) >= (timeout - 10), true, '' + (et - st) + ' should be greater than timeout ' + timeout) +// strictEqual(log.length, 1) +// deepStrictEqual(log.values.map(e => e.payload), [e.payload]) +// }) +// }) +// }) +// }) +// }) diff --git a/test/oplog/replicate.test.js b/test/oplog/replicate.test.js index e960dc0..047b459 100644 --- a/test/oplog/replicate.test.js +++ b/test/oplog/replicate.test.js @@ -1,17 +1,19 @@ import { strictEqual } from 'assert' import rmrf from 'rimraf' import { copy } from 'fs-extra' +import * as IPFS from 'ipfs' import { Log, Entry, Identities, KeyStore, IPFSBlockStorage } from '../../src/index.js' -import { config, startIpfs, stopIpfs, getIpfsPeerId, waitForPeers, connectPeers } from 'orbit-db-test-utils' +import config from '../config.js' import testKeysPath from '../fixtures/test-keys-path.js ' +import connectPeers from '../utils/connect-nodes.js' +import getIpfsPeerId from '../utils/get-ipfs-peer-id.js' +import waitForPeers from '../utils/wait-for-peers.js' const keysPath = './testkeys' -const IPFS = 'js-ipfs' describe('Log - Replication', function () { this.timeout(60000) - let ipfsd1, ipfsd2 let ipfs1, ipfs2 let id1, id2 let keystore @@ -20,11 +22,8 @@ describe('Log - Replication', function () { let storage1, storage2 before(async () => { - ipfsd1 = await startIpfs(IPFS, config.daemon1) - ipfsd2 = await startIpfs(IPFS, config.daemon2) - ipfs1 = ipfsd1.api - ipfs2 = ipfsd2.api - + ipfs1 = await IPFS.create({ ...config.daemon1, repo: './ipfs1' }) + ipfs2 = await IPFS.create({ ...config.daemon2, repo: './ipfs2' }) await connectPeers(ipfs1, ipfs2) id1 = await getIpfsPeerId(ipfs1) @@ -43,14 +42,24 @@ describe('Log - Replication', function () { }) after(async () => { - await stopIpfs(ipfsd1) - await stopIpfs(ipfsd2) + if (ipfs1) { + await ipfs1.stop() + } + + if (ipfs2) { + await ipfs2.stop() + } + if (keystore) { await keystore.close() } + await storage1.close() await storage2.close() + await rmrf(keysPath) + await rmrf('./ipfs1') + await rmrf('./ipfs2') }) describe('replicates logs deterministically', async function () { diff --git a/test/orbitdb-open.test.js b/test/orbitdb-open.test.js index 49f3edd..9a1d342 100644 --- a/test/orbitdb-open.test.js +++ b/test/orbitdb-open.test.js @@ -2,40 +2,36 @@ import { deepStrictEqual, strictEqual, notStrictEqual } from 'assert' import rmrf from 'rimraf' import fs from 'fs' import path from 'path' +import * as IPFS from 'ipfs' import { OrbitDB, isValidAddress } from '../src/index.js' import { KeyValuePersisted } from '../src/db/index.js' -import { config, startIpfs, stopIpfs } from 'orbit-db-test-utils' +import config from './config.js' import connectPeers from './utils/connect-nodes.js' import waitFor from './utils/wait-for.js' -const IPFS = 'js-ipfs' - describe('Open databases', function () { this.timeout(5000) - let ipfsd1, ipfsd2 let ipfs1, ipfs2 let orbitdb1, orbitdb2 before(async () => { - ipfsd1 = await startIpfs(IPFS, config.daemon1) - ipfsd2 = await startIpfs(IPFS, config.daemon2) - ipfs1 = ipfsd1.api - ipfs2 = ipfsd2.api - + ipfs1 = await IPFS.create({ ...config.daemon1, repo: './ipfs1' }) + ipfs2 = await IPFS.create({ ...config.daemon2, repo: './ipfs2' }) await connectPeers(ipfs1, ipfs2) }) after(async () => { - if (ipfsd1) { - await stopIpfs(ipfsd1) + if (ipfs1) { + await ipfs1.stop() } - if (ipfsd2) { - await stopIpfs(ipfsd2) + if (ipfs2) { + await ipfs2.stop() } - await rmrf('./orbitdb1') await rmrf('./orbitdb2') + await rmrf('./ipfs1') + await rmrf('./ipfs2') }) describe('creating a database instance', () => { diff --git a/test/orbitdb-replication.test.js b/test/orbitdb-replication.test.js index e2acd2b..211c2ea 100644 --- a/test/orbitdb-replication.test.js +++ b/test/orbitdb-replication.test.js @@ -1,36 +1,34 @@ import { strictEqual, deepStrictEqual } from 'assert' import rmrf from 'rimraf' +import * as IPFS from 'ipfs' import { OrbitDB } from '../src/index.js' -import { config, startIpfs, stopIpfs } from 'orbit-db-test-utils' +import config from './config.js' import connectPeers from './utils/connect-nodes.js' import waitFor from './utils/wait-for.js' -const IPFS = 'js-ipfs' - describe('Replicating databases', function () { this.timeout(60000) - let ipfsd1, ipfsd2 let ipfs1, ipfs2 let orbitdb1, orbitdb2 before(async () => { - ipfsd1 = await startIpfs(IPFS, config.daemon1) - ipfsd2 = await startIpfs(IPFS, config.daemon2) - ipfs1 = ipfsd1.api - ipfs2 = ipfsd2.api + ipfs1 = await IPFS.create({ ...config.daemon1, repo: './ipfs1' }) + ipfs2 = await IPFS.create({ ...config.daemon2, repo: './ipfs2' }) await connectPeers(ipfs1, ipfs2) }) after(async () => { - if (ipfsd1) { - await stopIpfs(ipfsd1) + if (ipfs1) { + await ipfs1.stop() } - if (ipfsd2) { - await stopIpfs(ipfsd2) + if (ipfs2) { + await ipfs2.stop() } await rmrf('./orbitdb1') await rmrf('./orbitdb2') + await rmrf('./ipfs1') + await rmrf('./ipfs2') }) describe('replicating a database', () => { diff --git a/test/orbitdb.test.js b/test/orbitdb.test.js index 5f80f1e..9c5c51e 100644 --- a/test/orbitdb.test.js +++ b/test/orbitdb.test.js @@ -2,36 +2,32 @@ import { strictEqual, notStrictEqual } from 'assert' import rmrf from 'rimraf' import fs from 'fs' import path from 'path' +import * as IPFS from 'ipfs' import { OrbitDB, isIdentity } from '../src/index.js' -import { config, startIpfs, stopIpfs } from 'orbit-db-test-utils' +import config from './config.js' import connectPeers from './utils/connect-nodes.js' -const IPFS = 'js-ipfs' - describe('OrbitDB', function () { this.timeout(5000) - let ipfsd1, ipfsd2 let ipfs1, ipfs2 let orbitdb1 before(async () => { - ipfsd1 = await startIpfs(IPFS, config.daemon1) - ipfsd2 = await startIpfs(IPFS, config.daemon2) - ipfs1 = ipfsd1.api - ipfs2 = ipfsd2.api - + ipfs1 = await IPFS.create({ ...config.daemon1, repo: './ipfs1' }) + ipfs2 = await IPFS.create({ ...config.daemon2, repo: './ipfs2' }) await connectPeers(ipfs1, ipfs2) }) after(async () => { - if (ipfsd1) { - await stopIpfs(ipfsd1) + if (ipfs1) { + await ipfs1.stop() } - - if (ipfsd2) { - await stopIpfs(ipfsd2) + if (ipfs2) { + await ipfs2.stop() } + await rmrf('./ipfs1') + await rmrf('./ipfs2') }) describe('OrbitDB instance creation - defaults', () => { diff --git a/test/storage.spec.js b/test/storage.spec.js index 17b95d3..620ee86 100644 --- a/test/storage.spec.js +++ b/test/storage.spec.js @@ -4,7 +4,7 @@ import { copy } from 'fs-extra' import * as IPFS from 'ipfs' import { Log, Identities, KeyStore } from '../src/index.js' import { IPFSBlockStorage, MemoryStorage, LRUStorage, ComposedStorage } from '../src/storage/index.js' -import { config } from 'orbit-db-test-utils' +import config from './config.js' import testKeysPath from './fixtures/test-keys-path.js ' const keysPath = './testkeys' @@ -12,25 +12,23 @@ const keysPath = './testkeys' describe('Storages', function () { this.timeout(5000) - let ipfs1 + let ipfs let keystore - let testIdentity1 + let testIdentity before(async () => { + ipfs = await IPFS.create({ ...config.daemon1, repo: './ipfs1' }) + await copy(testKeysPath, keysPath) - - // Start an IPFS instance - ipfs1 = await IPFS.create({ ...config.daemon1, repo: './ipfs1' }) - keystore = await KeyStore({ path: keysPath }) const identities = await Identities({ keystore }) - testIdentity1 = await identities.createIdentity({ id: 'userA' }) + testIdentity = await identities.createIdentity({ id: 'userA' }) }) after(async () => { - if (ipfs1) { - await ipfs1.stop() + if (ipfs) { + await ipfs.stop() } if (keystore) { @@ -43,8 +41,8 @@ describe('Storages', function () { const runTestWithStorage = async (storage) => { const amount = 100 - const log1 = await Log(testIdentity1, { logId: 'A', storage }) - const log2 = await Log(testIdentity1, { logId: 'A', storage }) + const log1 = await Log(testIdentity, { logId: 'A', storage }) + const log2 = await Log(testIdentity, { logId: 'A', storage }) for (let i = 0; i < amount; i++) { await log1.append('hello' + i) await log2.append('hello' + i) @@ -82,7 +80,7 @@ describe('Storages', function () { describe('IPFSBlockStorage', () => { it('tests the storage', async () => { - const storage = await IPFSBlockStorage({ ipfs: ipfs1 }) + const storage = await IPFSBlockStorage({ ipfs }) notStrictEqual(storage, undefined) await runTestWithStorage(storage) }) @@ -91,7 +89,7 @@ describe('Storages', function () { describe('Composed Storages', () => { it('tests Memory + IPFSBlockStorage composition', async () => { const storage1 = await MemoryStorage() - const storage2 = await IPFSBlockStorage({ ipfs: ipfs1 }) + const storage2 = await IPFSBlockStorage({ ipfs }) const storage = await ComposedStorage(storage1, storage2) notStrictEqual(storage, undefined) await runTestWithStorage(storage) @@ -99,7 +97,7 @@ describe('Storages', function () { it('tests LRU + IPFSBlockStorage composition', async () => { const storage1 = await LRUStorage({ size: -1 }) - const storage2 = await IPFSBlockStorage({ ipfs: ipfs1 }) + const storage2 = await IPFSBlockStorage({ ipfs }) const storage = await ComposedStorage(storage1, storage2) notStrictEqual(storage, undefined) await runTestWithStorage(storage) diff --git a/test/utils/get-ipfs-peer-id.js b/test/utils/get-ipfs-peer-id.js new file mode 100644 index 0000000..575494a --- /dev/null +++ b/test/utils/get-ipfs-peer-id.js @@ -0,0 +1,8 @@ +'use strict' + +const getIpfsPeerId = async (ipfs) => { + const peerId = await ipfs.id() + return peerId.id +} + +export default getIpfsPeerId diff --git a/test/utils/wait-for-peers.js b/test/utils/wait-for-peers.js new file mode 100644 index 0000000..4df3a17 --- /dev/null +++ b/test/utils/wait-for-peers.js @@ -0,0 +1,27 @@ +'use strict' + +const waitForPeers = (ipfs, peersToWait, topic) => { + return new Promise((resolve, reject) => { + const interval = setInterval(async () => { + try { + const peers = await ipfs.pubsub.peers(topic) + const peerIds = peers.map(peer => peer.toString()) + const peerIdsToWait = peersToWait.map(peer => peer.toString()) + + const hasAllPeers = peerIdsToWait.map((e) => peerIds.includes(e)).filter((e) => e === false).length === 0 + + // FIXME: Does not fail on timeout, not easily fixable + if (hasAllPeers) { + console.log('Found peers!') + clearInterval(interval) + resolve() + } + } catch (e) { + clearInterval(interval) + reject(e) + } + }, 200) + }) +} + +export default waitForPeers