diff --git a/package-lock.json b/package-lock.json index fc73baad..2a8835c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,23 +19,23 @@ "@mapeo/sqlite-indexer": "^1.0.2", "@sinclair/typebox": "^0.33.17", "@sindresorhus/merge-streams": "^4.0.0", - "b4a": "^1.6.3", + "b4a": "^1.7.2", "bcp-47": "^2.1.0", "better-sqlite3": "^11.10.0", "big-sparse-array": "^1.0.3", "bogon": "^1.1.0", "compact-encoding": "^2.12.0", - "corestore": "6.8.4", + "corestore": "^7.4.7", "debug": "^4.3.4", "dot-prop": "^9.0.0", "drizzle-orm": "^0.30.8", "ensure-error": "^4.0.0", "fastify": "^4.0.0", "fastify-plugin": "^4.5.1", - "hyperblobs": "2.3.0", - "hypercore": "10.19.0", - "hypercore-crypto": "3.4.2", - "hyperdrive": "11.5.3", + "hyperblobs": "^2.8.0", + "hypercore": "^11.16.2", + "hypercore-crypto": "^3.6.1", + "hyperdrive": "^13.0.1", "json-stable-stringify": "^1.1.1", "magic-bytes.js": "^1.10.0", "map-obj": "^5.0.2", @@ -45,11 +45,11 @@ "p-event": "^6.0.1", "p-timeout": "^6.1.2", "protobufjs": "^7.2.3", - "protomux": "^3.4.1", + "protomux": "^3.10.1", "quickbit-universal": "^2.2.0", - "sodium-universal": "^4.0.0", + "sodium-universal": "^5.0.1", "start-stop-state-machine": "^1.2.0", - "streamx": "^2.19.0", + "streamx": "^2.23.0", "string-timing-safe-equal": "^0.1.0", "styled-map-package": "^3.0.0", "sub-encoder": "^2.1.1", @@ -368,6 +368,123 @@ "npm": ">=9.6.7" } }, + "node_modules/@comapeo/cloud/node_modules/corestore": { + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/corestore/-/corestore-6.8.4.tgz", + "integrity": "sha512-rJUn1bK2Id18mxZSb64fKGCSsbbBAvPUkSZVzsLB4Nnwhf3pkwxt/JjBvKHtsrvRyPAu9xtxUdUk1cSQ1JnOPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.3.1", + "hypercore": "^10.12.0", + "hypercore-crypto": "^3.2.1", + "read-write-mutexify": "^2.1.0", + "ready-resource": "^1.0.0", + "safety-catch": "^1.0.1", + "sodium-universal": "^4.0.0", + "xache": "^1.1.0" + } + }, + "node_modules/@comapeo/cloud/node_modules/hyperblobs": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hyperblobs/-/hyperblobs-2.3.0.tgz", + "integrity": "sha512-iBCLVEo6FK+Xd7cpLM3DQ6cTfuMmKPfDZNj5/JqKEgziBEuI0ZGGyMM5dqaVvtRX4s71y8BhrgsDi2p0pWdSmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.1", + "mutexify": "^1.4.0", + "streamx": "^2.13.2" + } + }, + "node_modules/@comapeo/cloud/node_modules/hypercore": { + "version": "10.19.0", + "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-10.19.0.tgz", + "integrity": "sha512-vdK9QC2BmylhL1gqUYBICgRLHYhPqX6f4iOYfQKqcV+xOkiLIJglBNLHIUVYHqGw5W0YunhRzbpA/9IhPtrJOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hyperswarm/secret-stream": "^6.0.0", + "b4a": "^1.1.0", + "big-sparse-array": "^1.0.3", + "compact-encoding": "^2.11.0", + "crc-universal": "^1.0.2", + "events": "^3.3.0", + "fast-fifo": "^1.3.0", + "flat-tree": "^1.9.0", + "hypercore-crypto": "^3.2.1", + "hypercore-errors": "^1.0.0", + "is-options": "^1.0.1", + "protomux": "^3.5.0", + "quickbit-universal": "^2.1.1", + "random-access-file": "^4.0.0", + "random-array-iterator": "^1.0.0", + "safety-catch": "^1.0.1", + "sodium-universal": "^4.0.0", + "streamx": "^2.12.4", + "xache": "^1.1.0", + "z32": "^1.0.0" + } + }, + "node_modules/@comapeo/cloud/node_modules/hypercore-crypto": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/hypercore-crypto/-/hypercore-crypto-3.4.2.tgz", + "integrity": "sha512-16ii4M6T1dFfRa41Szv3IR0wXfImJMYJ8ysZEGwHEDH7sMeWVEBck6tg1GCNutYl39E+H7wMY2p3ndCRfj+XdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.6", + "compact-encoding": "^2.15.0", + "sodium-universal": "^4.0.1" + } + }, + "node_modules/@comapeo/cloud/node_modules/hyperdrive": { + "version": "11.5.3", + "resolved": "https://registry.npmjs.org/hyperdrive/-/hyperdrive-11.5.3.tgz", + "integrity": "sha512-0542G6n9eAXK/+fl6bs+9rvxCrL/dQo9mZsbY+BFSCD3S6ymBlaVnjOCuQdNflYBOHFVNnbBYdDvZ9meInv+tw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "hyperbee": "^2.11.1", + "hyperblobs": "^2.3.0", + "hypercore-errors": "^1.0.0", + "is-options": "^1.0.2", + "mirror-drive": "^1.2.0", + "ready-resource": "^1.0.0", + "safety-catch": "^1.0.2", + "streamx": "^2.12.4", + "sub-encoder": "^2.1.1", + "unix-path-resolve": "^1.0.2" + } + }, + "node_modules/@comapeo/cloud/node_modules/sodium-native": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.3.3.tgz", + "integrity": "sha512-OnxSlN3uyY8D0EsLHpmm2HOFmKddQVvEMmsakCrXUzSd8kjjbzL413t4ZNF3n0UxSwNgwTyUvkmZHTfuCeiYSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-addon": "^1.1.0" + } + }, + "node_modules/@comapeo/cloud/node_modules/sodium-universal": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.1.tgz", + "integrity": "sha512-sNp13PrxYLaUFHTGoDKkSDFvoEu51bfzE12RwGlqU1fcrkpAOK0NvizaJzOWV0Omtk9me2+Pnbjcf/l0efxuGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "sodium-native": "^4.0.0" + }, + "peerDependencies": { + "sodium-javascript": "~0.8.0" + }, + "peerDependenciesMeta": { + "sodium-javascript": { + "optional": true + } + } + }, "node_modules/@comapeo/core": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@comapeo/core/-/core-2.3.0.tgz", @@ -525,6 +642,37 @@ "node": ">=18" } }, + "node_modules/@comapeo/core/node_modules/corestore": { + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/corestore/-/corestore-6.8.4.tgz", + "integrity": "sha512-rJUn1bK2Id18mxZSb64fKGCSsbbBAvPUkSZVzsLB4Nnwhf3pkwxt/JjBvKHtsrvRyPAu9xtxUdUk1cSQ1JnOPw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "b4a": "^1.3.1", + "hypercore": "^10.12.0", + "hypercore-crypto": "^3.2.1", + "read-write-mutexify": "^2.1.0", + "ready-resource": "^1.0.0", + "safety-catch": "^1.0.1", + "sodium-universal": "^4.0.0", + "xache": "^1.1.0" + } + }, + "node_modules/@comapeo/core/node_modules/hyperblobs": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hyperblobs/-/hyperblobs-2.3.0.tgz", + "integrity": "sha512-iBCLVEo6FK+Xd7cpLM3DQ6cTfuMmKPfDZNj5/JqKEgziBEuI0ZGGyMM5dqaVvtRX4s71y8BhrgsDi2p0pWdSmg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "b4a": "^1.6.1", + "mutexify": "^1.4.0", + "streamx": "^2.13.2" + } + }, "node_modules/@comapeo/core/node_modules/hypercore": { "version": "10.17.0", "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-10.17.0.tgz", @@ -552,6 +700,39 @@ "z32": "^1.0.0" } }, + "node_modules/@comapeo/core/node_modules/hypercore-crypto": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/hypercore-crypto/-/hypercore-crypto-3.4.2.tgz", + "integrity": "sha512-16ii4M6T1dFfRa41Szv3IR0wXfImJMYJ8ysZEGwHEDH7sMeWVEBck6tg1GCNutYl39E+H7wMY2p3ndCRfj+XdQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "b4a": "^1.6.6", + "compact-encoding": "^2.15.0", + "sodium-universal": "^4.0.1" + } + }, + "node_modules/@comapeo/core/node_modules/hyperdrive": { + "version": "11.5.3", + "resolved": "https://registry.npmjs.org/hyperdrive/-/hyperdrive-11.5.3.tgz", + "integrity": "sha512-0542G6n9eAXK/+fl6bs+9rvxCrL/dQo9mZsbY+BFSCD3S6ymBlaVnjOCuQdNflYBOHFVNnbBYdDvZ9meInv+tw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "hyperbee": "^2.11.1", + "hyperblobs": "^2.3.0", + "hypercore-errors": "^1.0.0", + "is-options": "^1.0.2", + "mirror-drive": "^1.2.0", + "ready-resource": "^1.0.0", + "safety-catch": "^1.0.2", + "streamx": "^2.12.4", + "sub-encoder": "^2.1.1", + "unix-path-resolve": "^1.0.2" + } + }, "node_modules/@comapeo/core/node_modules/is-stream": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", @@ -598,6 +779,36 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@comapeo/core/node_modules/sodium-native": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.3.3.tgz", + "integrity": "sha512-OnxSlN3uyY8D0EsLHpmm2HOFmKddQVvEMmsakCrXUzSd8kjjbzL413t4ZNF3n0UxSwNgwTyUvkmZHTfuCeiYSw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "require-addon": "^1.1.0" + } + }, + "node_modules/@comapeo/core/node_modules/sodium-universal": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.1.tgz", + "integrity": "sha512-sNp13PrxYLaUFHTGoDKkSDFvoEu51bfzE12RwGlqU1fcrkpAOK0NvizaJzOWV0Omtk9me2+Pnbjcf/l0efxuGQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "sodium-native": "^4.0.0" + }, + "peerDependencies": { + "sodium-javascript": "~0.8.0" + }, + "peerDependenciesMeta": { + "sodium-javascript": { + "optional": true + } + } + }, "node_modules/@comapeo/core/node_modules/styled-map-package": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/styled-map-package/-/styled-map-package-2.2.1.tgz", @@ -799,6 +1010,35 @@ "node": ">=18" } }, + "node_modules/@comapeo/core2.0.1/node_modules/corestore": { + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/corestore/-/corestore-6.8.4.tgz", + "integrity": "sha512-rJUn1bK2Id18mxZSb64fKGCSsbbBAvPUkSZVzsLB4Nnwhf3pkwxt/JjBvKHtsrvRyPAu9xtxUdUk1cSQ1JnOPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.3.1", + "hypercore": "^10.12.0", + "hypercore-crypto": "^3.2.1", + "read-write-mutexify": "^2.1.0", + "ready-resource": "^1.0.0", + "safety-catch": "^1.0.1", + "sodium-universal": "^4.0.0", + "xache": "^1.1.0" + } + }, + "node_modules/@comapeo/core2.0.1/node_modules/hyperblobs": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hyperblobs/-/hyperblobs-2.3.0.tgz", + "integrity": "sha512-iBCLVEo6FK+Xd7cpLM3DQ6cTfuMmKPfDZNj5/JqKEgziBEuI0ZGGyMM5dqaVvtRX4s71y8BhrgsDi2p0pWdSmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.1", + "mutexify": "^1.4.0", + "streamx": "^2.13.2" + } + }, "node_modules/@comapeo/core2.0.1/node_modules/hypercore": { "version": "10.17.0", "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-10.17.0.tgz", @@ -825,6 +1065,37 @@ "z32": "^1.0.0" } }, + "node_modules/@comapeo/core2.0.1/node_modules/hypercore-crypto": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/hypercore-crypto/-/hypercore-crypto-3.4.2.tgz", + "integrity": "sha512-16ii4M6T1dFfRa41Szv3IR0wXfImJMYJ8ysZEGwHEDH7sMeWVEBck6tg1GCNutYl39E+H7wMY2p3ndCRfj+XdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.6", + "compact-encoding": "^2.15.0", + "sodium-universal": "^4.0.1" + } + }, + "node_modules/@comapeo/core2.0.1/node_modules/hyperdrive": { + "version": "11.5.3", + "resolved": "https://registry.npmjs.org/hyperdrive/-/hyperdrive-11.5.3.tgz", + "integrity": "sha512-0542G6n9eAXK/+fl6bs+9rvxCrL/dQo9mZsbY+BFSCD3S6ymBlaVnjOCuQdNflYBOHFVNnbBYdDvZ9meInv+tw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "hyperbee": "^2.11.1", + "hyperblobs": "^2.3.0", + "hypercore-errors": "^1.0.0", + "is-options": "^1.0.2", + "mirror-drive": "^1.2.0", + "ready-resource": "^1.0.0", + "safety-catch": "^1.0.2", + "streamx": "^2.12.4", + "sub-encoder": "^2.1.1", + "unix-path-resolve": "^1.0.2" + } + }, "node_modules/@comapeo/core2.0.1/node_modules/is-stream": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", @@ -868,6 +1139,34 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@comapeo/core2.0.1/node_modules/sodium-native": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.3.3.tgz", + "integrity": "sha512-OnxSlN3uyY8D0EsLHpmm2HOFmKddQVvEMmsakCrXUzSd8kjjbzL413t4ZNF3n0UxSwNgwTyUvkmZHTfuCeiYSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-addon": "^1.1.0" + } + }, + "node_modules/@comapeo/core2.0.1/node_modules/sodium-universal": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.1.tgz", + "integrity": "sha512-sNp13PrxYLaUFHTGoDKkSDFvoEu51bfzE12RwGlqU1fcrkpAOK0NvizaJzOWV0Omtk9me2+Pnbjcf/l0efxuGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "sodium-native": "^4.0.0" + }, + "peerDependencies": { + "sodium-javascript": "~0.8.0" + }, + "peerDependenciesMeta": { + "sodium-javascript": { + "optional": true + } + } + }, "node_modules/@comapeo/core2.0.1/node_modules/styled-map-package": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/styled-map-package/-/styled-map-package-2.2.1.tgz", @@ -1351,6 +1650,32 @@ "timeout-refresh": "^2.0.0" } }, + "node_modules/@hyperswarm/secret-stream/node_modules/sodium-native": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.3.3.tgz", + "integrity": "sha512-OnxSlN3uyY8D0EsLHpmm2HOFmKddQVvEMmsakCrXUzSd8kjjbzL413t4ZNF3n0UxSwNgwTyUvkmZHTfuCeiYSw==", + "license": "MIT", + "dependencies": { + "require-addon": "^1.1.0" + } + }, + "node_modules/@hyperswarm/secret-stream/node_modules/sodium-universal": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.1.tgz", + "integrity": "sha512-sNp13PrxYLaUFHTGoDKkSDFvoEu51bfzE12RwGlqU1fcrkpAOK0NvizaJzOWV0Omtk9me2+Pnbjcf/l0efxuGQ==", + "license": "MIT", + "dependencies": { + "sodium-native": "^4.0.0" + }, + "peerDependencies": { + "sodium-javascript": "~0.8.0" + }, + "peerDependenciesMeta": { + "sodium-javascript": { + "optional": true + } + } + }, "node_modules/@inquirer/checkbox": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-3.0.1.tgz", @@ -1832,6 +2157,32 @@ "z32": "^1.0.0" } }, + "node_modules/@mapeo/crypto/node_modules/sodium-native": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.3.3.tgz", + "integrity": "sha512-OnxSlN3uyY8D0EsLHpmm2HOFmKddQVvEMmsakCrXUzSd8kjjbzL413t4ZNF3n0UxSwNgwTyUvkmZHTfuCeiYSw==", + "license": "MIT", + "dependencies": { + "require-addon": "^1.1.0" + } + }, + "node_modules/@mapeo/crypto/node_modules/sodium-universal": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.1.tgz", + "integrity": "sha512-sNp13PrxYLaUFHTGoDKkSDFvoEu51bfzE12RwGlqU1fcrkpAOK0NvizaJzOWV0Omtk9me2+Pnbjcf/l0efxuGQ==", + "license": "MIT", + "dependencies": { + "sodium-native": "^4.0.0" + }, + "peerDependencies": { + "sodium-javascript": "~0.8.0" + }, + "peerDependenciesMeta": { + "sodium-javascript": { + "optional": true + } + } + }, "node_modules/@mapeo/default-config": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@mapeo/default-config/-/default-config-5.0.0.tgz", @@ -3074,19 +3425,46 @@ } }, "node_modules/b4a": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", - "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==" + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.2.tgz", + "integrity": "sha512-DyUOdz+E8R6+sruDpQNOaV0y/dBbV6X/8ZkxrDcR0Ifc3BgKlpgG0VAtfOozA0eMtJO5GGe9FsZhueLs00pTww==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } }, "node_modules/balanced-match": { "version": "1.0.2", "license": "MIT" }, + "node_modules/bare-addon-resolve": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/bare-addon-resolve/-/bare-addon-resolve-1.9.4.tgz", + "integrity": "sha512-unn6Vy/Yke6F99vg/7tcrvM2KUvIhTNniaSqDbam4AWkd4NhvDVSrQiRYVlNzUV2P7SPobkCK7JFVxrJk9btCg==", + "license": "Apache-2.0", + "dependencies": { + "bare-module-resolve": "^1.10.0", + "bare-semver": "^1.0.0" + }, + "peerDependencies": { + "bare-url": "*" + }, + "peerDependenciesMeta": { + "bare-url": { + "optional": true + } + } + }, "node_modules/bare-events": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", - "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", - "optional": true + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", + "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", + "license": "Apache-2.0" }, "node_modules/bare-fs": { "version": "2.3.1", @@ -3099,6 +3477,23 @@ "bare-stream": "^2.0.0" } }, + "node_modules/bare-module-resolve": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/bare-module-resolve/-/bare-module-resolve-1.11.1.tgz", + "integrity": "sha512-DCxeT9i8sTs3vUMA3w321OX/oXtNEu5EjObQOnTmCdNp5RXHBAvAaBDHvAi9ta0q/948QPz+co6SsGi6aQMYRg==", + "license": "Apache-2.0", + "dependencies": { + "bare-semver": "^1.0.0" + }, + "peerDependencies": { + "bare-url": "*" + }, + "peerDependenciesMeta": { + "bare-url": { + "optional": true + } + } + }, "node_modules/bare-os": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", @@ -3114,13 +3509,58 @@ "bare-os": "^2.1.0" } }, + "node_modules/bare-semver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bare-semver/-/bare-semver-1.0.1.tgz", + "integrity": "sha512-UtggzHLiTrmFOC/ogQ+Hy7VfoKoIwrP1UFcYtTxoCUdLtsIErT8+SWtOC2DH/snT9h+xDrcBEPcwKei1mzemgg==", + "license": "Apache-2.0" + }, "node_modules/bare-stream": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", - "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", - "optional": true, + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", + "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "license": "Apache-2.0", + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.2.2.tgz", + "integrity": "sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==", + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/bare-url/node_modules/bare-os": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "license": "Apache-2.0", + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-url/node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", "dependencies": { - "streamx": "^2.18.0" + "bare-os": "^3.0.1" } }, "node_modules/base-x": { @@ -3703,9 +4143,10 @@ } }, "node_modules/compact-encoding": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/compact-encoding/-/compact-encoding-2.15.0.tgz", - "integrity": "sha512-af/NomxL9Mo0lqCk++rxLLDZI+lJqeBrPt4dK6FbjxTCEhfC9yQAIoO6yq9ixyCirce0luQwErkwJrhem6clxA==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/compact-encoding/-/compact-encoding-2.16.1.tgz", + "integrity": "sha512-vP39X4nwtesmZucaAxDg4wnudOoaJTSR+fikzi8VLVxbwLmcWXf3t0LxY0n2H1AMpdoQZ08lmUf4GY3XiDPnMQ==", + "license": "Apache-2.0", "dependencies": { "b4a": "^1.3.0" } @@ -3831,23 +4272,24 @@ } }, "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/corestore": { - "version": "6.8.4", - "resolved": "https://registry.npmjs.org/corestore/-/corestore-6.8.4.tgz", - "integrity": "sha512-rJUn1bK2Id18mxZSb64fKGCSsbbBAvPUkSZVzsLB4Nnwhf3pkwxt/JjBvKHtsrvRyPAu9xtxUdUk1cSQ1JnOPw==", - "dependencies": { - "b4a": "^1.3.1", - "hypercore": "^10.12.0", - "hypercore-crypto": "^3.2.1", - "read-write-mutexify": "^2.1.0", - "ready-resource": "^1.0.0", - "safety-catch": "^1.0.1", - "sodium-universal": "^4.0.0", - "xache": "^1.1.0" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/corestore": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/corestore/-/corestore-7.4.7.tgz", + "integrity": "sha512-yQwK9V8tPEB3SXGHXoTahxOA7MbG8dxR5payaZlgHxR8qgygxTn+L2SwR/HzTI5n1QGEPmG5aqOkDuDnHfZkdg==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.7", + "hypercore": "^11.0.0", + "hypercore-crypto": "^3.4.2", + "hypercore-errors": "^1.4.0", + "hypercore-id-encoding": "^1.3.0", + "ready-resource": "^1.1.1", + "sodium-universal": "^5.0.1", + "which-runtime": "^1.2.1" } }, "node_modules/cp-file": { @@ -3965,6 +4407,7 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/crc-native/-/crc-native-1.1.5.tgz", "integrity": "sha512-toSzpisZ2AhmmfTA6h2Lt0JWOM6G+y0wAGP+JL9bkmLvwpWV2Co4P+DhGEOcGabIeFORZmfIvEs7VAm7kma5vg==", + "dev": true, "optional": true, "dependencies": { "node-gyp-build": "^4.8.2" @@ -3974,6 +4417,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/crc-universal/-/crc-universal-1.0.4.tgz", "integrity": "sha512-CE9xWEI6Gd5V0Bdmj5NoWH3d7+EIe4zUpy1sv6uvKYznzsDP1vhiWsTBmL6q9IrH2P6RRshp+8AkhR4CMtY5Hg==", + "dev": true, "optionalDependencies": { "crc-native": "^1.0.3" } @@ -4279,6 +4723,59 @@ "node": ">=8" } }, + "node_modules/device-file": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/device-file/-/device-file-1.2.6.tgz", + "integrity": "sha512-gHH0lYHWvxjDOstkLji6ExtmYUPtpgICdkEeOuKkodiz111e7rPZP1WWwHlEmvA/gDNQl3KJkbWJ8YDidu3C4A==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.7", + "bare-fs": "^4.0.1", + "fs-native-extensions": "^1.4.0" + } + }, + "node_modules/device-file/node_modules/bare-fs": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.4.tgz", + "integrity": "sha512-Q8yxM1eLhJfuM7KXVP3zjhBvtMJCYRByoTT+wHXjpdMELv0xICFJX+1w4c7csa+WZEOsq4ItJ4RGwvzid6m/dw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/device-file/node_modules/bare-os": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "license": "Apache-2.0", + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/device-file/node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "dependencies": { + "bare-os": "^3.0.1" + } + }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", @@ -5086,6 +5583,15 @@ "node": ">=0.8.x" } }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/execa": { "version": "9.5.1", "resolved": "https://registry.npmjs.org/execa/-/execa-9.5.1.tgz", @@ -5538,7 +6044,9 @@ } }, "node_modules/flat-tree": { - "version": "1.9.0", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/flat-tree/-/flat-tree-1.13.0.tgz", + "integrity": "sha512-fT3HIuCPwHhFgJ20QYzDHgUG0zMmFg5cHvFiFo5h+QMSJ28TihsEVY0f8HGliuO+pOzmvjMx1odToeaEWkTnyQ==", "license": "MIT" }, "node_modules/flatted": { @@ -5598,12 +6106,12 @@ "license": "MIT" }, "node_modules/fs-native-extensions": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fs-native-extensions/-/fs-native-extensions-1.3.2.tgz", - "integrity": "sha512-fQaLJt4uY96iiMdy+rV561TaXefkfTq4dmSXcN2D1z8SBtFTsmcO3GaJexPKTxltqdh826JQBK1CySo3EpzgQQ==", - "optional": true, + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/fs-native-extensions/-/fs-native-extensions-1.4.4.tgz", + "integrity": "sha512-iLo3r2ei97thJNoj3DgSdzUF2hZ2yekZpXF98LlHc2eZGPOwiVblyEa6iS68zLu9ayXvlE8/c3CMaagNbHJB1Q==", + "license": "Apache-2.0", "dependencies": { - "node-gyp-build": "^4.8.2", + "require-addon": "^1.1.0", "which-runtime": "^1.2.0" } }, @@ -5645,6 +6153,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generate-object-property": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-2.0.0.tgz", + "integrity": "sha512-KwuURPyqn2Mz8DdV29pJwQu0Y7tcsbkULr82eeOcY/ZllFK6I9Wm8dsRByIu7CKWlFi9BdW1b3mcXMp/kQBQsw==", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.0" + } + }, + "node_modules/generate-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/generate-string/-/generate-string-1.0.1.tgz", + "integrity": "sha512-IfTY0dKZM43ACyGvXkbG7De7WY7MxTS5VO6Juhe8oJKpCmrYYXoqp/cJMskkpi0k9H8wuXq0H+eI898/BCqvXg==", + "license": "MIT" + }, "node_modules/get-east-asian-width": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", @@ -6094,72 +6617,215 @@ } }, "node_modules/hyperblobs": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hyperblobs/-/hyperblobs-2.3.0.tgz", - "integrity": "sha512-iBCLVEo6FK+Xd7cpLM3DQ6cTfuMmKPfDZNj5/JqKEgziBEuI0ZGGyMM5dqaVvtRX4s71y8BhrgsDi2p0pWdSmg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/hyperblobs/-/hyperblobs-2.8.0.tgz", + "integrity": "sha512-s9txNdHAdDMZjOn7B5nPOKXcUe/IGnzgWYhczAQs3TxEAcXFoXTBAtBd0HjorLa0pfvcSgq+v61cW2Chr4LACA==", + "license": "Apache-2.0", "dependencies": { "b4a": "^1.6.1", + "bare-events": "^2.5.0", + "hypercore-errors": "^1.1.1", "mutexify": "^1.4.0", + "speedometer": "^1.1.0", "streamx": "^2.13.2" } }, "node_modules/hypercore": { - "version": "10.19.0", - "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-10.19.0.tgz", - "integrity": "sha512-vdK9QC2BmylhL1gqUYBICgRLHYhPqX6f4iOYfQKqcV+xOkiLIJglBNLHIUVYHqGw5W0YunhRzbpA/9IhPtrJOw==", + "version": "11.16.2", + "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-11.16.2.tgz", + "integrity": "sha512-rObUgeWTPOy0KcK2Pqfk6699qPWYQzncv4z4dGSJ6s7mLVvtCdVdr3mVx9zZHu9GND9uX6/stKFnQU3AzBvTLQ==", + "license": "MIT", "dependencies": { "@hyperswarm/secret-stream": "^6.0.0", "b4a": "^1.1.0", + "bare-events": "^2.2.0", "big-sparse-array": "^1.0.3", "compact-encoding": "^2.11.0", - "crc-universal": "^1.0.2", - "events": "^3.3.0", "fast-fifo": "^1.3.0", "flat-tree": "^1.9.0", "hypercore-crypto": "^3.2.1", - "hypercore-errors": "^1.0.0", + "hypercore-errors": "^1.5.0", + "hypercore-id-encoding": "^1.2.0", + "hypercore-storage": "^1.0.0", "is-options": "^1.0.1", + "nanoassert": "^2.0.0", "protomux": "^3.5.0", - "quickbit-universal": "^2.1.1", - "random-access-file": "^4.0.0", + "quickbit-universal": "^2.2.0", "random-array-iterator": "^1.0.0", "safety-catch": "^1.0.1", - "sodium-universal": "^4.0.0", + "sodium-universal": "^5.0.1", "streamx": "^2.12.4", - "xache": "^1.1.0", + "unslab": "^1.3.0", "z32": "^1.0.0" } }, "node_modules/hypercore-crypto": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/hypercore-crypto/-/hypercore-crypto-3.4.2.tgz", - "integrity": "sha512-16ii4M6T1dFfRa41Szv3IR0wXfImJMYJ8ysZEGwHEDH7sMeWVEBck6tg1GCNutYl39E+H7wMY2p3ndCRfj+XdQ==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/hypercore-crypto/-/hypercore-crypto-3.6.1.tgz", + "integrity": "sha512-ltIz2uDwy9pO/ZGTvqcjzyBkvt6O4cVm4r/nNxh0GFs/RbQtqP/i4wCvLEdmU7ptgtnw7fI67WYD1aHPuv4OVA==", + "license": "MIT", "dependencies": { "b4a": "^1.6.6", "compact-encoding": "^2.15.0", - "sodium-universal": "^4.0.1" + "sodium-universal": "^5.0.0" } }, "node_modules/hypercore-errors": { - "version": "1.0.0", - "license": "Apache-2.0" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/hypercore-errors/-/hypercore-errors-1.5.0.tgz", + "integrity": "sha512-5KQ/SuDxsvet+7qWA35Ay6zdD9WyAHQoyWHGcPUTbmJBd300gvNIJoi3oma7kp4TTCSzii6qYumNZe/s0j/saQ==", + "license": "Apache-2.0", + "dependencies": { + "hypercore-id-encoding": "^1.3.0" + } + }, + "node_modules/hypercore-id-encoding": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/hypercore-id-encoding/-/hypercore-id-encoding-1.3.0.tgz", + "integrity": "sha512-W6sHdGo5h7LXEsoWfKf/KfuROZmZRQDlGqJF2EPHW+noCK66Vvr0+zE6cL0vqQi18s0kQPeN7Sq3QyR0Ytc2VQ==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.5.3", + "z32": "^1.0.0" + } + }, + "node_modules/hypercore-storage": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/hypercore-storage/-/hypercore-storage-1.14.1.tgz", + "integrity": "sha512-i8ktFfYyBrsNWsNXWG4OZdwm5ZOeSgcTJ14ZwSQ9Rz2HyjpdzAyEiPrUKNGdNXZhRyMnQkvHPnxD3HoE0NiDgQ==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.7", + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0", + "compact-encoding": "^2.16.0", + "device-file": "^1.2.2", + "flat-tree": "^1.12.1", + "hypercore-crypto": "^3.4.2", + "hyperschema": "^1.7.0", + "index-encoder": "^3.3.2", + "resolve-reject-promise": "^1.0.0", + "rocksdb-native": "^3.1.1", + "scope-lock": "^1.2.4", + "streamx": "^2.21.1" + } + }, + "node_modules/hypercore-storage/node_modules/bare-fs": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.4.tgz", + "integrity": "sha512-Q8yxM1eLhJfuM7KXVP3zjhBvtMJCYRByoTT+wHXjpdMELv0xICFJX+1w4c7csa+WZEOsq4ItJ4RGwvzid6m/dw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/hypercore-storage/node_modules/bare-os": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "license": "Apache-2.0", + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/hypercore-storage/node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "dependencies": { + "bare-os": "^3.0.1" + } }, "node_modules/hyperdrive": { - "version": "11.5.3", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/hyperdrive/-/hyperdrive-13.0.1.tgz", + "integrity": "sha512-lmvMLcntBHVgL8W+f3rCuV+Jqj4WZfn6nCuutMDOJUO8CqMp8zy0NKCGi3ny2dbjbTNIM1blErpbm3+9y2vfpA==", "license": "Apache-2.0", "dependencies": { "hyperbee": "^2.11.1", "hyperblobs": "^2.3.0", + "hypercore": "^11.0.0", "hypercore-errors": "^1.0.0", "is-options": "^1.0.2", "mirror-drive": "^1.2.0", "ready-resource": "^1.0.0", "safety-catch": "^1.0.2", + "speedometer": "^1.1.0", "streamx": "^2.12.4", "sub-encoder": "^2.1.1", "unix-path-resolve": "^1.0.2" } }, + "node_modules/hyperschema": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/hyperschema/-/hyperschema-1.15.0.tgz", + "integrity": "sha512-ntkfz/3oGdbjhjBF70I0K7FKMT0JN4CxAa8h+QYZcupXtRYHjRsTM8J1yfFmcC4IdlmiUNaon86JVR0cb9UOMQ==", + "license": "Apache-2.0", + "dependencies": { + "bare-fs": "^4.0.1", + "compact-encoding": "^2.15.0", + "generate-object-property": "^2.0.0", + "generate-string": "^1.0.1" + } + }, + "node_modules/hyperschema/node_modules/bare-fs": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.4.tgz", + "integrity": "sha512-Q8yxM1eLhJfuM7KXVP3zjhBvtMJCYRByoTT+wHXjpdMELv0xICFJX+1w4c7csa+WZEOsq4ItJ4RGwvzid6m/dw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/hyperschema/node_modules/bare-os": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "license": "Apache-2.0", + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/hyperschema/node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "dependencies": { + "bare-os": "^3.0.1" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -6232,6 +6898,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/index-encoder": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/index-encoder/-/index-encoder-3.4.0.tgz", + "integrity": "sha512-k3+ENtseFYI9ZPOIZzVH8LlONUvXAcd4jvCPo+Nob/T/2t5R5Rfh8XiFXBG++gHHuVby7HBDp/3YbyEmE481cg==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/inflight": { "version": "1.0.6", "dev": true, @@ -6544,6 +7219,12 @@ "dev": true, "license": "MIT" }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "license": "MIT" + }, "node_modules/is-regex": { "version": "1.1.4", "dev": true, @@ -7994,6 +8675,7 @@ "version": "4.8.4", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "optional": true, "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -8023,6 +8705,32 @@ "sodium-universal": "^4.0.0" } }, + "node_modules/noise-curve-ed/node_modules/sodium-native": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.3.3.tgz", + "integrity": "sha512-OnxSlN3uyY8D0EsLHpmm2HOFmKddQVvEMmsakCrXUzSd8kjjbzL413t4ZNF3n0UxSwNgwTyUvkmZHTfuCeiYSw==", + "license": "MIT", + "dependencies": { + "require-addon": "^1.1.0" + } + }, + "node_modules/noise-curve-ed/node_modules/sodium-universal": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.1.tgz", + "integrity": "sha512-sNp13PrxYLaUFHTGoDKkSDFvoEu51bfzE12RwGlqU1fcrkpAOK0NvizaJzOWV0Omtk9me2+Pnbjcf/l0efxuGQ==", + "license": "MIT", + "dependencies": { + "sodium-native": "^4.0.0" + }, + "peerDependencies": { + "sodium-javascript": "~0.8.0" + }, + "peerDependenciesMeta": { + "sodium-javascript": { + "optional": true + } + } + }, "node_modules/noise-handshake": { "version": "3.0.2", "license": "ISC", @@ -8032,6 +8740,32 @@ "sodium-universal": "^4.0.0" } }, + "node_modules/noise-handshake/node_modules/sodium-native": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.3.3.tgz", + "integrity": "sha512-OnxSlN3uyY8D0EsLHpmm2HOFmKddQVvEMmsakCrXUzSd8kjjbzL413t4ZNF3n0UxSwNgwTyUvkmZHTfuCeiYSw==", + "license": "MIT", + "dependencies": { + "require-addon": "^1.1.0" + } + }, + "node_modules/noise-handshake/node_modules/sodium-universal": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.1.tgz", + "integrity": "sha512-sNp13PrxYLaUFHTGoDKkSDFvoEu51bfzE12RwGlqU1fcrkpAOK0NvizaJzOWV0Omtk9me2+Pnbjcf/l0efxuGQ==", + "license": "MIT", + "dependencies": { + "sodium-native": "^4.0.0" + }, + "peerDependencies": { + "sodium-javascript": "~0.8.0" + }, + "peerDependenciesMeta": { + "sodium-javascript": { + "optional": true + } + } + }, "node_modules/normalize-package-data": { "version": "5.0.0", "dev": true, @@ -9033,6 +9767,7 @@ "version": "3.10.1", "resolved": "https://registry.npmjs.org/protomux/-/protomux-3.10.1.tgz", "integrity": "sha512-jgBqx8ZyaBWea/DFG4eOu1scOaeBwcnagiRC1XFVrjeGt7oAb0Pk5udPpBUpJ4DJBRjra50jD6YcZiQQTRqaaA==", + "license": "MIT", "dependencies": { "b4a": "^1.3.1", "compact-encoding": "^2.5.1", @@ -9395,6 +10130,9 @@ }, "node_modules/read-write-mutexify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/read-write-mutexify/-/read-write-mutexify-2.1.0.tgz", + "integrity": "sha512-fDw/p5/acI1ytVY1UbxEDma/ej1yJH/n9NcjS9YNzcE6sPBPWdlru3ydRa/UBowUg4zqOvNMD5SOGYJrlQ6MzQ==", + "dev": true, "license": "MIT" }, "node_modules/readable-stream": { @@ -9437,8 +10175,13 @@ } }, "node_modules/ready-resource": { - "version": "1.0.0", - "license": "MIT" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ready-resource/-/ready-resource-1.2.0.tgz", + "integrity": "sha512-nfcco/8iAFV0M+2PYnmIc+/xY0iRb35d42HFHQ7AfjulbGEAFa+XWpByfwSyeVeiBoMLLFVMv1HixxNCqzSQ1g==", + "license": "MIT", + "dependencies": { + "bare-events": "^2.2.0" + } }, "node_modules/real-require": { "version": "0.2.0", @@ -9463,6 +10206,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/refcounter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/refcounter/-/refcounter-1.0.0.tgz", + "integrity": "sha512-1WosVzUy0kPUaPMEtlNDwm99UsteALIhXXR8rerELoa63WkYIXAl0hxgwPFrIYBRWZPGUyekQ04FRtPJ7dHk9w==", + "license": "Apache-2.0" + }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", @@ -9490,6 +10239,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/require-addon": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/require-addon/-/require-addon-1.1.0.tgz", + "integrity": "sha512-KbXAD5q2+v1GJnkzd8zzbOxchTkStSyJZ9QwoCq3QwEXAaIlG3wDYRZGzVD357jmwaGY7hr5VaoEAL0BkF0Kvg==", + "license": "Apache-2.0", + "dependencies": { + "bare-addon-resolve": "^1.3.0", + "bare-url": "^2.1.0" + }, + "engines": { + "bare": ">=1.10.0" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "license": "MIT", @@ -9530,6 +10292,12 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/resolve-reject-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-reject-promise/-/resolve-reject-promise-1.1.0.tgz", + "integrity": "sha512-LWsTOA91AqzBTjSGgX79Tc130pwcBK6xjpJEO+qRT5IKZ6bGnHKcc8QL3upUBcWuU8OTIDzKK2VNSwmmlqvAVg==", + "license": "MIT" + }, "node_modules/restore-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", @@ -9654,6 +10422,24 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rocksdb-native": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/rocksdb-native/-/rocksdb-native-3.9.0.tgz", + "integrity": "sha512-BSLZ1MUjJCBov0giDhYYDgw5WPXUTNAS2zsSBTFnkVyKnDAzwcFRBPWFhmqFox2gEG5ege/DTRWnDff7feLoZg==", + "license": "Apache-2.0", + "dependencies": { + "compact-encoding": "^2.15.0", + "ready-resource": "^1.0.0", + "refcounter": "^1.0.0", + "require-addon": "^1.0.2", + "resolve-reject-promise": "^1.1.0", + "signal-promise": "^1.0.3", + "streamx": "^2.16.1" + }, + "engines": { + "bare": ">=1.16.0" + } + }, "node_modules/rpc-reflector": { "version": "1.3.11", "resolved": "https://registry.npmjs.org/rpc-reflector/-/rpc-reflector-1.3.11.tgz", @@ -9812,6 +10598,12 @@ "version": "1.0.0", "license": "MIT" }, + "node_modules/scope-lock": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/scope-lock/-/scope-lock-1.2.4.tgz", + "integrity": "sha512-BpSd8VCuCxW9ZitcdIC/vjs3gMaP9bRBL5nkHcyfX2VrS52n13/rHuBA2xJ/S/4DPuRdAO/Bk8pWd8eD/gHCIA==", + "license": "Apache-2.0" + }, "node_modules/secure-json-parse": { "version": "2.7.0", "license": "BSD-3-Clause" @@ -9981,6 +10773,12 @@ "dev": true, "license": "ISC" }, + "node_modules/signal-promise": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/signal-promise/-/signal-promise-1.0.3.tgz", + "integrity": "sha512-WBgv0UnIq2C+Aeh0/n+IRpP6967eIx9WpynTUoiW3isPpfe1zu2LJzyfXdo9Tgef8yR/sGjcMvoUXD7EYdiz+g==", + "license": "MIT" + }, "node_modules/signed-varint": { "version": "2.0.1", "license": "MIT", @@ -10143,11 +10941,16 @@ } }, "node_modules/sodium-native": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.3.1.tgz", - "integrity": "sha512-YdP64gAdpIKHfL4ttuX4aIfjeunh9f+hNeQJpE9C8UMndB3zkgZ7YmmGT4J2+v6Ibyp6Wem8D1TcSrtdW0bqtg==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-5.0.8.tgz", + "integrity": "sha512-2ZxmF9Llvo/3X3NAc8VV6JFoswObg9u27Q8Be4BtCLDiejXuTt6Nm7+iIWUv+WMcs1eJ7YV5U2f4e8LidfIlRQ==", + "license": "MIT", "dependencies": { - "node-gyp-build": "^4.8.0" + "require-addon": "^1.1.0", + "which-runtime": "^1.2.1" + }, + "engines": { + "bare": ">=1.16.0" } }, "node_modules/sodium-secretstream": { @@ -10158,10 +10961,20 @@ "sodium-universal": "^4.0.0" } }, - "node_modules/sodium-universal": { + "node_modules/sodium-secretstream/node_modules/sodium-native": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.3.3.tgz", + "integrity": "sha512-OnxSlN3uyY8D0EsLHpmm2HOFmKddQVvEMmsakCrXUzSd8kjjbzL413t4ZNF3n0UxSwNgwTyUvkmZHTfuCeiYSw==", + "license": "MIT", + "dependencies": { + "require-addon": "^1.1.0" + } + }, + "node_modules/sodium-secretstream/node_modules/sodium-universal": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.1.tgz", "integrity": "sha512-sNp13PrxYLaUFHTGoDKkSDFvoEu51bfzE12RwGlqU1fcrkpAOK0NvizaJzOWV0Omtk9me2+Pnbjcf/l0efxuGQ==", + "license": "MIT", "dependencies": { "sodium-native": "^4.0.0" }, @@ -10174,6 +10987,23 @@ } } }, + "node_modules/sodium-universal": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-5.0.1.tgz", + "integrity": "sha512-rv+aH+tnKB5H0MAc2UadHShLMslpJsc4wjdnHRtiSIEYpOetCgu8MS4ExQRia+GL/MK3uuCyZPeEsi+J3h+Q+Q==", + "license": "MIT", + "dependencies": { + "sodium-native": "^5.0.1" + }, + "peerDependencies": { + "sodium-javascript": "~0.8.0" + }, + "peerDependenciesMeta": { + "sodium-javascript": { + "optional": true + } + } + }, "node_modules/sonic-boom": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.1.0.tgz", @@ -10269,6 +11099,12 @@ "dev": true, "license": "CC0-1.0" }, + "node_modules/speedometer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.1.0.tgz", + "integrity": "sha512-z/wAiTESw2XVPssY2XRcme4niTc4S5FkkJ4gknudtVoc33Zil8TdTxHy5torRcgqMqksJV2Yz8HQcvtbsnw0mQ==", + "license": "MIT" + }, "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -10352,16 +11188,14 @@ "license": "MIT" }, "node_modules/streamx": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.19.0.tgz", - "integrity": "sha512-5z6CNR4gtkPbwlxyEqoDGDmWIzoNJqCBt4Eac1ICP9YaIT08ct712cFj0u1rx4F8luAuL+3Qc+RFIdI4OX00kg==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "license": "MIT", "dependencies": { + "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" } }, "node_modules/string_decoder": { @@ -11452,8 +12286,7 @@ "node_modules/which-runtime": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/which-runtime/-/which-runtime-1.2.1.tgz", - "integrity": "sha512-8feIHccQFH/whiA1fD1b4c5+Q7T4ry1g1oHYc2mHnFh81tTQFsCvy3zhS2geUapkFAVBddUT/AM1a3rbqJweFg==", - "optional": true + "integrity": "sha512-8feIHccQFH/whiA1fD1b4c5+Q7T4ry1g1oHYc2mHnFh81tTQFsCvy3zhS2geUapkFAVBddUT/AM1a3rbqJweFg==" }, "node_modules/which-typed-array": { "version": "1.1.11", @@ -11533,6 +12366,7 @@ }, "node_modules/xache": { "version": "1.1.0", + "dev": true, "license": "MIT" }, "node_modules/xsalsa20": { diff --git a/package.json b/package.json index 56b17eb8..488f3021 100644 --- a/package.json +++ b/package.json @@ -171,23 +171,23 @@ "@mapeo/sqlite-indexer": "^1.0.2", "@sinclair/typebox": "^0.33.17", "@sindresorhus/merge-streams": "^4.0.0", - "b4a": "^1.6.3", + "b4a": "^1.7.2", "bcp-47": "^2.1.0", "better-sqlite3": "^11.10.0", "big-sparse-array": "^1.0.3", "bogon": "^1.1.0", "compact-encoding": "^2.12.0", - "corestore": "6.8.4", + "corestore": "^7.4.7", "debug": "^4.3.4", "dot-prop": "^9.0.0", "drizzle-orm": "^0.30.8", "ensure-error": "^4.0.0", "fastify": "^4.0.0", "fastify-plugin": "^4.5.1", - "hyperblobs": "2.3.0", - "hypercore": "10.19.0", - "hypercore-crypto": "3.4.2", - "hyperdrive": "11.5.3", + "hyperblobs": "^2.8.0", + "hypercore": "^11.16.2", + "hypercore-crypto": "^3.6.1", + "hyperdrive": "^13.0.1", "json-stable-stringify": "^1.1.1", "magic-bytes.js": "^1.10.0", "map-obj": "^5.0.2", @@ -197,11 +197,11 @@ "p-event": "^6.0.1", "p-timeout": "^6.1.2", "protobufjs": "^7.2.3", - "protomux": "^3.4.1", + "protomux": "^3.10.1", "quickbit-universal": "^2.2.0", - "sodium-universal": "^4.0.0", + "sodium-universal": "^5.0.1", "start-stop-state-machine": "^1.2.0", - "streamx": "^2.19.0", + "streamx": "^2.23.0", "string-timing-safe-equal": "^0.1.0", "styled-map-package": "^3.0.0", "sub-encoder": "^2.1.1", diff --git a/src/blob-store/hyperdrive-index.js b/src/blob-store/hyperdrive-index.js index 0f239bdf..a669c5fb 100644 --- a/src/blob-store/hyperdrive-index.js +++ b/src/blob-store/hyperdrive-index.js @@ -89,6 +89,10 @@ class PretendCorestore { // @ts-ignore opts.publicKey = opts.key } + if ('keyPair' in opts) { + // @ts-ignore + opts.publicKey = opts.keyPair.publicKey + } if ('publicKey' in opts) { // NB! We should always add blobIndex (Hyperbee) cores to the core manager // before we use them here. We would only reach the addCore path if the diff --git a/src/core-manager/index.js b/src/core-manager/index.js index 534d2ca3..dcc1de3f 100644 --- a/src/core-manager/index.js +++ b/src/core-manager/index.js @@ -64,7 +64,7 @@ export class CoreManager extends TypedEmitter { * @param {Buffer} options.projectKey 32-byte public key of the project creator core * @param {Buffer} [options.projectSecretKey] 32-byte secret key of the project creator core * @param {Partial>} [options.encryptionKeys] Encryption keys for each namespace - * @param {import('hypercore').HypercoreStorage} options.storage Folder to store all hypercore data + * @param {string} options.storage Folder to store all hypercore data * @param {boolean} [options.autoDownload=true] Immediately start downloading cores - should only be set to false for tests * @param {Logger} [options.logger] */ @@ -290,11 +290,13 @@ export class CoreManager extends TypedEmitter { const existingCore = this.#coreIndex.getByCoreKey(keyPair.publicKey) if (existingCore) return existingCore + const encryptionKey = this.#encryptionKeys[namespace] + const { publicKey: key, secretKey } = keyPair const writer = !!secretKey const core = this.#corestore.get({ keyPair, - encryptionKey: this.#encryptionKeys[namespace], + encryptionKey: encryptionKey ? { key: encryptionKey } : undefined, }) if (this.#autoDownload && namespace !== 'blob') { // Blob downloads are managed by BlobStore @@ -302,8 +304,8 @@ export class CoreManager extends TypedEmitter { } // Every peer adds a listener, so could have many peers core.setMaxListeners(0) - // @ts-ignore - ensure key is defined before hypercore is ready - core.key = key + // // @ts-ignore - ensure key is defined before hypercore is ready + // core.key = key this.#coreIndex.add({ core, key, namespace, writer }) // **Hack** As soon as a peer is added, eagerly send a "want" for the entire diff --git a/src/datastore/index.js b/src/datastore/index.js index dab7458f..fbf8d594 100644 --- a/src/datastore/index.js +++ b/src/datastore/index.js @@ -146,6 +146,7 @@ export class DataStore extends TypedEmitter { ) } const block = encode(doc) + console.log({ block }) // The indexer batch can sometimes complete before the append below // resolves, so in the batch function we await any pending appends. We can't // know the versionId before the append, because docs can be written in the @@ -166,6 +167,7 @@ export class DataStore extends TypedEmitter { const deferred = pDefer() this.#pendingIndex.set(versionId, deferred) await deferred.promise + console.log('wrote', doc) this.#pendingIndex.delete(versionId) return /** @type {Extract} */ ( diff --git a/src/index-writer/index-writer.js b/src/index-writer/index-writer.js new file mode 100644 index 00000000..948e9064 --- /dev/null +++ b/src/index-writer/index-writer.js @@ -0,0 +1,106 @@ +import { decode } from '@comapeo/schema' +import SqliteIndexer from '@mapeo/sqlite-indexer' +import { getBacklinkTableName } from '../schema/utils.js' +import { discoveryKey } from 'hypercore-crypto' +import { Logger } from '../logger.js' +import { mapDoc } from './map-doc.js' +import { getWinner } from './get-winner.js' +/** @import { MapeoDoc } from '@comapeo/schema' */ +/** + * @typedef {{ [K in MapeoDoc['schemaName']]?: string[] }} IndexedDocIds + */ +/** + * @typedef {MapeoDoc['schemaName']} SchemaName + */ + +export class IndexWriter { + /** @type {Map} */ + #indexers = new Map() + #mapDoc + #l + /** + * + * @param {object} opts + * @param {import('better-sqlite3').Database} opts.sqlite + * @param {Iterable} opts.schemas + * @param {Logger} [opts.logger] + */ + constructor({ schemas, sqlite, logger }) { + this.#l = Logger.create('indexWriter', logger) + this.#mapDoc = mapDoc + + for (const schemaName of schemas) { + const indexer = new SqliteIndexer(sqlite, { + docTableName: schemaName, + backlinkTableName: getBacklinkTableName(schemaName), + getWinner, + }) + this.#indexers.set(schemaName, indexer) + } + } + + /** + * @param {import('multi-core-indexer').Entry[]} entries + * @returns {Promise} map of indexed docIds by schemaName + */ + async batch(entries) { + // sqlite-indexer is _significantly_ faster when batching even <10 at a + // time, so best to queue docs here before calling sliteIndexer.batch() + /** @type {Record} */ + const queued = {} + /** @type {IndexedDocIds} */ + const indexed = {} + for (const { block, key, index } of entries) { + /** @type {MapeoDoc} */ let doc + try { + const version = { coreDiscoveryKey: discoveryKey(key), index } + doc = this.#mapDoc(decode(block, version), version) + } catch (e) { + this.#l.log('Could not decode entry %d of %h', index, key) + console.trace('Could not decode entry %d of %h', index, key, e.stack) + // Unknown or invalid entry - silently ignore + continue + } + // Don't have an indexer for this type - silently ignore + if (!this.#indexers.has(doc.schemaName)) continue + if (queued[doc.schemaName]) { + queued[doc.schemaName].push(doc) + // @ts-expect-error - we know this is defined, TS doesn't + indexed[doc.schemaName].push(doc.docId) + } else { + queued[doc.schemaName] = [doc] + indexed[doc.schemaName] = [doc.docId] + } + } + for (const [schemaName, docs] of Object.entries(queued)) { + // @ts-expect-error + const indexer = this.#indexers.get(schemaName) + if (!indexer) continue // Won't happen, but TS doesn't know that + indexer.batch(docs) + // TODO: selectively turn this on when log level is 'trace' or 'debug' + // Otherwise this has a big performance overhead because this is all synchronous + // if (this.#l.log.enabled) { + // for (const doc of docs) { + // this.#l.log( + // 'Indexed %s %S @ %S', + // doc.schemaName, + // doc.docId, + // doc.versionId + // ) + // } + // } + } + return indexed + } + + /** + * @param {SchemaName} schemaName + */ + async deleteSchema(schemaName) { + const indexer = this.#indexers.get(schemaName) + if (!indexer) { + throw new Error(`IndexWriter doesn't know a schema named "${schemaName}"`) + } + await indexer.deleteAll() + } +} diff --git a/src/mapeo-manager.js b/src/mapeo-manager.js index 60694b6a..89041ec6 100644 --- a/src/mapeo-manager.js +++ b/src/mapeo-manager.js @@ -5,7 +5,6 @@ import Database from 'better-sqlite3' import { eq } from 'drizzle-orm' import { drizzle } from 'drizzle-orm/better-sqlite3' import { migrate } from 'drizzle-orm/better-sqlite3/migrator' -import Hypercore from 'hypercore' import { TypedEmitter } from 'tiny-typed-emitter' import pTimeout from 'p-timeout' import { createRequire } from 'module' @@ -41,7 +40,6 @@ import { import { UNIX_EPOCH_DATE } from './constants.js' import { openedNoiseSecretStream } from './lib/noise-secret-stream-helpers.js' import { omit } from './lib/omit.js' -import { RandomAccessFilePool } from './core-manager/random-access-file-pool.js' import BlobServerPlugin from './fastify-plugins/blobs.js' import IconServerPlugin from './fastify-plugins/icons.js' import { plugin as MapServerPlugin } from './fastify-plugins/maps.js' @@ -71,12 +69,6 @@ import { WebSocket } from 'ws' const CLIENT_SQLITE_FILE_NAME = 'client.db' -// Max file descriptors that RandomAccessFile should use for hypercore storage -// and index bitfield persistence (used by MultiCoreIndexer). Android has a -// limit of 1024 per process, so choosing 768 to leave 256 descriptors free for -// other things e.g. SQLite and other parts of the app. -const MAX_FILE_DESCRIPTORS = 768 - // Prefix names for routes registered with http server const BLOBS_PREFIX = 'blobs' const ICONS_PREFIX = 'icons' @@ -133,7 +125,7 @@ export class MapeoManager extends TypedEmitter { * @param {string} opts.dbFolder Folder for sqlite Dbs. Folder must exist. Use ':memory:' to store everything in-memory * @param {string} opts.projectMigrationsFolder path for drizzle migrations folder for project database * @param {string} opts.clientMigrationsFolder path for drizzle migrations folder for client database - * @param {string | CoreStorage} opts.coreStorage Folder for hypercore storage or a function that returns a RandomAccessStorage instance + * @param {string} opts.coreStorage Folder for hypercore storage or a function that returns a RandomAccessStorage instance * @param {import('fastify').FastifyInstance} opts.fastify Fastify server instance * @param {String} [opts.defaultConfigPath] * @param {string} [opts.customMapPath] File path to a locally stored Styled Map Package (SMP). @@ -164,6 +156,9 @@ export class MapeoManager extends TypedEmitter { this.#makeWebsocket = makeWebsocket const logger = (this.#loggerBase = new Logger({ deviceId: this.#deviceId })) this.#l = Logger.create('manager', logger) + if (dbFolder === ':memory:') { + throw new Error('In-Memory storage not supported as of 5.0.0') + } this.#dbFolder = dbFolder this.#projectMigrationsFolder = projectMigrationsFolder const sqlite = new Database( @@ -206,13 +201,8 @@ export class MapeoManager extends TypedEmitter { logger, }) - if (typeof coreStorage === 'string') { - const pool = new RandomAccessFilePool(MAX_FILE_DESCRIPTORS) - // @ts-expect-error - this.#coreStorage = Hypercore.defaultStorage(coreStorage, { pool }) - } else { - this.#coreStorage = coreStorage - } + // Must be a string now! + this.#coreStorage = coreStorage this.#fastify = fastify this.#fastify.register(BlobServerPlugin, { @@ -329,11 +319,8 @@ export class MapeoManager extends TypedEmitter { */ #projectStorage(projectId) { return { - dbPath: - this.#dbFolder === ':memory:' - ? ':memory:' - : path.join(this.#dbFolder, projectId + '.db'), - coreStorage: (name) => this.#coreStorage(path.join(projectId, name)), + dbPath: path.join(this.#dbFolder, projectId + '.db'), + coreStorage: path.join(this.#coreStorage, projectId), } } diff --git a/src/mapeo-project.js b/src/mapeo-project.js index 0bb67b3c..6d169aa7 100644 --- a/src/mapeo-project.js +++ b/src/mapeo-project.js @@ -10,6 +10,7 @@ import * as b4a from 'b4a' import mime from 'mime/lite' // @ts-expect-error import { Readable, pipelinePromise } from 'streamx' +import RandomAccessFile from 'random-access-file' import { NAMESPACES, NAMESPACE_SCHEMAS, UNIX_EPOCH_DATE } from './constants.js' import { CoreManager } from './core-manager/index.js' @@ -220,13 +221,16 @@ export class MapeoProject extends TypedEmitter { ///////// 3. Setup random-access-storage functions - /** @type {ConstructorParameters[0]['storage']} */ - const coreManagerStorage = (name) => - coreStorage(path.join(CORESTORE_STORAGE_FOLDER_NAME, name)) + const coreManagerStorage = path.join( + coreStorage, + CORESTORE_STORAGE_FOLDER_NAME + ) /** @type {ConstructorParameters[0]['storage']} */ const indexerStorage = (name) => - coreStorage(path.join(INDEXER_STORAGE_FOLDER_NAME, name)) + new RandomAccessFile( + path.join(coreStorage, INDEXER_STORAGE_FOLDER_NAME, name) + ) ///////// 4. Create instances diff --git a/test-e2e/manager-basic.js b/test-e2e/manager-basic.js index b89a2132..1d0a0313 100644 --- a/test-e2e/manager-basic.js +++ b/test-e2e/manager-basic.js @@ -5,7 +5,7 @@ import { KeyManager } from '@mapeo/crypto' import RAM from 'random-access-memory' import { MapeoManager } from '../src/mapeo-manager.js' import Fastify from 'fastify' -import { getExpectedConfig } from './utils.js' +import { getExpectedConfig, createManager } from './utils.js' import { defaultConfigPath } from '../test/helpers/default-config.js' import { kDataTypes } from '../src/mapeo-project.js' import { hashObject } from '../src/utils.js' @@ -15,15 +15,8 @@ const projectMigrationsFolder = new URL('../drizzle/project', import.meta.url) const clientMigrationsFolder = new URL('../drizzle/client', import.meta.url) .pathname -test('Managing created projects', async (t) => { - const manager = new MapeoManager({ - rootKey: KeyManager.generateRootKey(), - projectMigrationsFolder, - clientMigrationsFolder, - dbFolder: ':memory:', - coreStorage: () => new RAM(), - fastify: Fastify(), - }) +test.only('Managing created projects', async (t) => { + const manager = createManager('t1', t) const project1Id = await manager.createProject() const project2Id = await manager.createProject({ name: 'project 2' }) @@ -169,15 +162,7 @@ test('Managing created projects', async (t) => { }) test('Consistent loading of config', async (t) => { - const manager = new MapeoManager({ - rootKey: KeyManager.generateRootKey(), - projectMigrationsFolder, - clientMigrationsFolder, - dbFolder: ':memory:', - coreStorage: () => new RAM(), - fastify: Fastify(), - defaultConfigPath, - }) + const manager = createManager('t2', t) const expectedDefault = await getExpectedConfig(defaultConfigPath) const expectedMinimal = await getExpectedConfig( @@ -285,14 +270,7 @@ test('Consistent loading of config', async (t) => { }) test('Managing added projects', async (t) => { - const manager = new MapeoManager({ - rootKey: KeyManager.generateRootKey(), - projectMigrationsFolder, - clientMigrationsFolder, - dbFolder: ':memory:', - coreStorage: () => new RAM(), - fastify: Fastify(), - }) + const manager = createManager('t3', t) const project1Id = await manager.addProject( { @@ -368,15 +346,8 @@ test('Managing added projects', async (t) => { ) }) -test('Managing both created and added projects', async () => { - const manager = new MapeoManager({ - rootKey: KeyManager.generateRootKey(), - projectMigrationsFolder, - clientMigrationsFolder, - dbFolder: ':memory:', - coreStorage: () => new RAM(), - fastify: Fastify(), - }) +test('Managing both created and added projects', async (t) => { + const manager = createManager('t4', t) const createdProjectId = await manager.createProject({ name: 'created project', @@ -412,15 +383,8 @@ test('Managing both created and added projects', async () => { assert(addedProject) }) -test('Manager cannot add project that already exists', async () => { - const manager = new MapeoManager({ - rootKey: KeyManager.generateRootKey(), - projectMigrationsFolder, - clientMigrationsFolder, - dbFolder: ':memory:', - coreStorage: () => new RAM(), - fastify: Fastify(), - }) +test('Manager cannot add project that already exists', async (t) => { + const manager = createManager('t4', t) const existingProjectId = await manager.createProject() @@ -441,7 +405,7 @@ test('Manager cannot add project that already exists', async () => { assert.equal(existingProjectsCountBefore, existingProjectsCountAfter) }) -test('Consistent storage folders', async () => { +test.skip('Consistent storage folders', async () => { /** @type {string[]} */ const storageNames = [] const manager = new MapeoManager({ @@ -478,14 +442,7 @@ test('Consistent storage folders', async () => { }) test('Reusing port after start/stop of discovery', async (t) => { - const manager = new MapeoManager({ - rootKey: KeyManager.generateRootKey(), - projectMigrationsFolder, - clientMigrationsFolder, - dbFolder: ':memory:', - coreStorage: () => new RAM(), - fastify: Fastify(), - }) + const manager = createManager('t1', t) t.after(() => manager.stopLocalPeerDiscoveryServer())