diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..02ec759 --- /dev/null +++ b/bun.lock @@ -0,0 +1,1155 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "nostrudel-bakery", + "dependencies": { + "@diva.exchange/i2p-sam": "^5.4.2", + "@noble/hashes": "^1.7.1", + "@satellite-earth/core": "^0.5.0", + "applesauce-core": "^0.11.0", + "applesauce-factory": "^0.11.0", + "applesauce-loaders": "^0.11.0", + "applesauce-signers": "^0.11.0", + "blossom-client-sdk": "^2.1.1", + "cors": "^2.8.5", + "dayjs": "^1.11.13", + "debug": "^4.4.0", + "dotenv": "^16.4.7", + "express": "^4.21.2", + "get-port": "^7.1.0", + "hash-sum": "^2.0.0", + "holesail-server": "^1.4.4", + "hyper-address": "^0.1.3", + "hyper-socks5-proxy": "^0.1.2", + "hyperdht": "^6.20.1", + "import-meta-resolve": "^4.1.0", + "lodash.throttle": "^4.1.1", + "lowdb": "^7.0.1", + "mkdirp": "^3.0.1", + "nanoid": "^5.1.0", + "nostr-tools": "^2.10.4", + "pac-proxy-agent": "^7.2.0", + "process-streams": "^1.0.3", + "rx-nostr": "^3.5.0", + "rxjs": "^7.8.1", + "streamx": "^2.22.0", + "unique-names-generator": "^4.7.1", + "web-push": "^3.6.7", + "ws": "^8.18.1", + }, + "devDependencies": { + "@changesets/cli": "^2.28.1", + "@swc-node/register": "^1.10.9", + "@swc/core": "^1.10.18", + "@types/bun": "^1.2.4", + "@types/cors": "^2.8.17", + "@types/debug": "^4.1.12", + "@types/express": "^4.17.21", + "@types/hash-sum": "^1.0.2", + "@types/lodash.throttle": "^4.1.9", + "@types/node": "^22.13.4", + "@types/web-push": "^3.6.4", + "@types/ws": "^8.5.14", + "nodemon": "^3.1.9", + "prettier": "^3.5.1", + "typescript": "^5.7.3", + }, + }, + }, + "packages": { + "@babel/runtime": ["@babel/runtime@7.26.9", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg=="], + + "@cashu/cashu-ts": ["@cashu/cashu-ts@2.2.1", "", { "dependencies": { "@cashu/crypto": "^0.3.4", "@noble/curves": "^1.3.0", "@noble/hashes": "^1.3.3", "buffer": "^6.0.3" } }, "sha512-/A8Lfkf7nexldcAcTbqrITXxwgiCYTTnrthB8DoipLVeDfyUXer48FJdUmXpRp87Aijn2BNklo8qA0yO0kHXaA=="], + + "@cashu/crypto": ["@cashu/crypto@0.3.4", "", { "dependencies": { "@noble/curves": "^1.6.0", "@noble/hashes": "^1.5.0", "@scure/bip32": "^1.5.0", "@scure/bip39": "^1.4.0", "buffer": "^6.0.3" } }, "sha512-mfv1Pj4iL1PXzUj9NKIJbmncCLMqYfnEDqh/OPxAX0nNBt6BOnVJJLjLWFlQeYxlnEfWABSNkrqPje1t5zcyhA=="], + + "@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.0.10", "", { "dependencies": { "@changesets/config": "^3.1.1", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.2", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-wNyeIJ3yDsVspYvHnEz1xQDq18D9ifed3lI+wxRQRK4pArUcuHgCTrHv0QRnnwjhVCQACxZ+CBih3wgOct6UXw=="], + + "@changesets/assemble-release-plan": ["@changesets/assemble-release-plan@6.0.6", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, "sha512-Frkj8hWJ1FRZiY3kzVCKzS0N5mMwWKwmv9vpam7vt8rZjLL1JMthdh6pSDVSPumHPshTTkKZ0VtNbE0cJHZZUg=="], + + "@changesets/changelog-git": ["@changesets/changelog-git@0.2.1", "", { "dependencies": { "@changesets/types": "^6.1.0" } }, "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q=="], + + "@changesets/cli": ["@changesets/cli@2.28.1", "", { "dependencies": { "@changesets/apply-release-plan": "^7.0.10", "@changesets/assemble-release-plan": "^6.0.6", "@changesets/changelog-git": "^0.2.1", "@changesets/config": "^3.1.1", "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/get-release-plan": "^4.0.8", "@changesets/git": "^3.0.2", "@changesets/logger": "^0.1.1", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.3", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@changesets/write": "^0.4.0", "@manypkg/get-packages": "^1.1.3", "ansi-colors": "^4.1.3", "ci-info": "^3.7.0", "enquirer": "^2.4.1", "external-editor": "^3.1.0", "fs-extra": "^7.0.1", "mri": "^1.2.0", "p-limit": "^2.2.0", "package-manager-detector": "^0.2.0", "picocolors": "^1.1.0", "resolve-from": "^5.0.0", "semver": "^7.5.3", "spawndamnit": "^3.0.1", "term-size": "^2.1.0" }, "bin": { "changeset": "bin.js" } }, "sha512-PiIyGRmSc6JddQJe/W1hRPjiN4VrMvb2VfQ6Uydy2punBioQrsxppyG5WafinKcW1mT0jOe/wU4k9Zy5ff21AA=="], + + "@changesets/config": ["@changesets/config@3.1.1", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/logger": "^0.1.1", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1", "micromatch": "^4.0.8" } }, "sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA=="], + + "@changesets/errors": ["@changesets/errors@0.2.0", "", { "dependencies": { "extendable-error": "^0.1.5" } }, "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow=="], + + "@changesets/get-dependents-graph": ["@changesets/get-dependents-graph@2.1.3", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "picocolors": "^1.1.0", "semver": "^7.5.3" } }, "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ=="], + + "@changesets/get-release-plan": ["@changesets/get-release-plan@4.0.8", "", { "dependencies": { "@changesets/assemble-release-plan": "^6.0.6", "@changesets/config": "^3.1.1", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.3", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-MM4mq2+DQU1ZT7nqxnpveDMTkMBLnwNX44cX7NSxlXmr7f8hO6/S2MXNiXG54uf/0nYnefv0cfy4Czf/ZL/EKQ=="], + + "@changesets/get-version-range-type": ["@changesets/get-version-range-type@0.4.0", "", {}, "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ=="], + + "@changesets/git": ["@changesets/git@3.0.2", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@manypkg/get-packages": "^1.1.3", "is-subdir": "^1.1.1", "micromatch": "^4.0.8", "spawndamnit": "^3.0.1" } }, "sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ=="], + + "@changesets/logger": ["@changesets/logger@0.1.1", "", { "dependencies": { "picocolors": "^1.1.0" } }, "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg=="], + + "@changesets/parse": ["@changesets/parse@0.4.1", "", { "dependencies": { "@changesets/types": "^6.1.0", "js-yaml": "^3.13.1" } }, "sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q=="], + + "@changesets/pre": ["@changesets/pre@2.0.2", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1" } }, "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug=="], + + "@changesets/read": ["@changesets/read@0.6.3", "", { "dependencies": { "@changesets/git": "^3.0.2", "@changesets/logger": "^0.1.1", "@changesets/parse": "^0.4.1", "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "p-filter": "^2.1.0", "picocolors": "^1.1.0" } }, "sha512-9H4p/OuJ3jXEUTjaVGdQEhBdqoT2cO5Ts95JTFsQyawmKzpL8FnIeJSyhTDPW1MBRDnwZlHFEM9SpPwJDY5wIg=="], + + "@changesets/should-skip-package": ["@changesets/should-skip-package@0.1.2", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw=="], + + "@changesets/types": ["@changesets/types@6.1.0", "", {}, "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA=="], + + "@changesets/write": ["@changesets/write@0.4.0", "", { "dependencies": { "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "human-id": "^4.1.1", "prettier": "^2.7.1" } }, "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q=="], + + "@diva.exchange/i2p-sam": ["@diva.exchange/i2p-sam@5.4.2", "", { "dependencies": { "nanoid": "^5.0.9", "rfc4648": "^1.5.4" } }, "sha512-uaYZlSHdqxOQhtmPzO8g/Hzdp2Vd5rQ5wZMDPYeLUr2FOMYc0pwRpThyc6GfPQ8d0yTAbqemzu/uEGARxJ/gtA=="], + + "@emnapi/core": ["@emnapi/core@1.3.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.1", "tslib": "^2.4.0" } }, "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.3.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw=="], + + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw=="], + + "@holesail/hyper-cmd-lib-net": ["@holesail/hyper-cmd-lib-net@0.2.1", "", { "dependencies": { "bare-dgram": "^1.0.1" } }, "sha512-I7ZZj4ZplLwbhBCDZiWpGrcsemkssLjY4ZSH9SbsmJcM4b49zlz6ZQOzDsAI1pruOyPdatjc/wAkKQzTRK6w7Q=="], + + "@hyperswarm/secret-stream": ["@hyperswarm/secret-stream@6.7.1", "", { "dependencies": { "b4a": "^1.1.0", "hypercore-crypto": "^3.3.1", "noise-curve-ed": "^2.0.1", "noise-handshake": "^3.0.2", "sodium-secretstream": "^1.1.0", "sodium-universal": "^4.0.0", "streamx": "^2.14.0", "timeout-refresh": "^2.0.0", "unslab": "^1.3.0" } }, "sha512-isb18Pt6lXBpOQMRmpqItw+kYynXilOFyOhto/RMP15WQtTWC0rR5jfZPYXU7ZYV6Kxd2lyQ4ZBevoIcvEJHEQ=="], + + "@manypkg/find-root": ["@manypkg/find-root@1.1.0", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@types/node": "^12.7.1", "find-up": "^4.1.0", "fs-extra": "^8.1.0" } }, "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA=="], + + "@manypkg/get-packages": ["@manypkg/get-packages@1.1.3", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@changesets/types": "^4.0.1", "@manypkg/find-root": "^1.1.0", "fs-extra": "^8.1.0", "globby": "^11.0.0", "read-yaml-file": "^1.1.0" } }, "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A=="], + + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.7", "", { "dependencies": { "@emnapi/core": "^1.3.1", "@emnapi/runtime": "^1.3.1", "@tybys/wasm-util": "^0.9.0" } }, "sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw=="], + + "@noble/ciphers": ["@noble/ciphers@0.5.3", "", {}, "sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w=="], + + "@noble/curves": ["@noble/curves@1.2.0", "", { "dependencies": { "@noble/hashes": "1.3.2" } }, "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw=="], + + "@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + + "@noble/secp256k1": ["@noble/secp256k1@1.7.1", "", {}, "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@1.12.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-wYe+dlF8npM7cwopOOxbdNjtmJp17e/xF5c0K2WooQXy5VOh74icydM33+Uh/SZDgwyum09/U1FVCX5GdeQk+A=="], + + "@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@1.12.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-FZxxp99om+SlvBr1cjzF8A3TjYcS0BInCqjUlM+2f9m9bPTR2Bng9Zq5Q09ZQyrKJjfGKqlOEHs3akuVOnrx3Q=="], + + "@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@1.12.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-BZi0iU6IEOnXGSkqt1OjTTkN9wfyaK6kTpQwL/axl8eCcNDc7wbv1vloHgILf7ozAY1TP75nsLYlASYI4B5kGA=="], + + "@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@1.12.0", "", { "os": "linux", "cpu": "arm" }, "sha512-L2qnMEnZAqxbG9b1J3di/w/THIm+1fMVfbbTMWIQNMMXdMeqqDN6ojnOLDtuP564rAh4TBFPdLyEfGhMz6ipNA=="], + + "@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@1.12.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-otVbS4zeo3n71zgGLBYRTriDzc0zpruC0WI3ICwjpIk454cLwGV0yzh4jlGYWQJYJk0BRAmXFd3ooKIF+bKBHw=="], + + "@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@1.12.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-IStQDjIT7Lzmqg1i9wXvPL/NsYsxF24WqaQFS8b8rxra+z0VG7saBOsEnOaa4jcEY8MVpLYabFhTV+fSsA2vnA=="], + + "@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@1.12.0", "", { "os": "linux", "cpu": "x64" }, "sha512-SipT7EVORz8pOQSFwemOm91TpSiBAGmOjG830/o+aLEsvQ4pEy223+SAnCfITh7+AahldYsJnVoIs519jmIlKQ=="], + + "@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@1.12.0", "", { "os": "linux", "cpu": "x64" }, "sha512-mGh0XfUzKdn+WFaqPacziNraCWL5znkHRfQVxG9avGS9zb2KC/N1EBbPzFqutDwixGDP54r2gx4q54YCJEZ4iQ=="], + + "@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@1.12.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.4" }, "cpu": "none" }, "sha512-SZN6v7apKmQf/Vwiqb6e/s3Y2Oacw8uW8V2i1AlxtyaEFvnFE0UBn89zq6swEwE3OCajNWs0yPvgAXUMddYc7Q=="], + + "@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@1.12.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-GRe4bqCfFsyghruEn5bv47s9w3EWBdO2q72xCz5kpQ0LWbw+enPHtTjw3qX5PUcFYpKykM55FaO0hFDs1yzatw=="], + + "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@1.12.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Z3llHH0jfJP4mlWq3DT7bK6qV+/vYe0+xzCgfc67+Tc/U3eYndujl880bexeGdGNPh87JeYznpZAOJ44N7QVVQ=="], + + "@pondwader/socks5-server": ["@pondwader/socks5-server@1.0.10", "", {}, "sha512-bQY06wzzR8D2+vVCUoBsr5QS2U6UgPUQRmErNwtsuI6vLcyRKkafjkr3KxbtGFf9aBBIV2mcvlsKD1UYaIV+sg=="], + + "@satellite-earth/core": ["@satellite-earth/core@0.5.0", "", { "dependencies": { "better-sqlite3": "^11.3.0", "blossom-client-sdk": "^0.9.0", "blossom-server-sdk": "^0.4.0", "cors": "^2.8.5", "debug": "^4.3.6", "express": "^4.19.2", "express-async-handler": "^1.2.0", "follow-redirects": "^1.15.6", "http-error": "^0.0.6", "http-errors": "^2.0.0", "lowdb": "^7.0.1", "mime": "^4.0.1", "nostr-tools": "^2.7.2", "ws": "^8.16.0" } }, "sha512-YbD3YW6+pNjWReP+BwXc/dDO8aQen/zdw+IJTKryujGeYn4z0fRePB3foxSKcM6y1/BRNclBccYbzdvj0GagzA=="], + + "@scure/base": ["@scure/base@1.2.4", "", {}, "sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ=="], + + "@scure/bip32": ["@scure/bip32@1.3.1", "", { "dependencies": { "@noble/curves": "~1.1.0", "@noble/hashes": "~1.3.1", "@scure/base": "~1.1.0" } }, "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A=="], + + "@scure/bip39": ["@scure/bip39@1.2.1", "", { "dependencies": { "@noble/hashes": "~1.3.0", "@scure/base": "~1.1.0" } }, "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg=="], + + "@swc-node/core": ["@swc-node/core@1.13.3", "", { "peerDependencies": { "@swc/core": ">= 1.4.13", "@swc/types": ">= 0.1" } }, "sha512-OGsvXIid2Go21kiNqeTIn79jcaX4l0G93X2rAnas4LFoDyA9wAwVK7xZdm+QsKoMn5Mus2yFLCc4OtX2dD/PWA=="], + + "@swc-node/register": ["@swc-node/register@1.10.9", "", { "dependencies": { "@swc-node/core": "^1.13.3", "@swc-node/sourcemap-support": "^0.5.1", "colorette": "^2.0.20", "debug": "^4.3.5", "oxc-resolver": "^1.10.2", "pirates": "^4.0.6", "tslib": "^2.6.3" }, "peerDependencies": { "@swc/core": ">= 1.4.13", "typescript": ">= 4.3" } }, "sha512-iXy2sjP0phPEpK2yivjRC3PAgoLaT4sjSk0LDWCTdcTBJmR4waEog0E6eJbvoOkLkOtWw37SB8vCkl/bbh4+8A=="], + + "@swc-node/sourcemap-support": ["@swc-node/sourcemap-support@0.5.1", "", { "dependencies": { "source-map-support": "^0.5.21", "tslib": "^2.6.3" } }, "sha512-JxIvIo/Hrpv0JCHSyRpetAdQ6lB27oFYhv0PKCNf1g2gUXOjpeR1exrXccRxLMuAV5WAmGFBwRnNOJqN38+qtg=="], + + "@swc/core": ["@swc/core@1.11.8", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.19" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.11.8", "@swc/core-darwin-x64": "1.11.8", "@swc/core-linux-arm-gnueabihf": "1.11.8", "@swc/core-linux-arm64-gnu": "1.11.8", "@swc/core-linux-arm64-musl": "1.11.8", "@swc/core-linux-x64-gnu": "1.11.8", "@swc/core-linux-x64-musl": "1.11.8", "@swc/core-win32-arm64-msvc": "1.11.8", "@swc/core-win32-ia32-msvc": "1.11.8", "@swc/core-win32-x64-msvc": "1.11.8" }, "peerDependencies": { "@swc/helpers": "*" }, "optionalPeers": ["@swc/helpers"] }, "sha512-UAL+EULxrc0J73flwYHfu29mO8CONpDJiQv1QPDXsyCvDUcEhqAqUROVTgC+wtJCFFqMQdyr4stAA5/s0KSOmA=="], + + "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.11.8", "", { "os": "darwin", "cpu": "arm64" }, "sha512-rrSsunyJWpHN+5V1zumndwSSifmIeFQBK9i2RMQQp15PgbgUNxHK5qoET1n20pcUrmZeT6jmJaEWlQchkV//Og=="], + + "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.11.8", "", { "os": "darwin", "cpu": "x64" }, "sha512-44goLqQuuo0HgWnG8qC+ZFw/qnjCVVeqffhzFr9WAXXotogVaxM8ze6egE58VWrfEc8me8yCcxOYL9RbtjhS/Q=="], + + "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.11.8", "", { "os": "linux", "cpu": "arm" }, "sha512-Mzo8umKlhTWwF1v8SLuTM1z2A+P43UVhf4R8RZDhzIRBuB2NkeyE+c0gexIOJBuGSIATryuAF4O4luDu727D1w=="], + + "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.11.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-EyhO6U+QdoGYC1MeHOR0pyaaSaKYyNuT4FQNZ1eZIbnuueXpuICC7iNmLIOfr3LE5bVWcZ7NKGVPlM2StJEcgA=="], + + "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.11.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-QU6wOkZnS6/QuBN1MHD6G2BgFxB0AclvTVGbqYkRA7MsVkcC29PffESqzTXnypzB252/XkhQjoB2JIt9rPYf6A=="], + + "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.11.8", "", { "os": "linux", "cpu": "x64" }, "sha512-r72onUEIU1iJi9EUws3R28pztQ/eM3EshNpsPRBfuLwKy+qn3et55vXOyDhIjGCUph5Eg2Yn8H3h6MTxDdLd+w=="], + + "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.11.8", "", { "os": "linux", "cpu": "x64" }, "sha512-294k8cLpO103++f4ZUEDr3vnBeUfPitW6G0a3qeVZuoXFhFgaW7ANZIWknUc14WiLOMfMecphJAEiy9C8OeYSw=="], + + "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.11.8", "", { "os": "win32", "cpu": "arm64" }, "sha512-EbjOzQ+B85rumHyeesBYxZ+hq3ZQn+YAAT1ZNE9xW1/8SuLoBmHy/K9YniRGVDq/2NRmp5kI5+5h5TX0asIS9A=="], + + "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.11.8", "", { "os": "win32", "cpu": "ia32" }, "sha512-Z+FF5kgLHfQWIZ1KPdeInToXLzbY0sMAashjd/igKeP1Lz0qKXVAK+rpn6ASJi85Fn8wTftCGCyQUkRVn0bTDg=="], + + "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.11.8", "", { "os": "win32", "cpu": "x64" }, "sha512-j6B6N0hChCeAISS6xp/hh6zR5CSCr037BAjCxNLsT8TGe5D+gYZ57heswUWXRH8eMKiRDGiLCYpPB2pkTqxCSw=="], + + "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], + + "@swc/types": ["@swc/types@0.1.19", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-WkAZaAfj44kh/UFdAQcrMP1I0nwRqpt27u+08LMBYMqmQfwwMofYoMh/48NGkMMRfC4ynpfwRbJuu8ErfNloeA=="], + + "@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="], + + "@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], + + "@types/body-parser": ["@types/body-parser@1.19.5", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg=="], + + "@types/bun": ["@types/bun@1.2.4", "", { "dependencies": { "bun-types": "1.2.4" } }, "sha512-QtuV5OMR8/rdKJs213iwXDpfVvnskPXY/S0ZiFbsTjQZycuqPbMW8Gf/XhLfwE5njW8sxI2WjISURXPlHypMFA=="], + + "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], + + "@types/cors": ["@types/cors@2.8.17", "", { "dependencies": { "@types/node": "*" } }, "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA=="], + + "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], + + "@types/express": ["@types/express@4.17.21", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ=="], + + "@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.6", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A=="], + + "@types/hash-sum": ["@types/hash-sum@1.0.2", "", {}, "sha512-UP28RddqY8xcU0SCEp9YKutQICXpaAq9N8U2klqF5hegGha7KzTOL8EdhIIV3bOSGBzjEpN9bU/d+nNZBdJYVw=="], + + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + + "@types/http-errors": ["@types/http-errors@2.0.4", "", {}, "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA=="], + + "@types/lodash": ["@types/lodash@4.17.16", "", {}, "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g=="], + + "@types/lodash.throttle": ["@types/lodash.throttle@4.1.9", "", { "dependencies": { "@types/lodash": "*" } }, "sha512-PCPVfpfueguWZQB7pJQK890F2scYKoDUL3iM522AptHWn7d5NQmeS/LTEHIcLr5PaTzl3dK2Z0xSUHHTHwaL5g=="], + + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + + "@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="], + + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + + "@types/node": ["@types/node@22.13.10", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw=="], + + "@types/qs": ["@types/qs@6.9.18", "", {}, "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA=="], + + "@types/range-parser": ["@types/range-parser@1.2.7", "", {}, "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="], + + "@types/send": ["@types/send@0.17.4", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA=="], + + "@types/serve-static": ["@types/serve-static@1.15.7", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "*" } }, "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw=="], + + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@types/web-push": ["@types/web-push@3.6.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-GnJmSr40H3RAnj0s34FNTcJi1hmWFV5KXugE0mYWnYhgTAHLJ/dJKAwDmvPJYMke0RplY2XE9LnM4hqSqKIjhQ=="], + + "@types/ws": ["@types/ws@8.18.0", "", { "dependencies": { "@types/node": "*" } }, "sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw=="], + + "@zxing/text-encoding": ["@zxing/text-encoding@0.9.0", "", {}, "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA=="], + + "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], + + "agent-base": ["agent-base@7.1.3", "", {}, "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw=="], + + "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "applesauce-content": ["applesauce-content@0.11.0", "", { "dependencies": { "@cashu/cashu-ts": "2.0.0-rc1", "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "@types/unist": "^3.0.3", "applesauce-core": "^0.11.0", "mdast-util-find-and-replace": "^3.0.2", "nostr-tools": "^2.10.4", "remark": "^15.0.1", "remark-parse": "^11.0.0", "unified": "^11.0.5", "unist-util-visit-parents": "^6.0.1" } }, "sha512-4TCMm5hn8kL9Z5PWTdTt95XHzkYBWvh+KOLtQvB3rb6IG4yrM3NINavn6WM0q+9/O13aA71g1PIuBStd+FYFUw=="], + + "applesauce-core": ["applesauce-core@0.11.0", "", { "dependencies": { "@scure/base": "^1.2.4", "debug": "^4.4.0", "fast-deep-equal": "^3.1.3", "hash-sum": "^2.0.0", "light-bolt11-decoder": "^3.2.0", "nanoid": "^5.0.9", "nostr-tools": "^2.10.4", "rxjs": "^7.8.1" } }, "sha512-HVe0bdyler1aVE2ifUYBeV+ze21gUE19gLsuZPnYByP5UKqPP/Xgck6j++r2kdGzVGnzv9N4OYSh/Gycs2OxtA=="], + + "applesauce-factory": ["applesauce-factory@0.11.0", "", { "dependencies": { "applesauce-content": "^0.11.0", "applesauce-core": "^0.11.0", "nanoid": "^5.0.9", "nostr-tools": "^2.10.4" } }, "sha512-8zrd8PGjrXpZdCZgyOcn71n7LmttYjEDipJemKNihoZX/yIzF/l97OjX5lC0YT7DyJq5EYqgeCxP/Rf7O+qi8A=="], + + "applesauce-loaders": ["applesauce-loaders@0.11.0", "", { "dependencies": { "applesauce-core": "^0.11.0", "nanoid": "^5.0.9", "nostr-tools": "^2.10.4", "rx-nostr": "^3.5.0", "rxjs": "^7.8.1" } }, "sha512-RG71L8hAQHxseNE6VxmlzPKvYWR8NPZzcv3v1zOG9dS/yKwVDZMiXAqvtMpp//jy+HcmH5zipZs+Cy9UX0mPCg=="], + + "applesauce-signers": ["applesauce-signers@0.11.0", "", { "dependencies": { "@noble/hashes": "^1.7.1", "@noble/secp256k1": "^1.7.1", "@scure/base": "^1.2.4", "applesauce-core": "^0.11.0", "debug": "^4.4.0", "nanoid": "^5.0.9", "nostr-tools": "^2.10.4" } }, "sha512-z0Ge83AIRGpG6Vw924g2WvGp7qIIx6Iu+caaN6hFsqup+jRjnKhg0qsHOBp4buRpA/KsgyvXaMEFtGVMMtKF/Q=="], + + "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], + + "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], + + "asn1.js": ["asn1.js@5.4.1", "", { "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0", "safer-buffer": "^2.1.0" } }, "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA=="], + + "ast-types": ["ast-types@0.13.4", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="], + + "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], + + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + + "b4a": ["b4a@1.6.7", "", {}, "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg=="], + + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "bare-addon-resolve": ["bare-addon-resolve@1.9.3", "", { "dependencies": { "bare-module-resolve": "^1.10.0", "bare-semver": "^1.0.0" }, "peerDependencies": { "bare-url": "*" }, "optionalPeers": ["bare-url"] }, "sha512-0W343p8kVy9KimDMrxJtJct/ILWL8gzC0Wwg/Fn/GgQplHvrllyz4fPobUVG5+gx9BokWttzg8FYypQP7V5nrA=="], + + "bare-dgram": ["bare-dgram@1.0.1", "", { "dependencies": { "bare-events": "^2.5.0", "udx-native": "^1.11.2" } }, "sha512-EdsyRErrkWgN8fENdrDdXFEE9HAuJ/m6ehXz13fVj9JhdCaLWIA+L8o5aYNRLt66x08RlyG2vbrRAZoxGfcdlg=="], + + "bare-dns": ["bare-dns@1.0.5", "", {}, "sha512-Hqb9dpUe4M7y9N6oRV0XhHzUkUliyUE7qw/q3cmn0PF06fdBXooy45fvKGeYUUv6OCvXyLKfi7b7QyZS7r/YoQ=="], + + "bare-events": ["bare-events@2.5.4", "", {}, "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA=="], + + "bare-module-resolve": ["bare-module-resolve@1.10.2", "", { "dependencies": { "bare-semver": "^1.0.0" }, "peerDependencies": { "bare-url": "*" }, "optionalPeers": ["bare-url"] }, "sha512-C9COe/GhWfVXKytW3DElTkiBU+Gb2OXeaVkdGdRB/lp26TVLESHkTGS876iceAGdvtPgohfp9nX8vXHGvN3++Q=="], + + "bare-net": ["bare-net@1.0.1", "", { "dependencies": { "bare-events": "^2.2.2", "bare-pipe": "^3.2.0", "bare-stream": "^2.0.0", "bare-tcp": "^1.4.0" } }, "sha512-eTMpS2fxXiuz5eMvMGEkJBsgIfanPFoniiepCmgbCRQVdAIjg1wutaRzHTqRJpuG4yCzrcar581AIPf1XzyH8g=="], + + "bare-os": ["bare-os@3.5.1", "", {}, "sha512-LvfVNDcWLw2AnIw5f2mWUgumW3I3N/WYGiWeimhQC1Ybt71n2FjlS9GJKeCnFeg1MKZHxzIFmpFnBXDI+sBeFg=="], + + "bare-path": ["bare-path@3.0.0", "", { "dependencies": { "bare-os": "^3.0.1" } }, "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw=="], + + "bare-pipe": ["bare-pipe@3.3.8", "", { "dependencies": { "bare-events": "^2.0.0", "bare-stream": "^2.0.0" } }, "sha512-X8Ulz/os6LR/cF5HBljq/tJ0NP7eNGjiripZF53EMtgkhJ9FVl1/WLZxwvUvcqbR82Ywaq6KYM+A6zS7DGPPUw=="], + + "bare-semver": ["bare-semver@1.0.1", "", {}, "sha512-UtggzHLiTrmFOC/ogQ+Hy7VfoKoIwrP1UFcYtTxoCUdLtsIErT8+SWtOC2DH/snT9h+xDrcBEPcwKei1mzemgg=="], + + "bare-stream": ["bare-stream@2.6.5", "", { "dependencies": { "streamx": "^2.21.0" }, "peerDependencies": { "bare-buffer": "*", "bare-events": "*" }, "optionalPeers": ["bare-buffer", "bare-events"] }, "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA=="], + + "bare-tcp": ["bare-tcp@1.9.1", "", { "dependencies": { "bare-dns": "^1.0.0", "bare-events": "^2.2.2", "bare-stream": "^2.0.0" } }, "sha512-eaiKHR0ECRrIrsVNVIjoJxA6J08YqR/kSQ5Ikd0nRmgp5qtKxt49PS0z+USfcN5ZsfDcVFpUFo108EAeXtCshA=="], + + "bare-url": ["bare-url@2.1.3", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-c02+eKvn/4esh5E2lSYQFwHL1WoTIL3u3NeFqb9e7ahBVENXw13MWx4/4/wdPyI557GqqB2Cm0bBbOXD0I0qgA=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "basic-ftp": ["basic-ftp@5.0.5", "", {}, "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg=="], + + "better-path-resolve": ["better-path-resolve@1.0.0", "", { "dependencies": { "is-windows": "^1.0.0" } }, "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g=="], + + "better-sqlite3": ["better-sqlite3@11.8.1", "", { "dependencies": { "bindings": "^1.5.0", "prebuild-install": "^7.1.1" } }, "sha512-9BxNaBkblMjhJW8sMRZxnxVTRgbRmssZW0Oxc1MPBTfiR+WW21e2Mk4qu8CzrcZb1LwPCnFsfDEzq+SNcBU8eg=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], + + "bits-to-bytes": ["bits-to-bytes@1.3.0", "", { "dependencies": { "b4a": "^1.5.0" } }, "sha512-OJoHTpFXS9bXHBCekGTByf3MqM8CGblBDIduKQeeVVeiU9dDWywSSirXIBYGgg3d1zbVuvnMa1vD4r6PA0kOKg=="], + + "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], + + "blind-relay": ["blind-relay@1.3.3", "", { "dependencies": { "b4a": "^1.6.4", "bare-events": "^2.2.0", "bits-to-bytes": "^1.3.0", "compact-encoding": "^2.12.0", "compact-encoding-bitfield": "^1.0.0", "hypertrace": "^1.4.1", "protomux": "^3.5.1", "sodium-universal": "^4.0.0", "streamx": "^2.15.1" } }, "sha512-J49HZaRLA+jgmIA+J01x0NzDtNMQVzuFfz7CnLLijIUMJkxTbaexIGI/tfk6LONcr/+INmgbS8gMLeuaRvfreA=="], + + "block-stream2": ["block-stream2@2.1.0", "", { "dependencies": { "readable-stream": "^3.4.0" } }, "sha512-suhjmLI57Ewpmq00qaygS8UgEq2ly2PCItenIyhMqVjo4t4pGzqMvfgJuX8iWTeSDdfSSqS6j38fL4ToNL7Pfg=="], + + "blossom-client-sdk": ["blossom-client-sdk@2.1.1", "", { "dependencies": { "@cashu/cashu-ts": "^2.1.0", "@noble/hashes": "^1.4.0" } }, "sha512-a95eZV7W5/QPN30p0s2K8ZxX0vwMXsnl2JIJDXaOu0nDVxikfKINa/7mhTRtA2i3dzjQ378FPET8vwn0GjtFzg=="], + + "blossom-server-sdk": ["blossom-server-sdk@0.4.0", "", { "dependencies": { "better-sqlite3": "^11.1.2", "debug": "^4.3.6", "mime": "^4.0.4", "minio": "^7.1.3" } }, "sha512-sZDosyS2OVa+fM2ifdCOckziAcFwMpzlcxGG1JawwR8dWcQkWmsTJVETZKuZG8EUeUrl25oSyGBWHx7itA2ZOA=="], + + "bn.js": ["bn.js@4.12.1", "", {}, "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg=="], + + "body-parser": ["body-parser@1.20.3", "", { "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" } }, "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g=="], + + "bogon": ["bogon@1.1.0", "", { "dependencies": { "compact-encoding": "^2.11.0", "compact-encoding-net": "^1.2.0" } }, "sha512-a6SnToksXHuUlgeMvI/txWmTcKz7c7iBa8f0HbXL4toN1Uza/CTQ4F7n9jSDX49TCpxv3KUP100q4sZfwLyLiw=="], + + "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browser-or-node": ["browser-or-node@2.1.1", "", {}, "sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg=="], + + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "buffer-crc32": ["buffer-crc32@1.0.0", "", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="], + + "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "bun-types": ["bun-types@1.2.4", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-nDPymR207ZZEoWD4AavvEaa/KZe/qlrbMSchqpQwovPZCKc7pwMoENjEtHgMKaAjJhy+x6vfqSBA1QU3bJgs0Q=="], + + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], + + "chardet": ["chardet@0.7.0", "", {}, "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="], + + "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], + + "ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], + + "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + + "commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + + "compact-encoding": ["compact-encoding@2.16.0", "", { "dependencies": { "b4a": "^1.3.0" } }, "sha512-zG2ul4Egc8ktfmj2vYiC6s/U3u1OkNyUGj32jrJq6qcJ4atGcEpVr+AI+VDJ3oteNfGIw/uol4oBQyB74OeGvw=="], + + "compact-encoding-bitfield": ["compact-encoding-bitfield@1.0.0", "", { "dependencies": { "compact-encoding": "^2.4.1" } }, "sha512-3nMVKUg+PF72UHfainmCL8uKvyWfxsjqOtUY+HiMPGLPCTjnwzoKfFAMo1Ad7nwTPdjBqtGK5b3BOFTFW4EBTg=="], + + "compact-encoding-net": ["compact-encoding-net@1.2.0", "", { "dependencies": { "compact-encoding": "^2.4.1" } }, "sha512-LVXpNpF7PGQeHRVVLGgYWzuVoYAaDZvKUsUxRioGfkotzvOh4AzoQF1HBH3zMNaSnx7gJXuUr3hkjnijaH/Eng=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], + + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + + "cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], + + "cookie-signature": ["cookie-signature@1.0.6", "", {}, "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="], + + "cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="], + + "cross-fetch": ["cross-fetch@4.1.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="], + + "dayjs": ["dayjs@1.11.13", "", {}, "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="], + + "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + + "decode-named-character-reference": ["decode-named-character-reference@1.1.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w=="], + + "decode-uri-component": ["decode-uri-component@0.2.2", "", {}, "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ=="], + + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], + + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "degenerator": ["degenerator@5.0.1", "", { "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", "esprima": "^4.0.1" } }, "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ=="], + + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], + + "detect-indent": ["detect-indent@6.1.0", "", {}, "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="], + + "detect-libc": ["detect-libc@2.0.3", "", {}, "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw=="], + + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "dht-rpc": ["dht-rpc@6.16.2", "", { "dependencies": { "b4a": "^1.6.1", "bare-events": "^2.2.0", "compact-encoding": "^2.11.0", "compact-encoding-net": "^1.2.0", "fast-fifo": "^1.1.0", "kademlia-routing-table": "^1.0.1", "nat-sampler": "^1.0.1", "sodium-universal": "^4.0.0", "streamx": "^2.13.2", "time-ordered-set": "^2.0.0", "udx-native": "^1.5.3" } }, "sha512-1CIoo0mCRNI8r0vDozV/exQ1mg2Y04zBaQ34WBWzNjGhZbaABPmWI0EZSpbAGdZ3+pBbGXjk1aQkadF9S7RzeQ=="], + + "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], + + "dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "duplex-maker": ["duplex-maker@1.0.0", "", {}, "sha512-KoHuzggxg7f+vvjqOHfXxaQYI1POzBm+ah0eec7YDssZmbt6QFBI8d1nl5GQwAgR2f+VQCPvyvZtmWWqWuFtlA=="], + + "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="], + + "enquirer": ["enquirer@2.4.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" } }, "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="], + + "express": ["express@4.21.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.19.0", "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA=="], + + "express-async-handler": ["express-async-handler@1.2.0", "", {}, "sha512-rCSVtPXRmQSW8rmik/AIb2P0op6l7r1fMW538yyvTMltCO4xQEWMmobfrIxN2V1/mVrgxB8Az3reYF6yUZw37w=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "extendable-error": ["extendable-error@0.1.7", "", {}, "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg=="], + + "external-editor": ["external-editor@3.1.0", "", { "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-xml-parser": ["fast-xml-parser@4.5.3", "", { "dependencies": { "strnum": "^1.1.1" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig=="], + + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "filter-obj": ["filter-obj@1.1.0", "", {}, "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ=="], + + "finalhandler": ["finalhandler@1.3.1", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" } }, "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ=="], + + "find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], + + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + + "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], + + "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], + + "fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-port": ["get-port@7.1.0", "", {}, "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-uri": ["get-uri@6.0.4", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ=="], + + "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hash-sum": ["hash-sum@2.0.0", "", {}, "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "holesail-server": ["holesail-server@1.4.4", "", { "dependencies": { "@holesail/hyper-cmd-lib-net": "^0.2.0", "b4a": "^1.6.6", "bare-net": "^1.0.1", "hyper-cmd-lib-keys": "^0.0.2", "hyperdht": "^6.16.2", "net": "npm:bare-net" } }, "sha512-NoLgx3TQZHyU2KMzKs6b+AMYG8TQz2zkcEPbVTYhB/CG9siPnZaKXhcgBg9vkTaRYMGpTpRQfggaE6jg3ZlBlg=="], + + "http-error": ["http-error@0.0.6", "", {}, "sha512-1okadUMOfkA8o9mvatq5dopVrPdIsKw3K9JL2izosTqFJVa+ID8Siw4ichfW7AvXRVHVvpfQpEekPvrjZ3bqSg=="], + + "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + + "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], + + "http_ece": ["http_ece@1.2.0", "", {}, "sha512-JrF8SSLVmcvc5NducxgyOrKXe3EsyHMgBFgSaIUGmArKe+rwr0uphRkRXvwiom3I+fpIfoItveHrfudL8/rxuA=="], + + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + + "human-id": ["human-id@4.1.1", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg=="], + + "hyper-address": ["hyper-address@0.1.3", "", { "dependencies": { "@scure/base": "^1.1.7", "commander": "^12.1.0", "debug": "^4.3.6" }, "bin": { "hyper-address": "lib/bin/index.js" } }, "sha512-8pq6Sf7y2kK94wt7Qqc8KyGhncc32T1KybKqrEQcNlW9kkznTA85iP4OG8STRjLdjl6aXYAr/98M8P39jCS51w=="], + + "hyper-cmd-lib-keys": ["hyper-cmd-lib-keys@0.0.2", "", {}, "sha512-/KUs6yDoBzYFSlx2PnFoCDZaiNwMqc+iDsMqaXM0Wd+Ntu2nkxJxFSlxKCZUThHOmjJF3DH1SPD/5kgENpbwug=="], + + "hyper-socks5-proxy": ["hyper-socks5-proxy@0.1.2", "", { "dependencies": { "@pondwader/socks5-server": "^1.0.10", "@scure/base": "^1.1.7", "commander": "^12.1.0", "debug": "^4.3.6", "hyper-address": "^0.1.0", "hyperdht": "^6.16.2" }, "bin": { "hyper-socks5-proxy": "dist/bin/proxy.js" } }, "sha512-PkzrB4I61g04qgwu7tyKH2ULh/+QCQqftZkk6VDeo5hUEV7dichmAtx+LW31x8z8MpkBZF+gLBNewlyz1ypXsA=="], + + "hypercore-crypto": ["hypercore-crypto@3.5.0", "", { "dependencies": { "b4a": "^1.6.6", "compact-encoding": "^2.15.0", "sodium-universal": "^4.0.1" } }, "sha512-jIhMtPsBfomxruq5TsCl+jhMYsjWBOsSllQy006OFInoRhfIpXpcE28o1wU6qdMRdvzoEIiWmFxJC3SRUmt3WA=="], + + "hypercore-id-encoding": ["hypercore-id-encoding@1.3.0", "", { "dependencies": { "b4a": "^1.5.3", "z32": "^1.0.0" } }, "sha512-W6sHdGo5h7LXEsoWfKf/KfuROZmZRQDlGqJF2EPHW+noCK66Vvr0+zE6cL0vqQi18s0kQPeN7Sq3QyR0Ytc2VQ=="], + + "hyperdht": ["hyperdht@6.20.1", "", { "dependencies": { "@hyperswarm/secret-stream": "^6.6.2", "b4a": "^1.3.1", "bare-events": "^2.2.0", "blind-relay": "^1.3.0", "bogon": "^1.0.0", "compact-encoding": "^2.4.1", "compact-encoding-net": "^1.0.1", "dht-rpc": "^6.15.1", "hypercore-crypto": "^3.3.0", "hypercore-id-encoding": "^1.2.0", "noise-curve-ed": "^2.0.0", "noise-handshake": "^3.0.0", "record-cache": "^1.1.1", "safety-catch": "^1.0.1", "signal-promise": "^1.0.3", "sodium-universal": "^4.0.0", "streamx": "^2.16.1", "unslab": "^1.3.0", "xache": "^1.1.0" }, "bin": { "hyperdht": "bin.js" } }, "sha512-0UO5rrxOwZLmpDApX49GmhdbZOpVIG9VvudlReH8GS4Upz2HNR75GIPChRClkfpD3Lo80yWJHfitnKiqo7tC6w=="], + + "hypertrace": ["hypertrace@1.4.2", "", {}, "sha512-sa6iq1FaJ03Db3eUl5ZodyOL3fheyrum9xzeHasXOQ/AprTT6vS1WjpbXfYkHhmzVmyn0jBW/VsCb1QaBkGyow=="], + + "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "ignore-by-default": ["ignore-by-default@1.0.1", "", {}, "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA=="], + + "import-meta-resolve": ["import-meta-resolve@4.1.0", "", {}, "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "ip-address": ["ip-address@9.0.5", "", { "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" } }, "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g=="], + + "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + + "is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + + "is-subdir": ["is-subdir@1.2.0", "", { "dependencies": { "better-path-resolve": "1.0.0" } }, "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw=="], + + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + + "is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + + "jsbn": ["jsbn@1.1.0", "", {}, "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A=="], + + "jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "jwa": ["jwa@2.0.0", "", { "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA=="], + + "jws": ["jws@4.0.0", "", { "dependencies": { "jwa": "^2.0.0", "safe-buffer": "^5.0.1" } }, "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg=="], + + "kademlia-routing-table": ["kademlia-routing-table@1.0.6", "", { "dependencies": { "bare-events": "^2.2.0" } }, "sha512-Ve6jwIlUCYvUzBnXnzVRHDZCFgXURW9gmF3r7n05kZs/2rNbLHXwGdcq0qIaSwdmJCvtosgR4JensnVU65hzNQ=="], + + "light-bolt11-decoder": ["light-bolt11-decoder@3.2.0", "", { "dependencies": { "@scure/base": "1.1.1" } }, "sha512-3QEofgiBOP4Ehs9BI+RkZdXZNtSys0nsJ6fyGeSiAGCBsMwHGUDS/JQlY/sTnWs91A2Nh0S9XXfA8Sy9g6QpuQ=="], + + "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash.startcase": ["lodash.startcase@4.4.0", "", {}, "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg=="], + + "lodash.throttle": ["lodash.throttle@4.1.1", "", {}, "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="], + + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], + + "lowdb": ["lowdb@7.0.1", "", { "dependencies": { "steno": "^4.0.2" } }, "sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], + + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA=="], + + "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], + + "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="], + + "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], + + "media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], + + "merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], + + "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], + + "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="], + + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], + + "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], + + "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], + + "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="], + + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="], + + "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="], + + "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="], + + "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="], + + "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], + + "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], + + "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="], + + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime": ["mime@4.0.6", "", { "bin": { "mime": "bin/cli.js" } }, "sha512-4rGt7rvQHBbaSOF9POGkk1ocRP16Md1x36Xma8sz8h8/vfCUI2OtEIeCqe4Ofes853x4xDoPiFLIT47J5fI/7A=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], + + "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "minio": ["minio@7.1.4", "", { "dependencies": { "async": "^3.2.4", "block-stream2": "^2.1.0", "browser-or-node": "^2.1.1", "buffer-crc32": "^1.0.0", "eventemitter3": "^5.0.1", "fast-xml-parser": "^4.2.2", "ipaddr.js": "^2.0.1", "lodash": "^4.17.21", "mime-types": "^2.1.35", "query-string": "^7.1.3", "stream-json": "^1.8.0", "through2": "^4.0.2", "web-encoding": "^1.1.5", "xml2js": "^0.5.0" } }, "sha512-1rjcS8l7QlWsA4EZ1JauInkRkzu2J/qN0U+ee3HZErY84bdcebMhd10wDdfpAjmXyFsvrUPnKjZB2G7OJXrvXw=="], + + "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], + + "mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="], + + "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nanoassert": ["nanoassert@2.0.0", "", {}, "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA=="], + + "nanoid": ["nanoid@5.1.3", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-zAbEOEr7u2CbxwoMRlz/pNSpRP0FdAU4pRaYunCdEezWohXFs+a0Xw7RfkKaezMsmSM1vttcLthJtwRnVtOfHQ=="], + + "napi-build-utils": ["napi-build-utils@2.0.0", "", {}, "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA=="], + + "nat-sampler": ["nat-sampler@1.0.1", "", {}, "sha512-yQvyNN7xbqR8crTKk3U8gRgpcV1Az+vfCEijiHu9oHHsnIl8n3x+yXNHl42M6L3czGynAVoOT9TqBfS87gDdcw=="], + + "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + + "net": ["bare-net@2.0.1", "", { "dependencies": { "bare-events": "^2.2.2", "bare-pipe": "^4.0.0", "bare-stream": "^2.0.0", "bare-tcp": "^2.0.0" } }, "sha512-klzDKbZFzfguS6054Yv+8/e9rhggYVAg8I8svCWCtYkMwdlh3hz1SGCut6Q7d7iqV60YtuG3Y8957DqLcKuEJQ=="], + + "netmask": ["netmask@2.0.2", "", {}, "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg=="], + + "node-abi": ["node-abi@3.74.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "nodemon": ["nodemon@3.1.9", "", { "dependencies": { "chokidar": "^3.5.2", "debug": "^4", "ignore-by-default": "^1.0.1", "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", "semver": "^7.5.3", "simple-update-notifier": "^2.0.0", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" }, "bin": { "nodemon": "bin/nodemon.js" } }, "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg=="], + + "noise-curve-ed": ["noise-curve-ed@2.0.1", "", { "dependencies": { "b4a": "^1.1.0", "nanoassert": "^2.0.0", "sodium-universal": "^4.0.0" } }, "sha512-8HMZ40Wmarg8RQjVemLrjB49JSL6eGeOD+tlzaQW5/p+hNPfHFEMC3UZZ57zUqUprMuz6GN+gsPExpz2DWL+iA=="], + + "noise-handshake": ["noise-handshake@3.1.0", "", { "dependencies": { "b4a": "^1.1.0", "nanoassert": "^2.0.0", "sodium-universal": "^4.0.0" } }, "sha512-0S1qkUvMbTvZCfgr/vSkVT84YyvI4Q0OLwSc5BFxVmjaePrxAwVeXeJDY3A7N/7+qj95gZ15LaNoP9ZnBXH5Lw=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "nostr-tools": ["nostr-tools@2.10.4", "", { "dependencies": { "@noble/ciphers": "^0.5.1", "@noble/curves": "1.2.0", "@noble/hashes": "1.3.1", "@scure/base": "1.1.1", "@scure/bip32": "1.3.1", "@scure/bip39": "1.2.1" }, "optionalDependencies": { "nostr-wasm": "0.1.0" }, "peerDependencies": { "typescript": ">=5.0.0" }, "optionalPeers": ["typescript"] }, "sha512-biU7sk+jxHgVASfobg2T5ttxOGGSt69wEVBC51sHHOEaKAAdzHBLV/I2l9Rf61UzClhliZwNouYhqIso4a3HYg=="], + + "nostr-typedef": ["nostr-typedef@0.9.0", "", {}, "sha512-nLTzhlYcRnLQGUJ5YfvGAUDyGFHjGH6Qozltl/wV3UXelmiUwjrwI8IIxQNkbgVMv+zmbFi/m1xKHxIvVfG09w=="], + + "nostr-wasm": ["nostr-wasm@0.1.0", "", {}, "sha512-78BTryCLcLYv96ONU8Ws3Q1JzjlAt+43pWQhIl86xZmWeegYCNLPml7yQ+gG3vR6V5h4XGj+TxO+SS5dsThQIA=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="], + + "outdent": ["outdent@0.5.0", "", {}, "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q=="], + + "oxc-resolver": ["oxc-resolver@1.12.0", "", { "optionalDependencies": { "@oxc-resolver/binding-darwin-arm64": "1.12.0", "@oxc-resolver/binding-darwin-x64": "1.12.0", "@oxc-resolver/binding-freebsd-x64": "1.12.0", "@oxc-resolver/binding-linux-arm-gnueabihf": "1.12.0", "@oxc-resolver/binding-linux-arm64-gnu": "1.12.0", "@oxc-resolver/binding-linux-arm64-musl": "1.12.0", "@oxc-resolver/binding-linux-x64-gnu": "1.12.0", "@oxc-resolver/binding-linux-x64-musl": "1.12.0", "@oxc-resolver/binding-wasm32-wasi": "1.12.0", "@oxc-resolver/binding-win32-arm64-msvc": "1.12.0", "@oxc-resolver/binding-win32-x64-msvc": "1.12.0" } }, "sha512-YlaCIArvWNKCWZFRrMjhh2l5jK80eXnpYP+bhRc1J/7cW3TiyEY0ngJo73o/5n8hA3+4yLdTmXLNTQ3Ncz50LQ=="], + + "p-filter": ["p-filter@2.1.0", "", { "dependencies": { "p-map": "^2.0.0" } }, "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw=="], + + "p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "p-map": ["p-map@2.1.0", "", {}, "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="], + + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + + "pac-proxy-agent": ["pac-proxy-agent@7.2.0", "", { "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", "socks-proxy-agent": "^8.0.5" } }, "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA=="], + + "pac-resolver": ["pac-resolver@7.0.1", "", { "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" } }, "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg=="], + + "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-to-regexp": ["path-to-regexp@0.1.12", "", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="], + + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="], + + "pirates": ["pirates@4.0.6", "", {}, "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg=="], + + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], + + "prebuild-install": ["prebuild-install@7.1.3", "", { "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug=="], + + "prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="], + + "process-streams": ["process-streams@1.0.3", "", { "dependencies": { "duplex-maker": "^1.0.0" } }, "sha512-xkIaM5vYnyekB88WyET78YEqXiaJRy0xcvIdE22n+myhvBT7LlLmX6iAtq7jDvVH8CUx2rqQsd32JdRyJMV3NA=="], + + "protomux": ["protomux@3.10.1", "", { "dependencies": { "b4a": "^1.3.1", "compact-encoding": "^2.5.1", "queue-tick": "^1.0.0", "safety-catch": "^1.0.1", "unslab": "^1.3.0" } }, "sha512-jgBqx8ZyaBWea/DFG4eOu1scOaeBwcnagiRC1XFVrjeGt7oAb0Pk5udPpBUpJ4DJBRjra50jD6YcZiQQTRqaaA=="], + + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + + "pstree.remy": ["pstree.remy@1.1.8", "", {}, "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w=="], + + "pump": ["pump@3.0.2", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw=="], + + "qs": ["qs@6.13.0", "", { "dependencies": { "side-channel": "^1.0.6" } }, "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg=="], + + "quansync": ["quansync@0.2.8", "", {}, "sha512-4+saucphJMazjt7iOM27mbFCk+D9dd/zmgMDCzRZ8MEoBfYp7lAvoN38et/phRQF6wOPMy/OROBGgoWeSKyluA=="], + + "query-string": ["query-string@7.1.3", "", { "dependencies": { "decode-uri-component": "^0.2.2", "filter-obj": "^1.1.0", "split-on-first": "^1.0.0", "strict-uri-encode": "^2.0.0" } }, "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "queue-tick": ["queue-tick@1.0.1", "", {}, "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag=="], + + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "raw-body": ["raw-body@2.5.2", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA=="], + + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], + + "read-yaml-file": ["read-yaml-file@1.1.0", "", { "dependencies": { "graceful-fs": "^4.1.5", "js-yaml": "^3.6.1", "pify": "^4.0.1", "strip-bom": "^3.0.0" } }, "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA=="], + + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "record-cache": ["record-cache@1.2.0", "", { "dependencies": { "b4a": "^1.3.1" } }, "sha512-kyy3HWCez2WrotaL3O4fTn0rsIdfRKOdQQcEJ9KpvmKmbffKVvwsloX063EgRUlpJIXHiDQFhJcTbZequ2uTZw=="], + + "regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="], + + "remark": ["remark@15.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A=="], + + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], + + "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], + + "require-addon": ["require-addon@1.1.0", "", { "dependencies": { "bare-addon-resolve": "^1.3.0", "bare-url": "^2.1.0" } }, "sha512-KbXAD5q2+v1GJnkzd8zzbOxchTkStSyJZ9QwoCq3QwEXAaIlG3wDYRZGzVD357jmwaGY7hr5VaoEAL0BkF0Kvg=="], + + "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rfc4648": ["rfc4648@1.5.4", "", {}, "sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "rx-nostr": ["rx-nostr@3.5.0", "", { "dependencies": { "nostr-typedef": "^0.9.0", "rxjs": "^7.8.0" } }, "sha512-SFk/WTYKW1GAecyxLKNQlkdedrFfGDeT8nz8wTFriIqd2I6jSV5lm7jBkStcnB4ncDK7GOf4QoLcZfxA+OqaQw=="], + + "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "safety-catch": ["safety-catch@1.0.2", "", {}, "sha512-C1UYVZ4dtbBxEtvOcpjBaaD27nP8MlvyAQEp2fOTOEe6pfUpk1cDUxij6BR1jZup6rSyUTaBBplK7LanskrULA=="], + + "sax": ["sax@1.4.1", "", {}, "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="], + + "semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + + "send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], + + "serve-static": ["serve-static@1.16.2", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" } }, "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "signal-promise": ["signal-promise@1.0.3", "", {}, "sha512-WBgv0UnIq2C+Aeh0/n+IRpP6967eIx9WpynTUoiW3isPpfe1zu2LJzyfXdo9Tgef8yR/sGjcMvoUXD7EYdiz+g=="], + + "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], + + "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="], + + "simple-update-notifier": ["simple-update-notifier@2.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w=="], + + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], + + "socks": ["socks@2.8.4", "", { "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" } }, "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ=="], + + "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], + + "sodium-native": ["sodium-native@4.3.3", "", { "dependencies": { "require-addon": "^1.1.0" } }, "sha512-OnxSlN3uyY8D0EsLHpmm2HOFmKddQVvEMmsakCrXUzSd8kjjbzL413t4ZNF3n0UxSwNgwTyUvkmZHTfuCeiYSw=="], + + "sodium-secretstream": ["sodium-secretstream@1.1.1", "", { "dependencies": { "b4a": "^1.1.1", "sodium-universal": "^4.0.0" } }, "sha512-9lRQtNdQYmANo+sgNjEQafKrd/N4ojqv17E8wOzx3yOCaOJ5Gb4MuXoYq2Nv4Xo9Kt2fOROYcmV24bamu86c8A=="], + + "sodium-universal": ["sodium-universal@4.0.1", "", { "dependencies": { "sodium-native": "^4.0.0" }, "peerDependencies": { "sodium-javascript": "~0.8.0" }, "optionalPeers": ["sodium-javascript"] }, "sha512-sNp13PrxYLaUFHTGoDKkSDFvoEu51bfzE12RwGlqU1fcrkpAOK0NvizaJzOWV0Omtk9me2+Pnbjcf/l0efxuGQ=="], + + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "spawndamnit": ["spawndamnit@3.0.1", "", { "dependencies": { "cross-spawn": "^7.0.5", "signal-exit": "^4.0.1" } }, "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg=="], + + "split-on-first": ["split-on-first@1.1.0", "", {}, "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw=="], + + "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], + + "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "steno": ["steno@4.0.2", "", {}, "sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A=="], + + "stream-chain": ["stream-chain@2.2.5", "", {}, "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA=="], + + "stream-json": ["stream-json@1.9.1", "", { "dependencies": { "stream-chain": "^2.2.5" } }, "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw=="], + + "streamx": ["streamx@2.22.0", "", { "dependencies": { "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" }, "optionalDependencies": { "bare-events": "^2.2.0" } }, "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw=="], + + "strict-uri-encode": ["strict-uri-encode@2.0.0", "", {}, "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + + "strnum": ["strnum@1.1.2", "", {}, "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA=="], + + "supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "tar-fs": ["tar-fs@2.1.2", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA=="], + + "tar-stream": ["tar-stream@2.2.0", "", { "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" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], + + "term-size": ["term-size@2.2.1", "", {}, "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg=="], + + "text-decoder": ["text-decoder@1.2.3", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA=="], + + "through2": ["through2@4.0.2", "", { "dependencies": { "readable-stream": "3" } }, "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw=="], + + "time-ordered-set": ["time-ordered-set@2.0.1", "", {}, "sha512-VJEKmgSN2UiOLB8BpN8Sh2b9LGMHTP5OPrQRpnKjvOheOyzk0mufbjzjKTIG2gO4A+Y+vDJ+0TcLbpUmMLsg8A=="], + + "timeout-refresh": ["timeout-refresh@2.0.1", "", {}, "sha512-SVqEcMZBsZF9mA78rjzCrYrUs37LMJk3ShZ851ygZYW1cMeIjs9mL57KO6Iv5mmjSQnOe/29/VAfGXo+oRCiVw=="], + + "tmp": ["tmp@0.0.33", "", { "dependencies": { "os-tmpdir": "~1.0.2" } }, "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "touch": ["touch@3.1.1", "", { "bin": { "nodetouch": "bin/nodetouch.js" } }, "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], + + "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], + + "typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="], + + "udx-native": ["udx-native@1.17.5", "", { "dependencies": { "b4a": "^1.5.0", "bare-events": "^2.2.0", "require-addon": "^1.1.0", "streamx": "^2.14.0" } }, "sha512-RMuMSzWFnvQkJG/9MlnLDKKhzc5Afm/UHZ75En3Sycf/djw+fVn1TXMv6GHaBdkiH8GGB9rPVekC+/AykiSWPg=="], + + "undefsafe": ["undefsafe@2.0.5", "", {}, "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA=="], + + "undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="], + + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], + + "unique-names-generator": ["unique-names-generator@4.7.1", "", {}, "sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow=="], + + "unist-util-is": ["unist-util-is@6.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="], + + "universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + + "unslab": ["unslab@1.3.0", "", { "dependencies": { "b4a": "^1.6.6" } }, "sha512-YATkfKAFj47kTzmiQrWXMyRvaVrHsW6MEALa4bm+FhiA2YG4oira+Z3DXN6LrYOYn2Y8eO94Lwl9DOHjs1FpoQ=="], + + "util": ["util@0.12.5", "", { "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", "which-typed-array": "^1.1.2" } }, "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], + + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-message": ["vfile-message@4.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw=="], + + "web-encoding": ["web-encoding@1.1.5", "", { "dependencies": { "util": "^0.12.3" }, "optionalDependencies": { "@zxing/text-encoding": "0.9.0" } }, "sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA=="], + + "web-push": ["web-push@3.6.7", "", { "dependencies": { "asn1.js": "^5.3.0", "http_ece": "1.2.0", "https-proxy-agent": "^7.0.0", "jws": "^4.0.0", "minimist": "^1.2.5" }, "bin": { "web-push": "src/cli.js" } }, "sha512-OpiIUe8cuGjrj3mMBFWY+e4MMIkW3SVT+7vEIjvD9kejGUypv8GPDf84JdPWskK8zMRIJ6xYGm+Kxr8YkPyA0A=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "which-typed-array": ["which-typed-array@1.1.18", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "ws": ["ws@8.18.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w=="], + + "xache": ["xache@1.2.1", "", {}, "sha512-igRS6jPreJ54ABdzhh4mCDXcz+XMaWO2q1ABRV2yWYuk29jlp8VT7UBdCqNkX7rpYBbXsebVVKkwIuYZjyZNqA=="], + + "xml2js": ["xml2js@0.5.0", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA=="], + + "xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], + + "z32": ["z32@1.1.0", "", { "dependencies": { "b4a": "^1.5.3" } }, "sha512-1WUHy+VS6d0HPNspDxvLssBbeQjXMjSnpv0vH82vRAUfg847NmX3OXozp/hRP5jPhxBbrVzrgvAt+UsGNzRFQQ=="], + + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + + "@cashu/cashu-ts/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], + + "@cashu/crypto/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], + + "@cashu/crypto/@scure/bip32": ["@scure/bip32@1.6.2", "", { "dependencies": { "@noble/curves": "~1.8.1", "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.2" } }, "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw=="], + + "@cashu/crypto/@scure/bip39": ["@scure/bip39@1.5.4", "", { "dependencies": { "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.4" } }, "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA=="], + + "@changesets/apply-release-plan/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], + + "@changesets/write/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], + + "@manypkg/find-root/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], + + "@manypkg/find-root/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + + "@manypkg/get-packages/@changesets/types": ["@changesets/types@4.1.0", "", {}, "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw=="], + + "@manypkg/get-packages/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + + "@noble/curves/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="], + + "@satellite-earth/core/blossom-client-sdk": ["blossom-client-sdk@0.9.1", "", { "dependencies": { "@noble/hashes": "^1.4.0", "cross-fetch": "^4.0.0" } }, "sha512-lEZ4uNzM09rhp7mjzmgLDC3OEgFd76GkmR90fye/IT5HVCofIT6ldBfyqBY9DcuM1S+XNa1Cu14wFg95CyH8Ag=="], + + "@scure/bip32/@noble/curves": ["@noble/curves@1.1.0", "", { "dependencies": { "@noble/hashes": "1.3.1" } }, "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA=="], + + "@scure/bip32/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="], + + "@scure/bip32/@scure/base": ["@scure/base@1.1.1", "", {}, "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA=="], + + "@scure/bip39/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="], + + "@scure/bip39/@scure/base": ["@scure/base@1.1.1", "", {}, "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA=="], + + "applesauce-content/@cashu/cashu-ts": ["@cashu/cashu-ts@2.0.0-rc1", "", { "dependencies": { "@cashu/crypto": "^0.2.7", "@noble/curves": "^1.3.0", "@noble/hashes": "^1.3.3", "@scure/bip32": "^1.3.3", "buffer": "^6.0.3" } }, "sha512-39459l7x/fUMEgOsCdGLLl6rMekO4nbv+wEuavmyElh8hgN8t66wcb29AJvdFTb6K3lPACKF2rs/jAlPYrN7Ng=="], + + "argparse/sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "bl/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + + "body-parser/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "bun-types/@types/ws": ["@types/ws@8.5.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw=="], + + "express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "light-bolt11-decoder/@scure/base": ["@scure/base@1.1.1", "", {}, "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA=="], + + "minio/ipaddr.js": ["ipaddr.js@2.2.0", "", {}, "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA=="], + + "net/bare-pipe": ["bare-pipe@4.0.4", "", { "dependencies": { "bare-events": "^2.0.0", "bare-stream": "^2.0.0" } }, "sha512-UiWAy87oxjCN84ppF0SMuzh3KCrp3JprNMlxykntjEotUiYVoq9WPZGgDVVfT0plLl5Og4cDfvZaTkSL/oEAyw=="], + + "net/bare-tcp": ["bare-tcp@2.0.3", "", { "dependencies": { "bare-dns": "^2.0.4", "bare-events": "^2.5.4", "bare-stream": "^2.6.4" } }, "sha512-Sy0EVAZFKLjcbS+TxEPV5nhtSNsw6ErFRTJBQoRn62kRsEcaKkPNcwx+N4fJy+A1SovChby4rN8AvDhoyI/rEg=="], + + "nostr-tools/@noble/hashes": ["@noble/hashes@1.3.1", "", {}, "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA=="], + + "nostr-tools/@scure/base": ["@scure/base@1.1.1", "", {}, "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA=="], + + "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + + "send/mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + + "@scure/bip32/@noble/curves/@noble/hashes": ["@noble/hashes@1.3.1", "", {}, "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA=="], + + "applesauce-content/@cashu/cashu-ts/@cashu/crypto": ["@cashu/crypto@0.2.7", "", { "dependencies": { "@noble/curves": "^1.3.0", "@noble/hashes": "^1.3.3", "@scure/bip32": "^1.3.3", "@scure/bip39": "^1.2.2", "buffer": "^6.0.3" } }, "sha512-1aaDfUjiHNXoJqg8nW+341TLWV9W28DsVNXJUKcHL0yAmwLs5+56SSnb8LLDJzPamLVoYL0U0bda91klAzptig=="], + + "applesauce-content/@cashu/cashu-ts/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], + + "applesauce-content/@cashu/cashu-ts/@scure/bip32": ["@scure/bip32@1.6.2", "", { "dependencies": { "@noble/curves": "~1.8.1", "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.2" } }, "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw=="], + + "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "net/bare-tcp/bare-dns": ["bare-dns@2.0.4", "", {}, "sha512-ZZ6Elwi9in2nf9UyPMmm9A0i0G4ndh3G3vcvK3dMKn74adyv7sh6GO7wfu/5SEKLfVmWcj85v0rod74DU8yjcQ=="], + + "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "applesauce-content/@cashu/cashu-ts/@cashu/crypto/@scure/bip39": ["@scure/bip39@1.5.4", "", { "dependencies": { "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.4" } }, "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA=="], + } +} diff --git a/package.json b/package.json index f9693f0..841728d 100644 --- a/package.json +++ b/package.json @@ -64,6 +64,7 @@ "@swc-node/register": "^1.10.9", "@swc/core": "^1.10.18", "@types/better-sqlite3": "^7.6.12", + "@types/bun": "^1.2.4", "@types/cors": "^2.8.17", "@types/debug": "^4.1.12", "@types/express": "^4.17.21", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 510b09a..3d473ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,19 +16,19 @@ importers: version: 1.7.1 '@satellite-earth/core': specifier: ^0.5.0 - version: 0.5.0(typescript@5.7.3) + version: 0.5.0(typescript@5.8.2) applesauce-core: specifier: ^0.11.0 - version: 0.11.0(typescript@5.7.3) + version: 0.11.0(typescript@5.8.2) applesauce-factory: specifier: ^0.11.0 - version: 0.11.0(typescript@5.7.3) + version: 0.11.0(typescript@5.8.2) applesauce-loaders: specifier: ^0.11.0 - version: 0.11.0(typescript@5.7.3) + version: 0.11.0(typescript@5.8.2) applesauce-signers: specifier: ^0.11.0 - version: 0.11.0(typescript@5.7.3) + version: 0.11.0(typescript@5.8.2) better-sqlite3: specifier: ^11.8.1 version: 11.8.1 @@ -82,10 +82,10 @@ importers: version: 3.0.1 nanoid: specifier: ^5.1.0 - version: 5.1.0 + version: 5.1.3 nostr-tools: specifier: ^2.10.4 - version: 2.10.4(typescript@5.7.3) + version: 2.10.4(typescript@5.8.2) pac-proxy-agent: specifier: ^7.2.0 version: 7.2.0 @@ -97,7 +97,7 @@ importers: version: 3.5.0 rxjs: specifier: ^7.8.1 - version: 7.8.1 + version: 7.8.2 streamx: specifier: ^2.22.0 version: 2.22.0 @@ -116,13 +116,16 @@ importers: version: 2.28.1 '@swc-node/register': specifier: ^1.10.9 - version: 1.10.9(@swc/core@1.10.18)(@swc/types@0.1.17)(typescript@5.7.3) + version: 1.10.9(@swc/core@1.11.8)(@swc/types@0.1.19)(typescript@5.8.2) '@swc/core': specifier: ^1.10.18 - version: 1.10.18 + version: 1.11.8 '@types/better-sqlite3': specifier: ^7.6.12 version: 7.6.12 + '@types/bun': + specifier: ^1.2.4 + version: 1.2.4 '@types/cors': specifier: ^2.8.17 version: 2.8.17 @@ -140,22 +143,22 @@ importers: version: 4.1.9 '@types/node': specifier: ^22.13.4 - version: 22.13.4 + version: 22.13.10 '@types/web-push': specifier: ^3.6.4 version: 3.6.4 '@types/ws': specifier: ^8.5.14 - version: 8.5.14 + version: 8.18.0 nodemon: specifier: ^3.1.9 version: 3.1.9 prettier: specifier: ^3.5.1 - version: 3.5.1 + version: 3.5.3 typescript: specifier: ^5.7.3 - version: 5.7.3 + version: 5.8.2 packages: @@ -166,8 +169,8 @@ packages: '@cashu/cashu-ts@2.0.0-rc1': resolution: {integrity: sha512-39459l7x/fUMEgOsCdGLLl6rMekO4nbv+wEuavmyElh8hgN8t66wcb29AJvdFTb6K3lPACKF2rs/jAlPYrN7Ng==} - '@cashu/cashu-ts@2.2.0': - resolution: {integrity: sha512-7b6pGyjjpm3uAJvmOL+ztpRxqp1qnmzGpydp+Pu30pOjxj93EhejPTJVrZMDJ0P35y6u5+5jIjHF4k0fpovvmg==} + '@cashu/cashu-ts@2.2.1': + resolution: {integrity: sha512-/A8Lfkf7nexldcAcTbqrITXxwgiCYTTnrthB8DoipLVeDfyUXer48FJdUmXpRp87Aijn2BNklo8qA0yO0kHXaA==} '@cashu/crypto@0.2.7': resolution: {integrity: sha512-1aaDfUjiHNXoJqg8nW+341TLWV9W28DsVNXJUKcHL0yAmwLs5+56SSnb8LLDJzPamLVoYL0U0bda91klAzptig==} @@ -393,68 +396,68 @@ packages: '@swc-node/sourcemap-support@0.5.1': resolution: {integrity: sha512-JxIvIo/Hrpv0JCHSyRpetAdQ6lB27oFYhv0PKCNf1g2gUXOjpeR1exrXccRxLMuAV5WAmGFBwRnNOJqN38+qtg==} - '@swc/core-darwin-arm64@1.10.18': - resolution: {integrity: sha512-FdGqzAIKVQJu8ROlnHElP59XAUsUzCFSNsou+tY/9ba+lhu8R9v0OI5wXiPErrKGZpQFMmx/BPqqhx3X4SuGNg==} + '@swc/core-darwin-arm64@1.11.8': + resolution: {integrity: sha512-rrSsunyJWpHN+5V1zumndwSSifmIeFQBK9i2RMQQp15PgbgUNxHK5qoET1n20pcUrmZeT6jmJaEWlQchkV//Og==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.10.18': - resolution: {integrity: sha512-RZ73gZRituL/ZVLgrW6BYnQ5g8tuStG4cLUiPGJsUZpUm0ullSH6lHFvZTCBNFTfpQChG6eEhi2IdG6DwFp1lw==} + '@swc/core-darwin-x64@1.11.8': + resolution: {integrity: sha512-44goLqQuuo0HgWnG8qC+ZFw/qnjCVVeqffhzFr9WAXXotogVaxM8ze6egE58VWrfEc8me8yCcxOYL9RbtjhS/Q==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.10.18': - resolution: {integrity: sha512-8iJqI3EkxJuuq21UHoen1VS+QlS23RvynRuk95K+Q2HBjygetztCGGEc+Xelx9a0uPkDaaAtFvds4JMDqb9SAA==} + '@swc/core-linux-arm-gnueabihf@1.11.8': + resolution: {integrity: sha512-Mzo8umKlhTWwF1v8SLuTM1z2A+P43UVhf4R8RZDhzIRBuB2NkeyE+c0gexIOJBuGSIATryuAF4O4luDu727D1w==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.10.18': - resolution: {integrity: sha512-8f1kSktWzMB6PG+r8lOlCfXz5E8Qhsmfwonn77T/OfjvGwQaWrcoASh2cdjpk3dydbf8jsKGPQE1lSc7GyjXRQ==} + '@swc/core-linux-arm64-gnu@1.11.8': + resolution: {integrity: sha512-EyhO6U+QdoGYC1MeHOR0pyaaSaKYyNuT4FQNZ1eZIbnuueXpuICC7iNmLIOfr3LE5bVWcZ7NKGVPlM2StJEcgA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.10.18': - resolution: {integrity: sha512-4rv+E4VLdgQw6zjbTAauCAEExxChvxMpBUMCiZweTNPKbJJ2dY6BX2WGJ1ea8+RcgqR/Xysj3AFbOz1LBz6dGA==} + '@swc/core-linux-arm64-musl@1.11.8': + resolution: {integrity: sha512-QU6wOkZnS6/QuBN1MHD6G2BgFxB0AclvTVGbqYkRA7MsVkcC29PffESqzTXnypzB252/XkhQjoB2JIt9rPYf6A==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.10.18': - resolution: {integrity: sha512-vTNmyRBVP+sZca+vtwygYPGTNudTU6Gl6XhaZZ7cEUTBr8xvSTgEmYXoK/2uzyXpaTUI4Bmtp1x81cGN0mMoLQ==} + '@swc/core-linux-x64-gnu@1.11.8': + resolution: {integrity: sha512-r72onUEIU1iJi9EUws3R28pztQ/eM3EshNpsPRBfuLwKy+qn3et55vXOyDhIjGCUph5Eg2Yn8H3h6MTxDdLd+w==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.10.18': - resolution: {integrity: sha512-1TZPReKhFCeX776XaT6wegknfg+g3zODve+r4oslFHI+g7cInfWlxoGNDS3niPKyuafgCdOjme2g3OF+zzxfsQ==} + '@swc/core-linux-x64-musl@1.11.8': + resolution: {integrity: sha512-294k8cLpO103++f4ZUEDr3vnBeUfPitW6G0a3qeVZuoXFhFgaW7ANZIWknUc14WiLOMfMecphJAEiy9C8OeYSw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.10.18': - resolution: {integrity: sha512-o/2CsaWSN3bkzVQ6DA+BiFKSVEYvhWGA1h+wnL2zWmIDs2Knag54sOEXZkCaf8YQyZesGeXJtPEy9hh/vjJgkA==} + '@swc/core-win32-arm64-msvc@1.11.8': + resolution: {integrity: sha512-EbjOzQ+B85rumHyeesBYxZ+hq3ZQn+YAAT1ZNE9xW1/8SuLoBmHy/K9YniRGVDq/2NRmp5kI5+5h5TX0asIS9A==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.10.18': - resolution: {integrity: sha512-eTPASeJtk4mJDfWiYEiOC6OYUi/N7meHbNHcU8e+aKABonhXrIo/FmnTE8vsUtC6+jakT1TQBdiQ8fzJ1kJVwA==} + '@swc/core-win32-ia32-msvc@1.11.8': + resolution: {integrity: sha512-Z+FF5kgLHfQWIZ1KPdeInToXLzbY0sMAashjd/igKeP1Lz0qKXVAK+rpn6ASJi85Fn8wTftCGCyQUkRVn0bTDg==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.10.18': - resolution: {integrity: sha512-1Dud8CDBnc34wkBOboFBQud9YlV1bcIQtKSg7zC8LtwR3h+XAaCayZPkpGmmAlCv1DLQPvkF+s0JcaVC9mfffQ==} + '@swc/core-win32-x64-msvc@1.11.8': + resolution: {integrity: sha512-j6B6N0hChCeAISS6xp/hh6zR5CSCr037BAjCxNLsT8TGe5D+gYZ57heswUWXRH8eMKiRDGiLCYpPB2pkTqxCSw==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.10.18': - resolution: {integrity: sha512-IUWKD6uQYGRy8w2X9EZrtYg1O3SCijlHbCXzMaHQYc1X7yjijQh4H3IVL9ssZZyVp2ZDfQZu4bD5DWxxvpyjvg==} + '@swc/core@1.11.8': + resolution: {integrity: sha512-UAL+EULxrc0J73flwYHfu29mO8CONpDJiQv1QPDXsyCvDUcEhqAqUROVTgC+wtJCFFqMQdyr4stAA5/s0KSOmA==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '*' @@ -465,8 +468,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/types@0.1.17': - resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} + '@swc/types@0.1.19': + resolution: {integrity: sha512-WkAZaAfj44kh/UFdAQcrMP1I0nwRqpt27u+08LMBYMqmQfwwMofYoMh/48NGkMMRfC4ynpfwRbJuu8ErfNloeA==} '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} @@ -480,6 +483,9 @@ packages: '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/bun@1.2.4': + resolution: {integrity: sha512-QtuV5OMR8/rdKJs213iwXDpfVvnskPXY/S0ZiFbsTjQZycuqPbMW8Gf/XhLfwE5njW8sxI2WjISURXPlHypMFA==} + '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -507,8 +513,8 @@ packages: '@types/lodash.throttle@4.1.9': resolution: {integrity: sha512-PCPVfpfueguWZQB7pJQK890F2scYKoDUL3iM522AptHWn7d5NQmeS/LTEHIcLr5PaTzl3dK2Z0xSUHHTHwaL5g==} - '@types/lodash@4.17.15': - resolution: {integrity: sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==} + '@types/lodash@4.17.16': + resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==} '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -522,8 +528,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.13.4': - resolution: {integrity: sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==} + '@types/node@22.13.10': + resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} '@types/qs@6.9.18': resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} @@ -543,6 +549,9 @@ packages: '@types/web-push@3.6.4': resolution: {integrity: sha512-GnJmSr40H3RAnj0s34FNTcJi1hmWFV5KXugE0mYWnYhgTAHLJ/dJKAwDmvPJYMke0RplY2XE9LnM4hqSqKIjhQ==} + '@types/ws@8.18.0': + resolution: {integrity: sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==} + '@types/ws@8.5.14': resolution: {integrity: sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==} @@ -617,6 +626,14 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-addon-resolve@1.9.3: + resolution: {integrity: sha512-0W343p8kVy9KimDMrxJtJct/ILWL8gzC0Wwg/Fn/GgQplHvrllyz4fPobUVG5+gx9BokWttzg8FYypQP7V5nrA==} + peerDependencies: + bare-url: '*' + peerDependenciesMeta: + bare-url: + optional: true + bare-dgram@1.0.1: resolution: {integrity: sha512-EdsyRErrkWgN8fENdrDdXFEE9HAuJ/m6ehXz13fVj9JhdCaLWIA+L8o5aYNRLt66x08RlyG2vbrRAZoxGfcdlg==} @@ -630,12 +647,27 @@ packages: bare-events@2.5.4: resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} + bare-module-resolve@1.10.2: + resolution: {integrity: sha512-C9COe/GhWfVXKytW3DElTkiBU+Gb2OXeaVkdGdRB/lp26TVLESHkTGS876iceAGdvtPgohfp9nX8vXHGvN3++Q==} + peerDependencies: + bare-url: '*' + peerDependenciesMeta: + bare-url: + optional: true + bare-net@1.0.1: resolution: {integrity: sha512-eTMpS2fxXiuz5eMvMGEkJBsgIfanPFoniiepCmgbCRQVdAIjg1wutaRzHTqRJpuG4yCzrcar581AIPf1XzyH8g==} bare-net@2.0.1: resolution: {integrity: sha512-klzDKbZFzfguS6054Yv+8/e9rhggYVAg8I8svCWCtYkMwdlh3hz1SGCut6Q7d7iqV60YtuG3Y8957DqLcKuEJQ==} + bare-os@3.5.1: + resolution: {integrity: sha512-LvfVNDcWLw2AnIw5f2mWUgumW3I3N/WYGiWeimhQC1Ybt71n2FjlS9GJKeCnFeg1MKZHxzIFmpFnBXDI+sBeFg==} + engines: {bare: '>=1.14.0'} + + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + bare-pipe@3.3.8: resolution: {integrity: sha512-X8Ulz/os6LR/cF5HBljq/tJ0NP7eNGjiripZF53EMtgkhJ9FVl1/WLZxwvUvcqbR82Ywaq6KYM+A6zS7DGPPUw==} @@ -643,6 +675,9 @@ packages: resolution: {integrity: sha512-UiWAy87oxjCN84ppF0SMuzh3KCrp3JprNMlxykntjEotUiYVoq9WPZGgDVVfT0plLl5Og4cDfvZaTkSL/oEAyw==} engines: {bare: '>=1.7.0'} + bare-semver@1.0.1: + resolution: {integrity: sha512-UtggzHLiTrmFOC/ogQ+Hy7VfoKoIwrP1UFcYtTxoCUdLtsIErT8+SWtOC2DH/snT9h+xDrcBEPcwKei1mzemgg==} + bare-stream@2.6.5: resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} peerDependencies: @@ -661,6 +696,9 @@ packages: resolution: {integrity: sha512-Sy0EVAZFKLjcbS+TxEPV5nhtSNsw6ErFRTJBQoRn62kRsEcaKkPNcwx+N4fJy+A1SovChby4rN8AvDhoyI/rEg==} engines: {bare: '>=1.7.0'} + bare-url@2.1.3: + resolution: {integrity: sha512-c02+eKvn/4esh5E2lSYQFwHL1WoTIL3u3NeFqb9e7ahBVENXw13MWx4/4/wdPyI557GqqB2Cm0bBbOXD0I0qgA==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -739,6 +777,9 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bun-types@1.2.4: + resolution: {integrity: sha512-nDPymR207ZZEoWD4AavvEaa/KZe/qlrbMSchqpQwovPZCKc7pwMoENjEtHgMKaAjJhy+x6vfqSBA1QU3bJgs0Q==} + bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -751,8 +792,8 @@ packages: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} - call-bound@1.0.3: - resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} character-entities@2.0.2: @@ -841,8 +882,8 @@ packages: supports-color: optional: true - decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decode-named-character-reference@1.1.0: + resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} @@ -1002,8 +1043,8 @@ packages: resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} hasBin: true - fastq@1.19.0: - resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} @@ -1064,8 +1105,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - get-intrinsic@1.2.7: - resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} get-port@7.1.0: @@ -1335,8 +1376,8 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - micromark-core-commonmark@2.0.2: - resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} micromark-factory-destination@2.0.1: resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} @@ -1386,17 +1427,17 @@ packages: micromark-util-sanitize-uri@2.0.1: resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark-util-subtokenize@2.0.4: - resolution: {integrity: sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ==} + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} micromark-util-symbol@2.0.1: resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@2.0.1: - resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - micromark@4.0.1: - resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} @@ -1458,8 +1499,8 @@ packages: nanoassert@2.0.0: resolution: {integrity: sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==} - nanoid@5.1.0: - resolution: {integrity: sha512-zDAl/llz8Ue/EblwSYwdxGBYfj46IM1dhjVi8dyp9LQffoIGxJEAHj2oeZ4uNcgycSRcQ83CnfcZqEJzVDLcDw==} + nanoid@5.1.3: + resolution: {integrity: sha512-zAbEOEr7u2CbxwoMRlz/pNSpRP0FdAU4pRaYunCdEezWohXFs+a0Xw7RfkKaezMsmSM1vttcLthJtwRnVtOfHQ==} engines: {node: ^18 || >=20} hasBin: true @@ -1490,10 +1531,6 @@ packages: encoding: optional: true - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - nodemon@3.1.9: resolution: {integrity: sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==} engines: {node: '>=10'} @@ -1576,8 +1613,8 @@ packages: resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} engines: {node: '>= 14'} - package-manager-detector@0.2.9: - resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} @@ -1627,8 +1664,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.5.1: - resolution: {integrity: sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==} + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} engines: {node: '>=14'} hasBin: true @@ -1652,6 +1689,9 @@ packages: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} + quansync@0.2.8: + resolution: {integrity: sha512-4+saucphJMazjt7iOM27mbFCk+D9dd/zmgMDCzRZ8MEoBfYp7lAvoN38et/phRQF6wOPMy/OROBGgoWeSKyluA==} + query-string@7.1.3: resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} engines: {node: '>=6'} @@ -1701,12 +1741,16 @@ packages: remark@15.0.1: resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + require-addon@1.1.0: + resolution: {integrity: sha512-KbXAD5q2+v1GJnkzd8zzbOxchTkStSyJZ9QwoCq3QwEXAaIlG3wDYRZGzVD357jmwaGY7hr5VaoEAL0BkF0Kvg==} + engines: {bare: '>=1.10.0'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rfc4648@1.5.4: @@ -1718,8 +1762,8 @@ packages: rx-nostr@3.5.0: resolution: {integrity: sha512-SFk/WTYKW1GAecyxLKNQlkdedrFfGDeT8nz8wTFriIqd2I6jSV5lm7jBkStcnB4ncDK7GOf4QoLcZfxA+OqaQw==} - rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -1814,8 +1858,8 @@ packages: resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - sodium-native@4.3.2: - resolution: {integrity: sha512-C/+lDL98iFA1nGo/um6FfLWYRE+Puw0vlSKr5bhWr1EqKjOFVfLLUQ9ccm2PL3RlF8krVWZusL4LTOlNlm2cJA==} + sodium-native@4.3.3: + resolution: {integrity: sha512-OnxSlN3uyY8D0EsLHpmm2HOFmKddQVvEMmsakCrXUzSd8kjjbzL413t4ZNF3n0UxSwNgwTyUvkmZHTfuCeiYSw==} sodium-secretstream@1.1.1: resolution: {integrity: sha512-9lRQtNdQYmANo+sgNjEQafKrd/N4ojqv17E8wOzx3yOCaOJ5Gb4MuXoYq2Nv4Xo9Kt2fOROYcmV24bamu86c8A==} @@ -1878,8 +1922,8 @@ packages: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} - strnum@1.1.1: - resolution: {integrity: sha512-O7aCHfYCamLCctjAiaucmE+fHf2DYHkus2OKCn4Wv03sykfFtgeECn505X6K4mPl8CRNd/qurC9guq+ynoN4pw==} + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} @@ -1940,13 +1984,13 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - typescript@5.7.3: - resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + typescript@5.8.2: + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} engines: {node: '>=14.17'} hasBin: true - udx-native@1.17.4: - resolution: {integrity: sha512-Og4ojgF6tZqLQOstyZOIG/XGIi0oNPzU4BCE//K/Ugu2KM13npFK63mP9LAfrwr9uv/xznWdJj6I+5F6jgUR2Q==} + udx-native@1.17.5: + resolution: {integrity: sha512-RMuMSzWFnvQkJG/9MlnLDKKhzc5Afm/UHZ75En3Sycf/djw+fVn1TXMv6GHaBdkiH8GGB9rPVekC+/AykiSWPg==} undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} @@ -2076,7 +2120,7 @@ snapshots: '@scure/bip32': 1.6.2 buffer: 6.0.3 - '@cashu/cashu-ts@2.2.0': + '@cashu/cashu-ts@2.2.1': dependencies: '@cashu/crypto': 0.3.4 '@noble/curves': 1.8.1 @@ -2152,7 +2196,7 @@ snapshots: fs-extra: 7.0.1 mri: 1.2.0 p-limit: 2.3.0 - package-manager-detector: 0.2.9 + package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 semver: 7.7.1 @@ -2243,7 +2287,7 @@ snapshots: '@diva.exchange/i2p-sam@5.4.2': dependencies: - nanoid: 5.1.0 + nanoid: 5.1.3 rfc4648: 1.5.4 '@emnapi/core@1.3.1': @@ -2335,7 +2379,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.0 + fastq: 1.19.1 '@oxc-resolver/binding-darwin-arm64@1.12.0': optional: true @@ -2374,7 +2418,7 @@ snapshots: '@pondwader/socks5-server@1.0.10': {} - '@satellite-earth/core@0.5.0(typescript@5.7.3)': + '@satellite-earth/core@0.5.0(typescript@5.8.2)': dependencies: better-sqlite3: 11.8.1 blossom-client-sdk: 0.9.1 @@ -2388,7 +2432,7 @@ snapshots: http-errors: 2.0.0 lowdb: 7.0.1 mime: 4.0.6 - nostr-tools: 2.10.4(typescript@5.7.3) + nostr-tools: 2.10.4(typescript@5.8.2) ws: 8.18.1 transitivePeerDependencies: - bufferutil @@ -2423,22 +2467,22 @@ snapshots: '@noble/hashes': 1.7.1 '@scure/base': 1.2.4 - '@swc-node/core@1.13.3(@swc/core@1.10.18)(@swc/types@0.1.17)': + '@swc-node/core@1.13.3(@swc/core@1.11.8)(@swc/types@0.1.19)': dependencies: - '@swc/core': 1.10.18 - '@swc/types': 0.1.17 + '@swc/core': 1.11.8 + '@swc/types': 0.1.19 - '@swc-node/register@1.10.9(@swc/core@1.10.18)(@swc/types@0.1.17)(typescript@5.7.3)': + '@swc-node/register@1.10.9(@swc/core@1.11.8)(@swc/types@0.1.19)(typescript@5.8.2)': dependencies: - '@swc-node/core': 1.13.3(@swc/core@1.10.18)(@swc/types@0.1.17) + '@swc-node/core': 1.13.3(@swc/core@1.11.8)(@swc/types@0.1.19) '@swc-node/sourcemap-support': 0.5.1 - '@swc/core': 1.10.18 + '@swc/core': 1.11.8 colorette: 2.0.20 debug: 4.4.0(supports-color@5.5.0) oxc-resolver: 1.12.0 pirates: 4.0.6 tslib: 2.8.1 - typescript: 5.7.3 + typescript: 5.8.2 transitivePeerDependencies: - '@swc/types' - supports-color @@ -2448,55 +2492,55 @@ snapshots: source-map-support: 0.5.21 tslib: 2.8.1 - '@swc/core-darwin-arm64@1.10.18': + '@swc/core-darwin-arm64@1.11.8': optional: true - '@swc/core-darwin-x64@1.10.18': + '@swc/core-darwin-x64@1.11.8': optional: true - '@swc/core-linux-arm-gnueabihf@1.10.18': + '@swc/core-linux-arm-gnueabihf@1.11.8': optional: true - '@swc/core-linux-arm64-gnu@1.10.18': + '@swc/core-linux-arm64-gnu@1.11.8': optional: true - '@swc/core-linux-arm64-musl@1.10.18': + '@swc/core-linux-arm64-musl@1.11.8': optional: true - '@swc/core-linux-x64-gnu@1.10.18': + '@swc/core-linux-x64-gnu@1.11.8': optional: true - '@swc/core-linux-x64-musl@1.10.18': + '@swc/core-linux-x64-musl@1.11.8': optional: true - '@swc/core-win32-arm64-msvc@1.10.18': + '@swc/core-win32-arm64-msvc@1.11.8': optional: true - '@swc/core-win32-ia32-msvc@1.10.18': + '@swc/core-win32-ia32-msvc@1.11.8': optional: true - '@swc/core-win32-x64-msvc@1.10.18': + '@swc/core-win32-x64-msvc@1.11.8': optional: true - '@swc/core@1.10.18': + '@swc/core@1.11.8': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.17 + '@swc/types': 0.1.19 optionalDependencies: - '@swc/core-darwin-arm64': 1.10.18 - '@swc/core-darwin-x64': 1.10.18 - '@swc/core-linux-arm-gnueabihf': 1.10.18 - '@swc/core-linux-arm64-gnu': 1.10.18 - '@swc/core-linux-arm64-musl': 1.10.18 - '@swc/core-linux-x64-gnu': 1.10.18 - '@swc/core-linux-x64-musl': 1.10.18 - '@swc/core-win32-arm64-msvc': 1.10.18 - '@swc/core-win32-ia32-msvc': 1.10.18 - '@swc/core-win32-x64-msvc': 1.10.18 + '@swc/core-darwin-arm64': 1.11.8 + '@swc/core-darwin-x64': 1.11.8 + '@swc/core-linux-arm-gnueabihf': 1.11.8 + '@swc/core-linux-arm64-gnu': 1.11.8 + '@swc/core-linux-arm64-musl': 1.11.8 + '@swc/core-linux-x64-gnu': 1.11.8 + '@swc/core-linux-x64-musl': 1.11.8 + '@swc/core-win32-arm64-msvc': 1.11.8 + '@swc/core-win32-ia32-msvc': 1.11.8 + '@swc/core-win32-x64-msvc': 1.11.8 '@swc/counter@0.1.3': {} - '@swc/types@0.1.17': + '@swc/types@0.1.19': dependencies: '@swc/counter': 0.1.3 @@ -2509,20 +2553,24 @@ snapshots: '@types/better-sqlite3@7.6.12': dependencies: - '@types/node': 22.13.4 + '@types/node': 22.13.10 '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.13.4 + '@types/node': 22.13.10 + + '@types/bun@1.2.4': + dependencies: + bun-types: 1.2.4 '@types/connect@3.4.38': dependencies: - '@types/node': 22.13.4 + '@types/node': 22.13.10 '@types/cors@2.8.17': dependencies: - '@types/node': 22.13.4 + '@types/node': 22.13.10 '@types/debug@4.1.12': dependencies: @@ -2530,7 +2578,7 @@ snapshots: '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 22.13.4 + '@types/node': 22.13.10 '@types/qs': 6.9.18 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -2552,9 +2600,9 @@ snapshots: '@types/lodash.throttle@4.1.9': dependencies: - '@types/lodash': 4.17.15 + '@types/lodash': 4.17.16 - '@types/lodash@4.17.15': {} + '@types/lodash@4.17.16': {} '@types/mdast@4.0.4': dependencies: @@ -2566,7 +2614,7 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@22.13.4': + '@types/node@22.13.10': dependencies: undici-types: 6.20.0 @@ -2577,23 +2625,27 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.13.4 + '@types/node': 22.13.10 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 22.13.4 + '@types/node': 22.13.10 '@types/send': 0.17.4 '@types/unist@3.0.3': {} '@types/web-push@3.6.4': dependencies: - '@types/node': 22.13.4 + '@types/node': 22.13.10 + + '@types/ws@8.18.0': + dependencies: + '@types/node': 22.13.10 '@types/ws@8.5.14': dependencies: - '@types/node': 22.13.4 + '@types/node': 22.13.10 '@zxing/text-encoding@0.9.0': optional: true @@ -2614,15 +2666,15 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - applesauce-content@0.11.0(typescript@5.7.3): + applesauce-content@0.11.0(typescript@5.8.2): dependencies: '@cashu/cashu-ts': 2.0.0-rc1 '@types/hast': 3.0.4 '@types/mdast': 4.0.4 '@types/unist': 3.0.3 - applesauce-core: 0.11.0(typescript@5.7.3) + applesauce-core: 0.11.0(typescript@5.8.2) mdast-util-find-and-replace: 3.0.2 - nostr-tools: 2.10.4(typescript@5.7.3) + nostr-tools: 2.10.4(typescript@5.8.2) remark: 15.0.1 remark-parse: 11.0.0 unified: 11.0.5 @@ -2631,50 +2683,50 @@ snapshots: - supports-color - typescript - applesauce-core@0.11.0(typescript@5.7.3): + applesauce-core@0.11.0(typescript@5.8.2): dependencies: '@scure/base': 1.2.4 debug: 4.4.0(supports-color@5.5.0) fast-deep-equal: 3.1.3 hash-sum: 2.0.0 light-bolt11-decoder: 3.2.0 - nanoid: 5.1.0 - nostr-tools: 2.10.4(typescript@5.7.3) - rxjs: 7.8.1 + nanoid: 5.1.3 + nostr-tools: 2.10.4(typescript@5.8.2) + rxjs: 7.8.2 transitivePeerDependencies: - supports-color - typescript - applesauce-factory@0.11.0(typescript@5.7.3): + applesauce-factory@0.11.0(typescript@5.8.2): dependencies: - applesauce-content: 0.11.0(typescript@5.7.3) - applesauce-core: 0.11.0(typescript@5.7.3) - nanoid: 5.1.0 - nostr-tools: 2.10.4(typescript@5.7.3) + applesauce-content: 0.11.0(typescript@5.8.2) + applesauce-core: 0.11.0(typescript@5.8.2) + nanoid: 5.1.3 + nostr-tools: 2.10.4(typescript@5.8.2) transitivePeerDependencies: - supports-color - typescript - applesauce-loaders@0.11.0(typescript@5.7.3): + applesauce-loaders@0.11.0(typescript@5.8.2): dependencies: - applesauce-core: 0.11.0(typescript@5.7.3) - nanoid: 5.1.0 - nostr-tools: 2.10.4(typescript@5.7.3) + applesauce-core: 0.11.0(typescript@5.8.2) + nanoid: 5.1.3 + nostr-tools: 2.10.4(typescript@5.8.2) rx-nostr: 3.5.0 - rxjs: 7.8.1 + rxjs: 7.8.2 transitivePeerDependencies: - supports-color - typescript - applesauce-signers@0.11.0(typescript@5.7.3): + applesauce-signers@0.11.0(typescript@5.8.2): dependencies: '@noble/hashes': 1.7.1 '@noble/secp256k1': 1.7.1 '@scure/base': 1.2.4 - applesauce-core: 0.11.0(typescript@5.7.3) + applesauce-core: 0.11.0(typescript@5.8.2) debug: 4.4.0(supports-color@5.5.0) - nanoid: 5.1.0 - nostr-tools: 2.10.4(typescript@5.7.3) + nanoid: 5.1.3 + nostr-tools: 2.10.4(typescript@5.8.2) transitivePeerDependencies: - supports-color - typescript @@ -2710,10 +2762,17 @@ snapshots: balanced-match@1.0.2: {} + bare-addon-resolve@1.9.3(bare-url@2.1.3): + dependencies: + bare-module-resolve: 1.10.2(bare-url@2.1.3) + bare-semver: 1.0.1 + optionalDependencies: + bare-url: 2.1.3 + bare-dgram@1.0.1: dependencies: bare-events: 2.5.4 - udx-native: 1.17.4 + udx-native: 1.17.5 bare-dns@1.0.5: {} @@ -2721,6 +2780,12 @@ snapshots: bare-events@2.5.4: {} + bare-module-resolve@1.10.2(bare-url@2.1.3): + dependencies: + bare-semver: 1.0.1 + optionalDependencies: + bare-url: 2.1.3 + bare-net@1.0.1: dependencies: bare-events: 2.5.4 @@ -2739,6 +2804,12 @@ snapshots: transitivePeerDependencies: - bare-buffer + bare-os@3.5.1: {} + + bare-path@3.0.0: + dependencies: + bare-os: 3.5.1 + bare-pipe@3.3.8: dependencies: bare-events: 2.5.4 @@ -2753,6 +2824,8 @@ snapshots: transitivePeerDependencies: - bare-buffer + bare-semver@1.0.1: {} + bare-stream@2.6.5(bare-events@2.5.4): dependencies: streamx: 2.22.0 @@ -2775,6 +2848,10 @@ snapshots: transitivePeerDependencies: - bare-buffer + bare-url@2.1.3: + dependencies: + bare-path: 3.0.0 + base64-js@1.5.1: {} basic-ftp@5.0.5: {} @@ -2831,7 +2908,7 @@ snapshots: blossom-client-sdk@2.1.1: dependencies: - '@cashu/cashu-ts': 2.2.0 + '@cashu/cashu-ts': 2.2.1 '@noble/hashes': 1.7.1 blossom-server-sdk@0.4.0: @@ -2894,6 +2971,11 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + bun-types@1.2.4: + dependencies: + '@types/node': 22.13.10 + '@types/ws': 8.5.14 + bytes@3.1.2: {} call-bind-apply-helpers@1.0.2: @@ -2905,13 +2987,13 @@ snapshots: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 - call-bound@1.0.3: + call-bound@1.0.4: dependencies: call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 character-entities@2.0.2: {} @@ -2992,7 +3074,7 @@ snapshots: optionalDependencies: supports-color: 5.5.0 - decode-named-character-reference@1.0.2: + decode-named-character-reference@1.1.0: dependencies: character-entities: 2.0.2 @@ -3042,7 +3124,7 @@ snapshots: sodium-universal: 4.0.1 streamx: 2.22.0 time-ordered-set: 2.0.1 - udx-native: 1.17.4 + udx-native: 1.17.5 transitivePeerDependencies: - sodium-javascript @@ -3171,11 +3253,11 @@ snapshots: fast-xml-parser@4.5.3: dependencies: - strnum: 1.1.1 + strnum: 1.1.2 - fastq@1.19.0: + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 file-uri-to-path@1.0.0: {} @@ -3233,7 +3315,7 @@ snapshots: function-bind@1.1.2: {} - get-intrinsic@1.2.7: + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 @@ -3426,7 +3508,7 @@ snapshots: is-arguments@1.2.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-binary-path@2.1.0: @@ -3439,7 +3521,7 @@ snapshots: is-generator-function@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -3454,7 +3536,7 @@ snapshots: is-regex@1.2.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -3532,15 +3614,15 @@ snapshots: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.1.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.1 + micromark: 4.0.2 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-decode-string: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color @@ -3574,9 +3656,9 @@ snapshots: methods@1.1.2: {} - micromark-core-commonmark@2.0.2: + micromark-core-commonmark@2.0.3: dependencies: - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-factory-destination: 2.0.1 micromark-factory-label: 2.0.1 @@ -3589,46 +3671,46 @@ snapshots: micromark-util-html-tag-name: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.0.4 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-title@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-whitespace@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-chunked@2.0.1: dependencies: @@ -3638,12 +3720,12 @@ snapshots: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-combine-extensions@2.0.1: dependencies: micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-decode-numeric-character-reference@2.0.2: dependencies: @@ -3651,7 +3733,7 @@ snapshots: micromark-util-decode-string@2.0.1: dependencies: - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.1.0 micromark-util-character: 2.1.1 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-symbol: 2.0.1 @@ -3666,7 +3748,7 @@ snapshots: micromark-util-resolve-all@2.0.1: dependencies: - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-sanitize-uri@2.0.1: dependencies: @@ -3674,24 +3756,24 @@ snapshots: micromark-util-encode: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-subtokenize@2.0.4: + micromark-util-subtokenize@2.1.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.1: {} + micromark-util-types@2.0.2: {} - micromark@4.0.1: + micromark@4.0.2: dependencies: '@types/debug': 4.1.12 debug: 4.4.0(supports-color@5.5.0) - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.1.0 devlop: 1.1.0 - micromark-core-commonmark: 2.0.2 + micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-chunked: 2.0.1 @@ -3701,9 +3783,9 @@ snapshots: micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.0.4 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 transitivePeerDependencies: - supports-color @@ -3761,7 +3843,7 @@ snapshots: nanoassert@2.0.0: {} - nanoid@5.1.0: {} + nanoid@5.1.3: {} napi-build-utils@2.0.0: {} @@ -3779,8 +3861,6 @@ snapshots: dependencies: whatwg-url: 5.0.0 - node-gyp-build@4.8.4: {} - nodemon@3.1.9: dependencies: chokidar: 3.6.0 @@ -3812,7 +3892,7 @@ snapshots: normalize-path@3.0.0: {} - nostr-tools@2.10.4(typescript@5.7.3): + nostr-tools@2.10.4(typescript@5.8.2): dependencies: '@noble/ciphers': 0.5.3 '@noble/curves': 1.2.0 @@ -3822,7 +3902,7 @@ snapshots: '@scure/bip39': 1.2.1 optionalDependencies: nostr-wasm: 0.1.0 - typescript: 5.7.3 + typescript: 5.8.2 nostr-typedef@0.9.0: {} @@ -3893,7 +3973,9 @@ snapshots: degenerator: 5.0.1 netmask: 2.0.2 - package-manager-detector@0.2.9: {} + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.8 parseurl@1.3.3: {} @@ -3932,7 +4014,7 @@ snapshots: prettier@2.8.8: {} - prettier@3.5.1: {} + prettier@3.5.3: {} process-streams@1.0.3: dependencies: @@ -3962,6 +4044,8 @@ snapshots: dependencies: side-channel: 1.1.0 + quansync@0.2.8: {} + query-string@7.1.3: dependencies: decode-uri-component: 0.2.2 @@ -4016,7 +4100,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 mdast-util-from-markdown: 2.0.2 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -4036,9 +4120,14 @@ snapshots: transitivePeerDependencies: - supports-color + require-addon@1.1.0: + dependencies: + bare-addon-resolve: 1.9.3(bare-url@2.1.3) + bare-url: 2.1.3 + resolve-from@5.0.0: {} - reusify@1.0.4: {} + reusify@1.1.0: {} rfc4648@1.5.4: {} @@ -4049,9 +4138,9 @@ snapshots: rx-nostr@3.5.0: dependencies: nostr-typedef: 0.9.0 - rxjs: 7.8.1 + rxjs: 7.8.2 - rxjs@7.8.1: + rxjs@7.8.2: dependencies: tslib: 2.8.1 @@ -4059,7 +4148,7 @@ snapshots: safe-regex-test@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-regex: 1.2.1 @@ -4103,7 +4192,7 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -4122,16 +4211,16 @@ snapshots: side-channel-map@1.0.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-inspect: 1.13.4 side-channel-map: 1.0.1 @@ -4176,9 +4265,9 @@ snapshots: ip-address: 9.0.5 smart-buffer: 4.2.0 - sodium-native@4.3.2: + sodium-native@4.3.3: dependencies: - node-gyp-build: 4.8.4 + require-addon: 1.1.0 sodium-secretstream@1.1.1: dependencies: @@ -4189,7 +4278,7 @@ snapshots: sodium-universal@4.0.1: dependencies: - sodium-native: 4.3.2 + sodium-native: 4.3.3 source-map-support@0.5.21: dependencies: @@ -4234,7 +4323,7 @@ snapshots: strip-json-comments@2.0.1: {} - strnum@1.1.1: {} + strnum@1.1.2: {} supports-color@5.5.0: dependencies: @@ -4296,13 +4385,13 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typescript@5.7.3: {} + typescript@5.8.2: {} - udx-native@1.17.4: + udx-native@1.17.5: dependencies: b4a: 1.6.7 bare-events: 2.5.4 - node-gyp-build: 4.8.4 + require-addon: 1.1.0 streamx: 2.22.0 undefsafe@2.0.5: {} @@ -4399,7 +4488,7 @@ snapshots: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 for-each: 0.3.5 gopd: 1.2.0 has-tostringtag: 1.0.2 diff --git a/src/app/database.ts b/src/app/database.ts index 1fc1965..17a71b4 100644 --- a/src/app/database.ts +++ b/src/app/database.ts @@ -34,14 +34,14 @@ export default class LocalDatabase extends EventEmitter { // Detect architecture to pass the correct native sqlite module this.db = new Database(this.path.main); - if (this.config.wal) this.db.pragma("journal_mode = WAL"); + if (this.config.wal) this.db.exec("PRAGMA journal_mode = WAL"); } hasTable(table: string) { const result = this.db - .prepare(`SELECT COUNT(*) as count FROM sqlite_master WHERE type='table' AND name=?`) - .get([table]) as { count: number }; - return result.count > 0; + .prepare<[string], { count: number }>(`SELECT COUNT(*) as count FROM sqlite_master WHERE type='table' AND name=?`) + .get(table); + return !!result && result.count > 0; } // Delete all events in the database diff --git a/src/app/index.ts b/src/app/index.ts index f93f9cb..a8501c5 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -1,8 +1,6 @@ import { WebSocketServer } from "ws"; -import { createServer, Server } from "http"; +import { Server } from "http"; import { SimpleSigner } from "applesauce-signers/signers/simple-signer"; -import { IEventStore, NostrRelay, SQLiteEventStore } from "@satellite-earth/core"; -import { getDMRecipient } from "@satellite-earth/core/helpers/nostr"; import { kinds } from "nostr-tools"; import { AbstractRelay } from "nostr-tools/abstract-relay"; import express, { Express } from "express"; @@ -48,9 +46,12 @@ import secrets from "../services/secrets.js"; import config from "../services/config.js"; import logStore from "../services/log-store.js"; import stateManager from "../services/state.js"; -import eventCache from "../services/event-cache.js"; +import sqliteEventStore from "../services/event-cache.js"; import { inboundNetwork, outboundNetwork } from "../services/network.js"; import { server } from "../services/server.js"; +import { SQLiteEventStore } from "../sqlite/event-store.js"; +import { NostrRelay } from "../relay/nostr-relay.js"; +import { getDMRecipient } from "../helpers/nostr/dms.js"; type EventMap = { listening: []; @@ -71,7 +72,7 @@ export default class App extends EventEmitter { outboundNetwork: OutboundNetworkManager; database: Database; - eventStore: IEventStore; + eventStore: SQLiteEventStore; logStore: LogStore; relay: NostrRelay; receiver: Receiver; @@ -114,7 +115,7 @@ export default class App extends EventEmitter { // create http and ws server interface this.server = server; - this.inboundNetwork = inboundNetwork + this.inboundNetwork = inboundNetwork; this.outboundNetwork = outboundNetwork; /** make the outbound network reflect the app config */ @@ -153,7 +154,7 @@ export default class App extends EventEmitter { }); // Initialize the event store - this.eventStore = eventCache; + this.eventStore = sqliteEventStore; // setup decryption cache this.decryptionCache = new DecryptionCache(this.database.db); diff --git a/src/classes/json-file.ts b/src/classes/json-file.ts new file mode 100644 index 0000000..9da4bf1 --- /dev/null +++ b/src/classes/json-file.ts @@ -0,0 +1,100 @@ +import { EventEmitter } from "events"; +import { Adapter, Low, LowSync, SyncAdapter } from "lowdb"; + +type EventMap = { + /** fires when file is loaded */ + loaded: [T]; + /** fires when a field is set */ + changed: [T, string, any]; + /** fires when file is loaded or changed */ + updated: [T]; + saved: [T]; +}; + +export class ReactiveJsonFile extends EventEmitter> implements Low { + protected db: Low; + adapter: Adapter; + + data: T; + + constructor(adapter: Adapter, defaultData: T) { + super(); + + this.adapter = adapter; + this.db = new Low(adapter, defaultData); + + this.data = this.createProxy(); + } + + private createProxy() { + return (this.data = new Proxy(this.db.data, { + get(target, prop, receiver) { + return Reflect.get(target, prop, receiver); + }, + set: (target, p, newValue, receiver) => { + Reflect.set(target, p, newValue, receiver); + this.emit("changed", target as T, String(p), newValue); + this.emit("updated", target as T); + return true; + }, + })); + } + + async read() { + await this.db.read(); + this.emit("loaded", this.db.data); + this.emit("updated", this.db.data); + this.createProxy(); + } + async write() { + await this.db.write(); + this.emit("saved", this.db.data); + } + update(fn: (data: T) => unknown) { + return this.db.update(fn); + } +} + +export class ReactiveJsonFileSync extends EventEmitter> implements LowSync { + protected db: LowSync; + adapter: SyncAdapter; + + data: T; + + constructor(adapter: SyncAdapter, defaultData: T) { + super(); + + this.adapter = adapter; + this.db = new LowSync(adapter, defaultData); + + this.data = this.createProxy(); + } + + private createProxy() { + return (this.data = new Proxy(this.db.data, { + get(target, prop, receiver) { + return Reflect.get(target, prop, receiver); + }, + set: (target, p, newValue, receiver) => { + Reflect.set(target, p, newValue, receiver); + this.emit("changed", target as T, String(p), newValue); + this.emit("updated", target as T); + return true; + }, + })); + } + + read() { + this.db.read(); + this.emit("loaded", this.db.data); + this.emit("updated", this.db.data); + this.createProxy(); + } + write() { + this.db.write(); + this.emit("saved", this.db.data); + } + update(fn: (data: T) => unknown) { + return this.db.update(fn); + } +} diff --git a/src/helpers/nostr/channel.ts b/src/helpers/nostr/channel.ts new file mode 100644 index 0000000..45638e4 --- /dev/null +++ b/src/helpers/nostr/channel.ts @@ -0,0 +1,21 @@ +import { NostrEvent } from 'nostr-tools'; + +import { getTagValue } from './event.js'; +import { COMMUNITY_CHANNEL_KIND } from './kinds.js'; + +export const CHANNEL_KIND = COMMUNITY_CHANNEL_KIND; + +export function getChannelId(channel: NostrEvent) { + const id = getTagValue(channel, 'd'); + if (!id) throw new Error('Channel missing id'); + return id; +} +export function getChannelName(channel: NostrEvent) { + return getTagValue(channel, 'name'); +} +export function getChannelAbout(channel: NostrEvent) { + return getTagValue(channel, 'about'); +} +export function getChannelPicture(channel: NostrEvent) { + return getTagValue(channel, 'picture'); +} diff --git a/src/helpers/nostr/communities.ts b/src/helpers/nostr/communities.ts new file mode 100644 index 0000000..9df4bc1 --- /dev/null +++ b/src/helpers/nostr/communities.ts @@ -0,0 +1,18 @@ +import { NostrEvent } from 'nostr-tools'; + +const tagValue = (e: NostrEvent, k: string) => e.tags.find((t) => t[0] === k)?.[1]; +export function getCommunityName(definition: NostrEvent) { + return tagValue(definition, 'name'); +} +export function getCommunityBanner(definition: NostrEvent) { + return tagValue(definition, 'banner'); +} +export function getCommunityImage(definition: NostrEvent) { + return tagValue(definition, 'image'); +} +export function getCommunityRelay(definition: NostrEvent) { + return tagValue(definition, 'r'); +} +export function getCommunityCDN(definition: NostrEvent) { + return tagValue(definition, 'cdn'); +} diff --git a/src/helpers/nostr/contacts.ts b/src/helpers/nostr/contacts.ts new file mode 100644 index 0000000..d307bae --- /dev/null +++ b/src/helpers/nostr/contacts.ts @@ -0,0 +1,20 @@ +import { NostrEvent } from 'nostr-tools'; +import { safeRelayUrl } from './relays.js'; + +export function getRelaysFromContactList(event: NostrEvent) { + try { + const json = JSON.parse(event.content) as Record; + const relays: { url: string; write?: boolean; read?: boolean }[] = []; + + for (const [url, value] of Object.entries(json)) { + const safeUrl = safeRelayUrl(url); + if (safeUrl) { + relays.push({ url: safeUrl, write: value.write, read: value.read }); + } + } + + return relays; + } catch (error) { + return null; + } +} diff --git a/src/helpers/nostr/dms.ts b/src/helpers/nostr/dms.ts new file mode 100644 index 0000000..be1d739 --- /dev/null +++ b/src/helpers/nostr/dms.ts @@ -0,0 +1,10 @@ +import { NostrEvent } from 'nostr-tools'; + +export function getDMSender(event: NostrEvent) { + return event.pubkey; +} +export function getDMRecipient(event: NostrEvent) { + const pubkey = event.tags.find((t) => t[0] === 'p')?.[1]; + if (!pubkey) throw new Error('Missing recipient pubkey'); + return pubkey; +} diff --git a/src/helpers/nostr/event.ts b/src/helpers/nostr/event.ts new file mode 100644 index 0000000..499697f --- /dev/null +++ b/src/helpers/nostr/event.ts @@ -0,0 +1,63 @@ +import { NostrEvent, kinds, nip19 } from 'nostr-tools'; + +export function isReplaceable(kind: number) { + return kinds.isReplaceableKind(kind) || kinds.isParameterizedReplaceableKind(kind); +} + +export function sortByDate(a: NostrEvent, b: NostrEvent) { + return b.created_at - a.created_at; +} + +export function getEventCoordinate(event: NostrEvent) { + const d = event.tags.find((t) => t[0] === 'd')?.[1]; + return d ? `${event.kind}:${event.pubkey}:${d}` : `${event.kind}:${event.pubkey}`; +} + +export function getTagValue(event: NostrEvent, tag: string) { + return event.tags.find((t) => t[0] === tag)?.[1]; +} + +export function doesEventMatchCoordinate(event: NostrEvent, coordinate: string) { + const [kind, pubkey, d] = coordinate.split(':'); + if (!kind || !pubkey || !d) return false; + return ( + event.kind === parseInt(kind) && event.pubkey === event.pubkey && event.tags.find((t) => t[0] === 'd')?.[1] === d + ); +} + +export type CustomAddressPointer = Omit & { + identifier?: string; +}; + +export function parseCoordinate(a: string): CustomAddressPointer | null; +export function parseCoordinate(a: string, requireD: false): CustomAddressPointer | null; +export function parseCoordinate(a: string, requireD: true): nip19.AddressPointer | null; +export function parseCoordinate(a: string, requireD: false, silent: false): CustomAddressPointer; +export function parseCoordinate(a: string, requireD: true, silent: false): nip19.AddressPointer; +export function parseCoordinate(a: string, requireD: true, silent: true): nip19.AddressPointer | null; +export function parseCoordinate(a: string, requireD: false, silent: true): CustomAddressPointer | null; +export function parseCoordinate(a: string, requireD = false, silent = true): CustomAddressPointer | null { + const parts = a.split(':') as (string | undefined)[]; + const kind = parts[0] && parseInt(parts[0]); + const pubkey = parts[1]; + const d = parts[2]; + + if (!kind) { + if (silent) return null; + else throw new Error('Missing kind'); + } + if (!pubkey) { + if (silent) return null; + else throw new Error('Missing pubkey'); + } + if (requireD && d === undefined) { + if (silent) return null; + else throw new Error('Missing identifier'); + } + + return { + kind, + pubkey, + identifier: d, + }; +} diff --git a/src/helpers/nostr/index.ts b/src/helpers/nostr/index.ts new file mode 100644 index 0000000..46da967 --- /dev/null +++ b/src/helpers/nostr/index.ts @@ -0,0 +1,7 @@ +export * from './channel.js'; +export * from './communities.js'; +export * from './dms.js'; +export * from './event.js'; +export * from './kinds.js'; +export * from './profile.js'; +export * from './nip19.js'; diff --git a/src/helpers/nostr/kinds.ts b/src/helpers/nostr/kinds.ts new file mode 100644 index 0000000..e85eedf --- /dev/null +++ b/src/helpers/nostr/kinds.ts @@ -0,0 +1,2 @@ +export const COMMUNITY_CHANNEL_KIND = 39000; +export const COMMUNITY_CHAT_MESSAGE = 9; diff --git a/src/helpers/nostr/lists.ts b/src/helpers/nostr/lists.ts new file mode 100644 index 0000000..2926b88 --- /dev/null +++ b/src/helpers/nostr/lists.ts @@ -0,0 +1,104 @@ +import { EventTemplate, nip19, NostrEvent } from 'nostr-tools'; +import { parseCoordinate } from './event.js'; + +function unixNow() { + return Math.round(Date.now() / 1000); +} + +export function getPubkeysFromList(event: NostrEvent | EventTemplate) { + return event.tags.filter((t) => t[0] === 'p' && t[1]).map((t) => ({ pubkey: t[1], relay: t[2], petname: t[3] })); +} +export function getEventPointersFromList(event: NostrEvent | EventTemplate): nip19.EventPointer[] { + return event.tags + .filter((t) => t[0] === 'e' && t[1]) + .map((t) => (t[2] ? { id: t[1], relays: [t[2]] } : { id: t[1] })); +} +export function getCoordinatesFromList(event: NostrEvent | EventTemplate) { + return event.tags.filter((t) => t[0] === 'a' && t[1] && t[2]).map((t) => ({ coordinate: t[1], relay: t[2] })); +} +export function getAddressPointersFromList(event: NostrEvent | EventTemplate): nip19.AddressPointer[] { + const pointers: nip19.AddressPointer[] = []; + + for (const tag of event.tags) { + if (!tag[1]) continue; + const relay = tag[2]; + const parsed = parseCoordinate(tag[1]); + if (!parsed?.identifier) continue; + + pointers.push({ ...parsed, identifier: parsed?.identifier, relays: relay ? [relay] : undefined }); + } + + return pointers; +} + +export function isPubkeyInList(list?: NostrEvent, pubkey?: string) { + if (!pubkey || !list) return false; + return list.tags.some((t) => t[0] === 'p' && t[1] === pubkey); +} + +export function listAddPerson( + list: NostrEvent | EventTemplate, + pubkey: string, + relay?: string, + petname?: string, +): EventTemplate { + if (list.tags.some((t) => t[0] === 'p' && t[1] === pubkey)) throw new Error('Person already in list'); + const pTag = ['p', pubkey, relay ?? '', petname ?? '']; + while (pTag[pTag.length - 1] === '') pTag.pop(); + + return { + created_at: unixNow(), + kind: list.kind, + content: list.content, + tags: [...list.tags, pTag], + }; +} + +export function listRemovePerson(list: NostrEvent | EventTemplate, pubkey: string): EventTemplate { + return { + created_at: unixNow(), + kind: list.kind, + content: list.content, + tags: list.tags.filter((t) => !(t[0] === 'p' && t[1] === pubkey)), + }; +} + +export function listAddEvent(list: NostrEvent | EventTemplate, event: string, relay?: string): EventTemplate { + if (list.tags.some((t) => t[0] === 'e' && t[1] === event)) throw new Error('Event already in list'); + + return { + created_at: unixNow(), + kind: list.kind, + content: list.content, + tags: [...list.tags, relay ? ['e', event, relay] : ['e', event]], + }; +} + +export function listRemoveEvent(list: NostrEvent | EventTemplate, event: string): EventTemplate { + return { + created_at: unixNow(), + kind: list.kind, + content: list.content, + tags: list.tags.filter((t) => !(t[0] === 'e' && t[1] === event)), + }; +} + +export function listAddCoordinate(list: NostrEvent | EventTemplate, coordinate: string, relay?: string): EventTemplate { + if (list.tags.some((t) => t[0] === 'a' && t[1] === coordinate)) throw new Error('Event already in list'); + + return { + created_at: unixNow(), + kind: list.kind, + content: list.content, + tags: [...list.tags, relay ? ['a', coordinate, relay] : ['a', coordinate]], + }; +} + +export function listRemoveCoordinate(list: NostrEvent | EventTemplate, coordinate: string): EventTemplate { + return { + created_at: unixNow(), + kind: list.kind, + content: list.content, + tags: list.tags.filter((t) => !(t[0] === 'a' && t[1] === coordinate)), + }; +} diff --git a/src/helpers/nostr/long-form.ts b/src/helpers/nostr/long-form.ts new file mode 100644 index 0000000..a2d0eec --- /dev/null +++ b/src/helpers/nostr/long-form.ts @@ -0,0 +1,15 @@ +import { NostrEvent } from 'nostr-tools'; + +export function getArticleTitle(event: NostrEvent) { + return event.tags.find((t) => t[0] === 'title')?.[1]; +} +export function getArticleSummary(event: NostrEvent) { + return event.tags.find((t) => t[0] === 'summary')?.[1]; +} +export function getArticleImage(event: NostrEvent) { + return event.tags.find((t) => t[0] === 'image')?.[1]; +} +export function getArticlePublishDate(event: NostrEvent) { + const timestamp = event.tags.find((t) => t[0] === 'published_at')?.[1]; + return timestamp ? parseInt(timestamp) : undefined; +} diff --git a/src/helpers/nostr/mailboxes.ts b/src/helpers/nostr/mailboxes.ts new file mode 100644 index 0000000..f2388a6 --- /dev/null +++ b/src/helpers/nostr/mailboxes.ts @@ -0,0 +1,17 @@ +import { NostrEvent } from 'nostr-tools'; +import { safeRelayUrls } from './relays.js'; + +// inbox relays can be ["r", , "read"] or ["r", ] +export function getInboxes(event?: NostrEvent | null, fallback?: string[]) { + const tags = event ? event.tags.filter((t) => (t[0] === 'r' && t[2] === 'read') || t[2] === undefined) : []; + const urls = safeRelayUrls(tags.map((t) => t[1])); + if (fallback && urls.length === 0) return fallback; + return urls; +} + +export function getOutboxes(event?: NostrEvent | null, fallback?: string[]) { + const tags = event ? event.tags.filter((t) => (t[0] === 'r' && t[2] === 'write') || t[2] === undefined) : []; + const urls = safeRelayUrls(tags.map((t) => t[1])); + if (fallback && urls.length === 0) return fallback; + return urls; +} diff --git a/src/helpers/nostr/nip19.ts b/src/helpers/nostr/nip19.ts new file mode 100644 index 0000000..abfcde1 --- /dev/null +++ b/src/helpers/nostr/nip19.ts @@ -0,0 +1,22 @@ +import { nip19, NostrEvent } from 'nostr-tools'; +import { isReplaceable } from './event.js'; + +export function getSharableEventAddress(event: NostrEvent, relays?: Iterable) { + if (isReplaceable(event.kind)) { + const d = event.tags.find((t) => t[0] === 'd' && t[1])?.[1]; + if (!d) return null; + return nip19.naddrEncode({ + kind: event.kind, + identifier: d, + pubkey: event.pubkey, + relays: relays && Array.from(relays), + }); + } else { + return nip19.neventEncode({ + id: event.id, + kind: event.kind, + relays: relays && Array.from(relays), + author: event.pubkey, + }); + } +} diff --git a/src/helpers/nostr/profile.ts b/src/helpers/nostr/profile.ts new file mode 100644 index 0000000..7d49ebe --- /dev/null +++ b/src/helpers/nostr/profile.ts @@ -0,0 +1,51 @@ +import { NostrEvent, nip19 } from 'nostr-tools'; + +export type Kind0ParsedContent = { + pubkey?: string; + name?: string; + display_name?: string; + displayName?: string; + about?: string; + /** @deprecated */ + image?: string; + picture?: string; + banner?: string; + website?: string; + lud16?: string; + lud06?: string; + nip05?: string; +}; + +export function parseKind0Event(event: NostrEvent): Kind0ParsedContent { + if (event.kind !== 0) throw new Error('expected a kind 0 event'); + try { + const metadata = JSON.parse(event.content) as Kind0ParsedContent; + metadata.pubkey = event.pubkey; + + // ensure nip05 is a string + if (metadata.nip05 && typeof metadata.nip05 !== 'string') metadata.nip05 = String(metadata.nip05); + + // fix user website + if (metadata.website) metadata.website = fixWebsiteUrl(metadata.website); + + return metadata; + } catch (e) {} + return {}; +} + +export function getSearchNames(metadata: Kind0ParsedContent) { + if (!metadata) return []; + + return [metadata.displayName, metadata.display_name, metadata.name].filter(Boolean) as string[]; +} + +export function getUserDisplayName(metadata: Kind0ParsedContent | undefined, pubkey: string) { + return metadata?.displayName || metadata?.display_name || metadata?.name || nip19.npubEncode(pubkey).slice(0, 8); +} + +export function fixWebsiteUrl(website: string) { + if (website.match(/^http?s:\/\//)) { + return website; + } + return 'https://' + website; +} diff --git a/src/helpers/nostr/relays.ts b/src/helpers/nostr/relays.ts new file mode 100644 index 0000000..e02a182 --- /dev/null +++ b/src/helpers/nostr/relays.ts @@ -0,0 +1,24 @@ +export function validateRelayURL(relay: string | URL) { + if (typeof relay === 'string' && relay.includes(',ws')) throw new Error('Can not have multiple relays in one string'); + const url = typeof relay === 'string' ? new URL(relay) : relay; + if (url.protocol !== 'wss:' && url.protocol !== 'ws:') throw new Error('Incorrect protocol'); + return url; +} +export function isValidRelayURL(relay: string | URL) { + try { + validateRelayURL(relay); + return true; + } catch (e) { + return false; + } +} +export function safeRelayUrl(relayUrl: string | URL) { + try { + return validateRelayURL(relayUrl).toString(); + } catch (e) { + return null; + } +} +export function safeRelayUrls(urls: Iterable): string[] { + return Array.from(urls).map(safeRelayUrl).filter(Boolean) as string[]; +} diff --git a/src/helpers/sql.ts b/src/helpers/sql.ts new file mode 100644 index 0000000..59c1f30 --- /dev/null +++ b/src/helpers/sql.ts @@ -0,0 +1,3 @@ +export function mapParams(params: any[]) { + return `(${params.map(() => "?").join(", ")})`; +} diff --git a/src/helpers/super-map.ts b/src/helpers/super-map.ts new file mode 100644 index 0000000..810a7ba --- /dev/null +++ b/src/helpers/super-map.ts @@ -0,0 +1,17 @@ +export default class SuperMap extends Map { + newValue: (key: Key) => Value; + + constructor(newValue: (key: Key) => Value) { + super(); + this.newValue = newValue; + } + + get(key: Key) { + let value = super.get(key); + if (value === undefined) { + value = this.newValue(key); + this.set(key, value); + } + return value; + } +} diff --git a/src/modules/community-multiplexer.ts b/src/modules/community-multiplexer.ts deleted file mode 100644 index 69b51a3..0000000 --- a/src/modules/community-multiplexer.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { type Database } from "better-sqlite3"; -import { WebSocket, WebSocketServer } from "ws"; -import { type IncomingMessage } from "http"; -import { randomBytes } from "crypto"; -import { NostrEvent, SimplePool } from "nostr-tools"; - -import { HyperConnectionManager } from "./hyper-connection-manager.js"; -import { logger } from "../logger.js"; -import { CommunityProxy } from "./community-proxy.js"; -import { IEventStore } from "@satellite-earth/core"; - -export class CommunityMultiplexer { - log = logger.extend("community-multiplexer"); - db: Database; - eventStore: IEventStore; - pool: SimplePool; - connectionManager: HyperConnectionManager; - - communities = new Map(); - - constructor(db: Database, eventStore: IEventStore) { - this.db = db; - this.eventStore = eventStore; - this.pool = new SimplePool(); - - this.connectionManager = new HyperConnectionManager(randomBytes(32).toString("hex")); - - this.syncCommunityDefinitions(); - } - - attachToServer(wss: WebSocketServer) { - wss.on("connection", this.handleConnection.bind(this)); - } - - handleConnection(ws: WebSocket, req: IncomingMessage) { - if (!req.url) return false; - - const url = new URL(req.url, `http://${req.headers.host}`); - const pubkey = url.pathname.split("/")[1] as string | undefined; - if (!pubkey || pubkey.length !== 64) return false; - - try { - let community = this.communities.get(pubkey); - if (!community) community = this.getCommunityProxy(pubkey); - - // connect the socket to the relay - community.relay.handleConnection(ws, req); - return true; - } catch (error) { - this.log("Failed handle ws connection to", pubkey); - console.log(error); - return false; - } - } - - syncCommunityDefinitions() { - this.log("Syncing community definitions"); - const sub = this.pool.subscribeMany(["wss://nostrue.com"], [{ kinds: [12012] }], { - onevent: (event) => this.eventStore.addEvent(event), - oneose: () => sub.close(), - }); - } - - getCommunityProxy(pubkey: string) { - this.log("Looking for community definition", pubkey); - let definition: NostrEvent | undefined = undefined; - - const local = this.eventStore.getEventsForFilters([{ kinds: [12012], authors: [pubkey] }]); - if (local[0]) definition = local[0]; - - if (!definition) throw new Error("Failed to find community definition"); - - this.log("Creating community proxy", pubkey); - const community = new CommunityProxy(this.db, definition, this.connectionManager); - - community.connect(); - this.communities.set(pubkey, community); - - return community; - } - - stop() { - for (const [pubkey, community] of this.communities) { - community.stop(); - } - this.communities.clear(); - this.connectionManager.stop(); - } -} diff --git a/src/modules/community-proxy.ts b/src/modules/community-proxy.ts deleted file mode 100644 index 3d3a79c..0000000 --- a/src/modules/community-proxy.ts +++ /dev/null @@ -1,175 +0,0 @@ -import { type Database } from "better-sqlite3"; -import { Debugger } from "debug"; -import { Filter, NostrEvent, Relay, kinds } from "nostr-tools"; -import { NostrRelay, RelayActions } from "@satellite-earth/core"; -import { Subscription } from "nostr-tools/abstract-relay"; - -import { LabeledEventStore } from "./labeled-event-store.js"; -import { HyperConnectionManager } from "./hyper-connection-manager.js"; -import { logger } from "../logger.js"; - -/** Used to connect to and sync with remote communities */ -export class CommunityProxy { - log: Debugger; - database: Database; - connectionManager: HyperConnectionManager; - definition: NostrEvent; - - upstream?: Relay; - eventStore: LabeledEventStore; - relay: NostrRelay; - - get addresses() { - return this.definition.tags.filter((t) => t[0] === "r" && t[1]).map((t) => t[1]); - } - - constructor(database: Database, communityDefinition: NostrEvent, connectionManager: HyperConnectionManager) { - this.database = database; - this.connectionManager = connectionManager; - this.definition = communityDefinition; - this.log = logger.extend("community-proxy:" + communityDefinition.pubkey); - - this.eventStore = new LabeledEventStore(this.database, communityDefinition.pubkey); - this.eventStore.setup(); - this.relay = new NostrRelay(this.eventStore); - - // handle incoming events and pass them to the upstream relay - this.relay.registerEventHandler(async (ctx, next) => { - // send event to upstream relay - if (this.upstream) { - const result = this.upstream.publish(ctx.event); - this.log("Sent event to upstream", ctx.event.id); - return result; - } else throw new Error("Not connected to upstream"); - }); - - this.relay.on("subscription:created", (subscription, ws) => { - this.syncChannelsFromFilters(subscription.filters); - }); - this.relay.on("subscription:updated", (subscription, ws) => { - this.syncChannelsFromFilters(subscription.filters); - }); - } - - protected async connectUpstream() { - if (this.upstream) { - if (this.upstream.connected) this.upstream.close(); - this.upstream = undefined; - } - - const hyperAddress = this.definition.tags.find((t) => t[0] === "r" && t[1] && t[2] === "hyper")?.[1]; - let address = this.definition.tags.find((t) => t[0] === "r" && t[1].startsWith("ws"))?.[1]; - - if (hyperAddress) { - const serverInfo = await this.connectionManager.getLocalAddress(hyperAddress); - address = new URL(`ws://${serverInfo.address}:${serverInfo.port}`).toString(); - } - - if (!address) throw new Error("Failed to find connection address"); - - try { - this.log("Connecting to upstream", address); - this.upstream = await Relay.connect(address); - - this.upstream.onclose = () => { - this.log("Upstream connection closed"); - this.upstream = undefined; - }; - } catch (error) { - this.log("Failed to connect to upstream"); - if (error instanceof Error) this.log(error); - } - } - - async connect() { - if (this.upstream) return; - await this.connectUpstream(); - - setTimeout(() => { - this.syncMetadata(); - this.syncDeletions(); - }, 100); - } - - handleEvent(event: NostrEvent) { - try { - switch (event.kind) { - case kinds.EventDeletion: - this.handleDeleteEvent(event); - break; - default: - this.eventStore.addEvent(event); - break; - } - } catch (error) { - this.log("Failed to handle event"); - console.log(error); - } - } - - handleDeleteEvent(deleteEvent: NostrEvent) { - const communityPubkey = this.definition.pubkey; - - const ids = RelayActions.handleDeleteEvent( - this.eventStore, - deleteEvent, - deleteEvent.pubkey === communityPubkey ? () => true : undefined, - ); - - if (ids.length) this.log(`Deleted`, ids.length, "events"); - } - - syncMetadata() { - if (!this.upstream) return; - - this.log("Opening subscription to sync metadata"); - this.upstream.subscribe([{ kinds: [kinds.Metadata, kinds.RelayList, 12012, 39000, 39001, 39002] }], { - id: "metadata-sync", - onevent: (event) => this.handleEvent(event), - onclose: () => this.log("Closed metadata sync"), - }); - } - - syncDeletions() { - if (!this.upstream) return; - - this.log("Opening subscription to sync deletions"); - - this.upstream.subscribe([{ kinds: [kinds.EventDeletion] }], { - id: "deletion-sync", - onevent: (event) => this.handleEvent(event), - onclose: () => this.log("Closed deletion sync"), - }); - } - - private syncChannelsFromFilters(filters: Filter[]) { - const channels = new Set(); - for (const filter of filters) { - if (filter["#h"]) filter["#h"].forEach((c) => channels.add(c)); - } - for (const channel of channels) { - this.syncChannel(channel); - } - } - - channelSubs = new Map(); - syncChannel(channel: string) { - if (!this.upstream) return; - if (this.channelSubs.has(channel)) return; - - this.log("Opening subscription to sync channel", channel); - const sub = this.upstream.subscribe([{ kinds: [9, 10, 11, 12], "#h": [channel] }], { - id: `channel-${channel}-sync`, - onevent: (event) => this.eventStore.addEvent(event), - onclose: () => { - this.channelSubs.delete(channel); - }, - }); - - this.channelSubs.set(channel, sub); - } - - stop() { - this.upstream?.close(); - } -} diff --git a/src/modules/config-manager.ts b/src/modules/config-manager.ts index 22201f8..275d94e 100644 --- a/src/modules/config-manager.ts +++ b/src/modules/config-manager.ts @@ -2,9 +2,9 @@ import { JSONFileSync } from "lowdb/node"; import _throttle from "lodash.throttle"; import { uniqueNamesGenerator, adjectives, colors, animals } from "unique-names-generator"; import { PrivateNodeConfig } from "@satellite-earth/core/types/private-node-config.js"; -import { ReactiveJsonFileSync } from "@satellite-earth/core"; import { logger } from "../logger.js"; +import { ReactiveJsonFileSync } from "../classes/json-file.js"; export const defaultConfig: PrivateNodeConfig = { name: uniqueNamesGenerator({ diff --git a/src/modules/control/database-actions.ts b/src/modules/control/database-actions.ts index 692fcc8..6df2fe0 100644 --- a/src/modules/control/database-actions.ts +++ b/src/modules/control/database-actions.ts @@ -1,5 +1,4 @@ import { WebSocket } from "ws"; -import os from "node:os"; import { DatabaseMessage, DatabaseResponse, DatabaseStats } from "@satellite-earth/core/types/control-api/database.js"; import App from "../../app/index.js"; diff --git a/src/modules/decryption-cache/decryption-cache.ts b/src/modules/decryption-cache/decryption-cache.ts index 5b54989..31e2088 100644 --- a/src/modules/decryption-cache/decryption-cache.ts +++ b/src/modules/decryption-cache/decryption-cache.ts @@ -1,11 +1,11 @@ -import { mapParams } from "@satellite-earth/core/helpers/sql.js"; -import { MigrationSet } from "@satellite-earth/core/sqlite"; +import { MigrationSet } from "../../sqlite/migrations.js"; import { type Database } from "better-sqlite3"; import { EventEmitter } from "events"; +import { EventRow, parseEventRow } from "../../sqlite/event-store.js"; import { logger } from "../../logger.js"; -import { EventRow, parseEventRow } from "@satellite-earth/core/sqlite-event-store"; import { NostrEvent } from "nostr-tools"; +import { mapParams } from "../../helpers/sql.js"; const migrations = new MigrationSet("decryption-cache"); diff --git a/src/modules/direct-message-manager.ts b/src/modules/direct-message-manager.ts index f9d5f91..3c498d4 100644 --- a/src/modules/direct-message-manager.ts +++ b/src/modules/direct-message-manager.ts @@ -1,7 +1,6 @@ import { filter, lastValueFrom, mergeMap, Subscription, tap, toArray } from "rxjs"; import { NostrEvent, kinds } from "nostr-tools"; import { createRxForwardReq } from "rx-nostr"; -import { getRelaysFromContactList } from "@satellite-earth/core/helpers/nostr/contacts.js"; import { MailboxesQuery } from "applesauce-core/queries"; import { EventEmitter } from "events"; @@ -12,6 +11,7 @@ import { rxNostr } from "../services/rx-nostr.js"; import { eventStore, queryStore } from "../services/stores.js"; import { COMMON_CONTACT_RELAYS } from "../env.js"; import { bufferAudit } from "../helpers/rxjs.js"; +import { getRelaysFromContactList } from "../helpers/nostr/contacts.js"; type EventMap = { open: [string, string]; diff --git a/src/modules/gossip.ts b/src/modules/gossip.ts index bd68ff3..6387bd7 100644 --- a/src/modules/gossip.ts +++ b/src/modules/gossip.ts @@ -1,11 +1,12 @@ import { SimpleSigner } from "applesauce-signers/signers/simple-signer"; import { EventTemplate, SimplePool } from "nostr-tools"; import { getTagValue } from "applesauce-core/helpers"; -import { IEventStore, NostrRelay } from "@satellite-earth/core"; import dayjs, { Dayjs } from "dayjs"; import { logger } from "../logger.js"; import InboundNetworkManager from "./network/inbound/index.js"; +import { NostrRelay } from "../relay/nostr-relay.js"; +import { SQLiteEventStore } from "../sqlite/event-store.js"; function buildGossipTemplate(self: string, address: string, network: string): EventTemplate { return { @@ -28,7 +29,7 @@ export default class Gossip { signer: SimpleSigner; pool: SimplePool; relay: NostrRelay; - eventStore: IEventStore; + eventStore: SQLiteEventStore; running = false; // default every 30 minutes @@ -40,7 +41,7 @@ export default class Gossip { signer: SimpleSigner, pool: SimplePool, relay: NostrRelay, - eventStore: IEventStore, + eventStore: SQLiteEventStore, ) { this.network = network; this.signer = signer; diff --git a/src/modules/labeled-event-store.ts b/src/modules/labeled-event-store.ts deleted file mode 100644 index 49bddfa..0000000 --- a/src/modules/labeled-event-store.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { Database } from "better-sqlite3"; -import { Filter, NostrEvent } from "nostr-tools"; -import { IEventStore, SQLiteEventStore } from "@satellite-earth/core"; -import { logger } from "../logger.js"; -import { MigrationSet } from "@satellite-earth/core/sqlite"; - -export function mapParams(params: any[]) { - return `(${params.map(() => `?`).join(", ")})`; -} - -const migrations = new MigrationSet("labeled-event-store"); - -// Version 1 -migrations.addScript(1, async (db, log) => { - db.prepare( - ` - CREATE TABLE IF NOT EXISTS event_labels ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - event TEXT(64) REFERENCES events(id), - label TEXT - ) - `, - ).run(); - - db.prepare("CREATE INDEX IF NOT EXISTS event_labels_label ON event_labels(label)").run(); - db.prepare("CREATE INDEX IF NOT EXISTS event_labels_event ON event_labels(event)").run(); -}); - -/** An event store that is can only see a subset of events int the database */ -export class LabeledEventStore extends SQLiteEventStore implements IEventStore { - label: string; - readAll = false; - - constructor(db: Database, label: string) { - super(db); - this.label = label; - - this.log = logger.extend(`event-store:` + label); - } - - async setup() { - await super.setup(); - await migrations.run(this.db); - } - - override buildConditionsForFilters(filter: Filter) { - const parts = super.buildConditionsForFilters(filter); - - if (!this.readAll) { - parts.joins.push("INNER JOIN event_labels ON events.id = event_labels.event"); - parts.conditions.push("event_labels.label = ?"); - parts.parameters.push(this.label); - return parts; - } - - return parts; - } - - addEvent(event: NostrEvent) { - const inserted = super.addEvent(event); - - const hasLabel = !!this.db - .prepare("SELECT * FROM event_labels WHERE event = ? AND label = ?") - .get(event.id, this.label); - if (!hasLabel) this.db.prepare(`INSERT INTO event_labels (event, label) VALUES (?, ?)`).run(event.id, this.label); - - return inserted; - } - - removeEvents(ids: string[]) { - this.db.prepare(`DELETE FROM event_labels WHERE event IN ${mapParams(ids)}`).run(...ids); - return super.removeEvents(ids); - } - - removeEvent(id: string) { - this.db.prepare(`DELETE FROM event_labels WHERE event = ?`).run(id); - return super.removeEvent(id); - } -} diff --git a/src/modules/log-store/log-store.ts b/src/modules/log-store/log-store.ts index 2ce8897..fb6ee18 100644 --- a/src/modules/log-store/log-store.ts +++ b/src/modules/log-store/log-store.ts @@ -1,10 +1,10 @@ import { type Database as SQLDatabase } from "better-sqlite3"; -import { MigrationSet } from "@satellite-earth/core/sqlite"; import EventEmitter from "events"; import { nanoid } from "nanoid"; import { Debugger } from "debug"; import { logger } from "../../logger.js"; +import { MigrationSet } from "../../sqlite/migrations.js"; type EventMap = { log: [LogEntry]; @@ -157,7 +157,7 @@ export default class LogStore extends EventEmitter { } if (conditions.length > 0) sql += ` WHERE ${conditions.join(" AND ")}`; - this.database.prepare(sql).run(...parameters); + this.database.prepare(sql).run(parameters); this.emit("clear", filter?.service); } } diff --git a/src/modules/notifications/notifications-manager.ts b/src/modules/notifications/notifications-manager.ts index 24840e8..ae66f7a 100644 --- a/src/modules/notifications/notifications-manager.ts +++ b/src/modules/notifications/notifications-manager.ts @@ -1,5 +1,4 @@ import { NotificationChannel, WebPushNotification } from "@satellite-earth/core/types/control-api/notifications.js"; -import { getDMRecipient, getDMSender, getUserDisplayName } from "@satellite-earth/core/helpers/nostr"; import { NostrEvent, kinds } from "nostr-tools"; import { npubEncode } from "nostr-tools/nip19"; import { getDisplayName, unixNow } from "applesauce-core/helpers"; @@ -10,6 +9,7 @@ import { logger } from "../../logger.js"; import App from "../../app/index.js"; import stateManager from "../../services/state.js"; import config from "../../services/config.js"; +import { getDMRecipient, getDMSender } from "../../helpers/nostr/dms.js"; export type NotificationsManagerState = { channels: NotificationChannel[]; diff --git a/src/modules/pubkey-batch-loader.ts b/src/modules/pubkey-batch-loader.ts deleted file mode 100644 index 69127d1..0000000 --- a/src/modules/pubkey-batch-loader.ts +++ /dev/null @@ -1,175 +0,0 @@ -import { Filter, NostrEvent, SimplePool } from "nostr-tools"; -import _throttle from "lodash.throttle"; -import { EventEmitter } from "events"; -import { getInboxes, getOutboxes } from "@satellite-earth/core/helpers/nostr/mailboxes.js"; -import SuperMap from "@satellite-earth/core/helpers/super-map.js"; -import { Deferred, createDefer } from "applesauce-core/promise"; - -import { COMMON_CONTACT_RELAYS } from "../env.js"; - -type EventMap = { - event: [NostrEvent]; - batch: [number, number]; -}; - -/** Loads 10002 events for pubkeys */ -export default class PubkeyBatchLoader extends EventEmitter { - extraRelays = COMMON_CONTACT_RELAYS; - - kind: number; - pool: SimplePool; - loadFromCache?: (pubkey: string) => NostrEvent | undefined; - - get queue() { - return this.next.size; - } - - failed = new SuperMap>(() => new Set()); - - constructor(kind: number, pool: SimplePool, loadFromCache?: (pubkey: string) => NostrEvent | undefined) { - super(); - this.kind = kind; - this.pool = pool; - this.loadFromCache = loadFromCache; - } - - private cache = new Map(); - getEvent(pubkey: string) { - if (this.cache.has(pubkey)) return this.cache.get(pubkey)!; - - const event = this.loadFromCache?.(pubkey); - if (event) { - this.cache.set(pubkey, event); - return event; - } - } - - getOutboxes(pubkey: string) { - const mailboxes = this.getEvent(pubkey); - return mailboxes && getOutboxes(mailboxes); - } - - getInboxes(pubkey: string) { - const mailboxes = this.getEvent(pubkey); - return mailboxes && getInboxes(mailboxes); - } - - handleEvent(event: NostrEvent) { - if (event.kind === this.kind) { - this.emit("event", event); - const current = this.cache.get(event.pubkey); - if (!current || event.created_at > current.created_at) this.cache.set(event.pubkey, event); - } - } - - /** next queue */ - private next = new Map(); - /** currently fetching */ - private fetching = new Map(); - /** promises for next and fetching */ - private pending = new Map>(); - - private fetchEventsThrottle = _throttle(this.fetchEvents.bind(this), 1000); - private async fetchEvents() { - if (this.fetching.size > 0 || this.next.size === 0) return; - - // copy all from next queue to fetching queue - for (const [pubkey, relays] of this.next) this.fetching.set(pubkey, relays); - this.next.clear(); - - if (this.fetching.size > 0) { - const filters: Record = {}; - - for (const [pubkey, relays] of this.fetching) { - for (const relay of relays) { - filters[relay] = filters[relay] || { kinds: [this.kind], authors: [] }; - - if (!filters[relay].authors?.includes(pubkey)) { - filters[relay].authors?.push(pubkey); - } - } - } - - const requests: Record = {}; - for (const [relay, filter] of Object.entries(filters)) requests[relay] = [filter]; - - await new Promise((res) => { - const sub = this.pool.subscribeManyMap(requests, { - onevent: (event) => this.handleEvent(event), - oneose: () => { - sub.close(); - - // resolve all pending promises - let failed = 0; - let found = 0; - for (const [pubkey, relays] of this.fetching) { - const p = this.pending.get(pubkey); - if (p) { - const event = this.getEvent(pubkey) ?? null; - p.resolve(event); - if (!event) { - failed++; - for (const url of relays) this.failed.get(pubkey).add(url); - p.reject(); - } else found++; - this.pending.delete(pubkey); - } - } - this.fetching.clear(); - - this.emit("batch", found, failed); - - res(); - }, - }); - }); - - // if there are pending requests, make another request - if (this.next.size > 0) this.fetchEventsThrottle(); - } - } - - getOrLoadEvent(pubkey: string, relays: string[] = []): Promise { - // if its in the cache, return it - const event = this.getEvent(pubkey); - if (event) return Promise.resolve(event); - - // if its already being fetched, return promise - const pending = this.pending.get(pubkey); - if (pending) return pending; - - return this.loadEvent(pubkey, relays); - } - - loadEvent(pubkey: string, relays: string[] = [], ignoreFailed = false): Promise { - const urls = new Set(this.next.get(pubkey)); - - // add relays - for (const url of relays) urls.add(url); - - // add extra relays - for (const url of this.extraRelays) urls.add(url); - - // filter out failed relays - if (!ignoreFailed) { - const failed = this.failed.get(pubkey); - for (const url of failed) urls.delete(url); - } - - if (urls.size === 0) { - // nothing new to try return null - return Promise.resolve(null); - } - - // create a promise - const defer = createDefer(); - this.pending.set(pubkey, defer); - - // add pubkey and relay to next queue - this.next.set(pubkey, Array.from(urls)); - - // trigger queue - this.fetchEventsThrottle(); - return defer; - } -} diff --git a/src/modules/receiver/index.ts b/src/modules/receiver/index.ts index 3f1e9ae..1bffbf1 100644 --- a/src/modules/receiver/index.ts +++ b/src/modules/receiver/index.ts @@ -1,6 +1,5 @@ import EventEmitter from "events"; import { NostrEvent, SimplePool } from "nostr-tools"; -import SuperMap from "@satellite-earth/core/helpers/super-map.js"; import { Subscription } from "nostr-tools/abstract-relay"; import { getRelaysFromContactsEvent } from "applesauce-core/helpers"; @@ -9,6 +8,7 @@ import { logger } from "../../logger.js"; import App from "../../app/index.js"; import { arrayFallback } from "../../helpers/array.js"; import { requestLoader } from "../../services/loaders.js"; +import SuperMap from "../../helpers/super-map.js"; type EventMap = { started: [Receiver]; diff --git a/src/modules/reports/manager.ts b/src/modules/reports/manager.ts index 9ada422..5fc4e7c 100644 --- a/src/modules/reports/manager.ts +++ b/src/modules/reports/manager.ts @@ -1,8 +1,8 @@ -import SuperMap from "@satellite-earth/core/helpers/super-map.js"; import { filter, Observable, shareReplay, Subscription } from "rxjs"; import hash_sum from "hash-sum"; import { Session } from "../../relay/session.js"; +import SuperMap from "../../helpers/super-map.js"; // open query messages (id, type, args) export type QueryOpen> = ["QRY", "OPEN", string, string, Args]; diff --git a/src/modules/reports/reports/conversations.ts b/src/modules/reports/reports/conversations.ts index bd5a61e..2cbba27 100644 --- a/src/modules/reports/reports/conversations.ts +++ b/src/modules/reports/reports/conversations.ts @@ -1,9 +1,9 @@ import { ReportArguments, ReportResults } from "@satellite-earth/core/types"; +import { getTagValue } from "applesauce-core/helpers"; import { NostrEvent } from "nostr-tools"; -import { getTagValue } from "@satellite-earth/core/helpers/nostr"; -import SuperMap from "@satellite-earth/core/helpers/super-map.js"; import Report from "../report.js"; +import SuperMap from "../../../helpers/super-map.js"; export default class ConversationsReport extends Report<"CONVERSATIONS"> { readonly type = "CONVERSATIONS"; diff --git a/src/modules/reports/reports/events-summary.ts b/src/modules/reports/reports/events-summary.ts index e8f6e14..73e7915 100644 --- a/src/modules/reports/reports/events-summary.ts +++ b/src/modules/reports/reports/events-summary.ts @@ -1,6 +1,6 @@ import { ReportArguments } from "@satellite-earth/core/types"; -import { EventRow, parseEventRow } from "@satellite-earth/core"; import Report from "../report.js"; +import { EventRow, parseEventRow } from "../../../sqlite/event-store.js"; export default class EventsSummaryReport extends Report<"EVENTS_SUMMARY"> { readonly type = "EVENTS_SUMMARY"; diff --git a/src/modules/scrapper/index.ts b/src/modules/scrapper/index.ts index 81a2e49..75197b6 100644 --- a/src/modules/scrapper/index.ts +++ b/src/modules/scrapper/index.ts @@ -1,4 +1,3 @@ -import SuperMap from "@satellite-earth/core/helpers/super-map.js"; import { EventEmitter } from "events"; import { NostrEvent } from "nostr-tools"; import { Deferred, createDefer } from "applesauce-core/promise"; @@ -7,6 +6,7 @@ import App from "../../app/index.js"; import { logger } from "../../logger.js"; import PubkeyScrapper from "./pubkey-scrapper.js"; import { requestLoader } from "../../services/loaders.js"; +import SuperMap from "../../helpers/super-map.js"; const MAX_TASKS = 10; diff --git a/src/modules/state/application-state-manager.ts b/src/modules/state/application-state-manager.ts index f2ca840..e785d28 100644 --- a/src/modules/state/application-state-manager.ts +++ b/src/modules/state/application-state-manager.ts @@ -1,7 +1,7 @@ -import { MigrationSet } from "@satellite-earth/core/sqlite"; import { Database } from "better-sqlite3"; import { MutableState } from "./mutable-state.js"; +import { MigrationSet } from "../../sqlite/migrations.js"; const migrations = new MigrationSet("application-state"); diff --git a/src/relay/actions/handle-delete-event.ts b/src/relay/actions/handle-delete-event.ts new file mode 100644 index 0000000..6ea2db3 --- /dev/null +++ b/src/relay/actions/handle-delete-event.ts @@ -0,0 +1,53 @@ +import { Filter, NostrEvent, kinds } from "nostr-tools"; +import { SQLiteEventStore } from "../../sqlite/event-store.js"; + +/** + * handles kind 5 delete events + * @param doseMatch if this returns true the event will be deleted + */ +export function handleDeleteEvent( + eventStore: SQLiteEventStore, + deleteEvent: NostrEvent, + doseMatch?: (event: NostrEvent) => boolean, +) { + if (deleteEvent.kind !== kinds.EventDeletion) return []; + + const events = new Map(); + + const ids = deleteEvent.tags.filter((t) => t[0] === "e" && t[1]).map((t) => t[1]); + if (ids.length) { + const eventsFromIds = eventStore.getEventsForFilters([{ ids, until: deleteEvent.created_at }]); + for (const event of eventsFromIds) events.set(event.id, event); + } + + const cords = deleteEvent.tags + .filter((t) => t[0] === "a" && t[1]) + .map((t) => t[1].split(":")) + .filter((cord) => cord.length === 3); + + if (cords.length) { + const eventsFromCords = eventStore.getEventsForFilters( + cords.map(([kind, pubkey, d]) => { + return { + "#d": [d], + kinds: [parseInt(kind)], + authors: [pubkey], + until: deleteEvent.created_at, + } satisfies Filter; + }), + ); + for (const event of eventsFromCords) events.set(event.id, event); + } + + const deleteIds: string[] = []; + for (const [id, event] of events) { + // delete the target event if the delete event was signed by the community or original author + if (doseMatch?.(event) || event.pubkey === deleteEvent.pubkey) { + deleteIds.push(event.id); + } + } + + eventStore.addEvent(deleteEvent); + eventStore.removeEvents(deleteIds); + return deleteIds; +} diff --git a/src/relay/actions/index.ts b/src/relay/actions/index.ts new file mode 100644 index 0000000..3d430d2 --- /dev/null +++ b/src/relay/actions/index.ts @@ -0,0 +1,5 @@ +import { handleDeleteEvent } from './handle-delete-event.js'; + +export const RelayActions = { + handleDeleteEvent, +}; diff --git a/src/relay/nostr-relay.ts b/src/relay/nostr-relay.ts new file mode 100644 index 0000000..c500e7a --- /dev/null +++ b/src/relay/nostr-relay.ts @@ -0,0 +1,424 @@ +import EventEmitter from "events"; +import crypto, { randomUUID } from "crypto"; +import { IncomingMessage } from "http"; +import { type WebSocket, RawData } from "ws"; +import { Filter, NostrEvent, verifyEvent, matchFilters } from "nostr-tools"; + +import { logger } from "../logger.js"; +import { SQLiteEventStore } from "../sqlite/event-store.js"; + +export type IncomingReqMessage = ["REQ", string, ...Filter[]]; +export type IncomingCountMessage = ["COUNT", string, ...Filter[]]; +export type IncomingEventMessage = ["EVENT", NostrEvent]; +export type IncomingAuthMessage = ["AUTH", NostrEvent]; +export type IncomingCloseMessage = ["CLOSE", string]; + +export type Subscription = { + type: "REQ" | "COUNT"; + ws: WebSocket; + id: string; + filters: Filter[]; +}; + +export type HandlerNext = () => Promise; + +export type HandlerContext = { event: NostrEvent; socket: WebSocket; relay: NostrRelay }; +export type EventHandler = ( + ctx: HandlerContext, + next: HandlerNext, +) => boolean | undefined | string | void | Promise; + +export type SubscriptionFilterContext = { id: string; filters: Filter[]; socket: WebSocket; relay: NostrRelay }; +export type SubscriptionFilter = ( + ctx: SubscriptionFilterContext, + next: HandlerNext, +) => boolean | undefined | void | Promise; + +type EventMap = { + "event:received": [NostrEvent, WebSocket]; + "event:inserted": [NostrEvent, WebSocket]; + "event:rejected": [NostrEvent, WebSocket]; + "subscription:created": [Subscription, WebSocket]; + "subscription:updated": [Subscription, WebSocket]; + "subscription:closed": [Subscription, WebSocket]; + "socket:connect": [WebSocket]; + "socket:disconnect": [WebSocket]; + "socket:auth": [WebSocket, NostrEvent]; +}; + +export class NostrRelay extends EventEmitter { + static SUPPORTED_NIPS = [1, 4, 11, 45, 50, 70, 119]; + + log = logger.extend("relay"); + eventStore: SQLiteEventStore; + + connectionId = new WeakMap(); + + // A map of subscriptions + subscriptions: Subscription[] = []; + + // Create a map of connections + // in the form : + connections: Record = {}; + + publicURL?: string; + requireRelayInAuth = true; + sendChallenge = false; + auth = new Map(); + checkAuth?: (ws: WebSocket, auth: NostrEvent) => boolean | string; + + checkReadEvent?: (ws: WebSocket, event: NostrEvent, auth?: NostrEvent) => boolean; + + constructor(eventStore: SQLiteEventStore) { + super(); + + this.eventStore = eventStore; + + // listen for new events inserted into the store + this.eventStore.on("event:inserted", (event) => { + // make sure it wasn't the last event we inserted + if (event.id !== this.lastInserted) this.sendEventToSubscriptions(event); + }); + } + + async handleMessage(message: Buffer | string, ws: WebSocket) { + let data; + + try { + // TODO enforce max size + + // Parse JSON from the raw buffer + data = JSON.parse(typeof message === "string" ? message : message.toString("utf-8")); + + if (!Array.isArray(data)) throw new Error("Message is not an array"); + + // Pass the data to appropriate handler + switch (data[0]) { + case "REQ": + case "COUNT": + await this.handleSubscriptionMessage(data as IncomingReqMessage | IncomingCountMessage, ws); + break; + case "EVENT": + await this.handleEventMessage(data as IncomingEventMessage, ws); + break; + case "AUTH": + await this.handleAuthMessage(data as IncomingAuthMessage, ws); + break; + case "CLOSE": + await this.handleCloseMessage(data as IncomingCloseMessage, ws); + break; + } + } catch (err) { + this.log("Failed to handle message", message.toString("utf-8"), err); + } + + return data; + } + + private socketCleanup = new Map void>(); + handleConnection(ws: WebSocket, req: IncomingMessage) { + let ip; + + // Record the IP address of the client + if (typeof req.headers["x-forwarded-for"] === "string") { + ip = req.headers["x-forwarded-for"].split(",")[0].trim(); + } else { + ip = req.socket.remoteAddress; + } + + // listen for messages + const messageListener = (data: RawData, isBinary: boolean) => { + if (data instanceof Buffer) this.handleMessage(data, ws); + }; + ws.on("message", messageListener); + + const closeListener = () => this.handleDisconnect(ws); + ws.on("close", closeListener); + + if (this.sendChallenge) { + const challenge = randomUUID(); + this.auth.set(ws, { challenge }); + ws.send(JSON.stringify(["AUTH", challenge])); + } + + this.emit("socket:connect", ws); + + // Generate a unique ID for ws connection + const id = crypto.randomUUID(); + + this.connectionId.set(ws, id); + this.connections[id] = ws; + + this.socketCleanup.set(ws, () => { + delete this.connections[id]; + ws.off("message", messageListener); + ws.off("close", closeListener); + this.connectionId.delete(ws); + this.auth.delete(ws); + this.emit("socket:disconnect", ws); + }); + } + + disconnectSocket(ws: WebSocket) { + this.socketCleanup.get(ws)?.(); + } + + handleDisconnect(ws: WebSocket) { + const id = this.connectionId.get(ws); + if (!id) return; + + const openSubscriptions = this.subscriptions.filter((sub) => sub.ws === ws); + + // remove all subscriptions + this.subscriptions = this.subscriptions.filter((sub) => sub.ws !== ws); + + for (const sub of openSubscriptions) { + this.emit("subscription:closed", sub, ws); + } + + this.connectionId.delete(ws); + delete this.connections[id]; + + this.emit("socket:disconnect", ws); + } + + sendEventToSubscriptions(event: NostrEvent) { + for (const sub of this.subscriptions) { + if (sub.type === "REQ" && !sub.filters.some((f) => f.search) && matchFilters(sub.filters, event)) { + sub.ws.send(JSON.stringify(["EVENT", sub.id, event])); + } + } + } + + /** Used to avoid infinite loop */ + private lastInserted: string = ""; + + eventHandlers: EventHandler[] = []; + private async callEventHandler(ctx: HandlerContext, index = 0): Promise { + const handler = this.eventHandlers[index]; + if (!handler) return; + + return await handler(ctx, async () => { + await this.callEventHandler(ctx, index + 1); + }); + } + + registerEventHandler(handler: EventHandler) { + this.eventHandlers.push(handler); + + return () => this.unregisterEventHandler(handler); + } + unregisterEventHandler(handler: EventHandler) { + const idx = this.eventHandlers.indexOf(handler); + if (idx !== -1) this.eventHandlers.splice(idx, 1); + } + + async handleEventMessage(data: IncomingEventMessage, ws: WebSocket) { + // Get the event data + const event = data[1] as NostrEvent; + + try { + let inserted = false; + + // Verify the event's signature + if (!verifyEvent(event)) throw new Error(`invalid: event failed to validate or verify`); + + // NIP-70 protected events + const isProtected = event.tags.some((t) => t[0] === "-"); + if (isProtected && this.auth.get(ws)?.response?.pubkey !== event.pubkey) { + throw new Error("auth-required: this event may only be published by its author"); + } + + const context: HandlerContext = { event, socket: ws, relay: this }; + let persist = (await this.callEventHandler(context)) ?? true; + + if (persist) { + try { + // Persist to database + this.lastInserted = event.id; + inserted = this.eventStore.addEvent(event); + } catch (err) { + console.log(err); + throw new Error(`error: server error`); + } + + this.emit("event:received", event, ws); + if (inserted) { + this.emit("event:inserted", event, ws); + this.sendPublishOkMessage(ws, event, true, typeof persist === "string" ? persist : ""); + + this.sendEventToSubscriptions(event); + } else { + this.sendPublishOkMessage(ws, event, true, typeof persist === "string" ? persist : "Duplicate"); + } + } else { + // reject with generic message + throw new Error("Rejected"); + } + } catch (err) { + if (err instanceof Error) { + // error occurred, send back the OK message with false + this.emit("event:rejected", event, ws); + this.sendPublishOkMessage(ws, event, false, err.message); + } + } + } + + // response helpers + makeAuthRequiredReason(reason: string) { + return "auth-required: " + reason; + } + sendPublishOkMessage(ws: WebSocket, event: NostrEvent, success: boolean, message?: string) { + ws.send(JSON.stringify(message ? ["OK", event.id, success, message] : ["OK", event.id, success])); + } + sendPublishAuthRequired(ws: WebSocket, event: NostrEvent, message: string) { + ws.send(JSON.stringify(["OK", event.id, false, this.makeAuthRequiredReason(message)])); + } + + handleAuthMessage(data: IncomingAuthMessage, ws: WebSocket) { + try { + const event = data[1]; + if (!verifyEvent(event)) { + return this.sendPublishOkMessage(ws, event, false, "Invalid event"); + } + + const relay = event.tags.find((t) => t[0] === "relay")?.[1]; + if (this.requireRelayInAuth) { + if (!relay) { + return this.sendPublishOkMessage(ws, event, false, "Missing relay tag"); + } + if (new URL(relay).toString() !== this.publicURL) { + return this.sendPublishOkMessage(ws, event, false, "Bad relay tag"); + } + } + + // check challenge + const challenge = this.auth.get(ws)?.challenge; + const challengeResponse = event.tags.find((t) => t[0] === "challenge")?.[1]; + + if (!challengeResponse || !challenge) { + return this.sendPublishOkMessage(ws, event, false, "Missing challenge tag"); + } + if (challengeResponse !== challenge) { + return this.sendPublishOkMessage(ws, event, false, "Bad challenge"); + } + + if (this.checkAuth) { + const message = this.checkAuth(ws, event); + if (typeof message === "string") return this.sendPublishOkMessage(ws, event, false, message); + else if (message === false) return this.sendPublishOkMessage(ws, event, false, "Rejected auth"); + } + + this.auth.set(ws, { challenge, response: event }); + this.emit("socket:auth", ws, event); + this.log("Authenticated", event.pubkey); + this.sendPublishOkMessage(ws, event, true, "Authenticated"); + } catch (e) {} + } + + protected runSubscription(sub: Subscription) { + const auth = this.getSocketAuth(sub.ws); + + switch (sub.type) { + case "REQ": + const events = this.eventStore.getEventsForFilters(sub.filters); + for (let event of events) { + if (!this.checkReadEvent || this.checkReadEvent(sub.ws, event, auth)) { + sub.ws.send(JSON.stringify(["EVENT", sub.id, event])); + } + } + sub.ws.send(JSON.stringify(["EOSE", sub.id])); + break; + case "COUNT": + const count = this.eventStore.countEventsForFilters(sub.filters); + sub.ws.send(JSON.stringify(["COUNT", sub.id, { count }])); + break; + } + } + + subscriptionFilters: SubscriptionFilter[] = []; + private async checkSubscriptionFilters( + ctx: SubscriptionFilterContext, + index = 0, + ): Promise { + const handler = this.subscriptionFilters[index]; + if (!handler) return; + + return await handler(ctx, async () => { + await this.checkSubscriptionFilters(ctx, index + 1); + }); + } + registerSubscriptionFilter(filter: SubscriptionFilter) { + this.subscriptionFilters.push(filter); + + return () => this.unregisterSubscriptionFilter(filter); + } + unregisterSubscriptionFilter(filter: SubscriptionFilter) { + const idx = this.subscriptionFilters.indexOf(filter); + if (idx !== -1) this.subscriptionFilters.splice(idx, 1); + } + + async handleSubscriptionMessage(data: IncomingReqMessage | IncomingCountMessage, ws: WebSocket) { + const [type, id, ...filters] = data; + if (typeof id !== "string" || filters.length === 0) return; + + try { + const allow = (await this.checkSubscriptionFilters({ socket: ws, filters, id, relay: this })) ?? true; + + if (allow === false) { + return this.closeSubscription(id, ws, "Rejected"); + } + + let subscription = this.subscriptions.find((s) => s.id === id) || { type, id: id, ws, filters: [] }; + + // override or set the filters + subscription.filters = filters; + + // only save the subscription if its not a count + if (type !== "COUNT") { + if (!this.subscriptions.includes(subscription)) { + this.subscriptions.push(subscription); + this.emit("subscription:created", subscription, ws); + } else { + this.emit("subscription:updated", subscription, ws); + } + } + + // Run the subscription + await this.runSubscription(subscription); + } catch (error) { + if (typeof error === "string") { + this.closeSubscription(id, ws, error); + } else if (error instanceof Error) { + this.closeSubscription(id, ws, error.message); + } + } + } + + closeSubscription(id: string, ws?: WebSocket, reason?: string) { + const subscription = this.subscriptions.find((s) => s.id === id && (ws ? s.ws === ws : true)); + if (subscription) { + this.subscriptions.splice(this.subscriptions.indexOf(subscription), 1); + this.emit("subscription:closed", subscription, subscription.ws); + } + + if (reason) (subscription?.ws || ws)?.send(JSON.stringify(["CLOSED", id, reason])); + } + handleCloseMessage(data: IncomingCloseMessage, ws: WebSocket) { + if (typeof data[1] !== "string") return; + const id = data[1]; + + this.closeSubscription(id, ws); + } + + getSocketAuth(ws: WebSocket) { + return this.auth.get(ws)?.response; + } + + stop() { + for (const ws of Object.values(this.connections)) { + ws.close(); + } + this.removeAllListeners(); + } +} diff --git a/src/services/event-cache.ts b/src/services/event-cache.ts index 458222b..b2c7ea4 100644 --- a/src/services/event-cache.ts +++ b/src/services/event-cache.ts @@ -1,7 +1,7 @@ -import { SQLiteEventStore } from "@satellite-earth/core"; +import { SQLiteEventStore } from "../sqlite/event-store.js"; import database from "./database.js"; -const eventCache = new SQLiteEventStore(database.db); -await eventCache.setup(); +const sqliteEventStore = new SQLiteEventStore(database.db); +await sqliteEventStore.setup(); -export default eventCache; +export default sqliteEventStore; diff --git a/src/services/loaders.ts b/src/services/loaders.ts index 6148d57..8385c49 100644 --- a/src/services/loaders.ts +++ b/src/services/loaders.ts @@ -5,11 +5,11 @@ import { ReplaceableLoader, RequestLoader } from "applesauce-loaders/loaders"; import { COMMON_CONTACT_RELAYS } from "../env.js"; import { rxNostr } from "./rx-nostr.js"; -import eventCache from "./event-cache.js"; +import sqliteEventStore from "./event-cache.js"; import { eventStore, queryStore } from "./stores.js"; function cacheRequest(filters: Filter[]) { - const events = eventCache.getEventsForFilters(filters); + const events = sqliteEventStore.getEventsForFilters(filters); return from(events).pipe(tap(markFromCache)); } @@ -20,7 +20,7 @@ replaceableLoader.subscribe((packet) => { const event = eventStore.add(packet.event, packet.from); // save it to the cache if its new - if (!isFromCache(event)) eventCache.addEvent(event); + if (!isFromCache(event)) sqliteEventStore.addEvent(event); }); export const requestLoader = new RequestLoader(queryStore); diff --git a/src/sqlite/event-store.ts b/src/sqlite/event-store.ts new file mode 100644 index 0000000..43a133b --- /dev/null +++ b/src/sqlite/event-store.ts @@ -0,0 +1,517 @@ +import { Database } from "better-sqlite3"; +import { Filter, NostrEvent, kinds } from "nostr-tools"; +import EventEmitter from "events"; + +import { mapParams } from "../helpers/sql.js"; +import { logger } from "../logger.js"; +import { MigrationSet } from "../sqlite/migrations.js"; + +const isFilterKeyIndexableTag = (key: string) => { + return key[0] === "#" && key.length === 2; +}; +const isFilterKeyIndexableAndTag = (key: string) => { + return key[0] === "&" && key.length === 2; +}; + +export type EventRow = { + id: string; + kind: number; + pubkey: string; + content: string; + tags: string; + created_at: number; + sig: string; + d?: string; +}; + +export function parseEventRow(row: EventRow): NostrEvent { + return { ...row, tags: JSON.parse(row.tags) }; +} + +// search behavior +const SEARCHABLE_TAGS = ["title", "description", "about", "summary", "alt"]; +const SEARCHABLE_KIND_BLACKLIST = [kinds.EncryptedDirectMessage]; +const SEARCHABLE_CONTENT_FORMATTERS: Record string> = { + [kinds.Metadata]: (content) => { + const SEARCHABLE_PROFILE_FIELDS = [ + "name", + "display_name", + "about", + "nip05", + "lud16", + "website", + // Deprecated fields + "displayName", + "username", + ]; + try { + const lines: string[] = []; + const json = JSON.parse(content); + + for (const field of SEARCHABLE_PROFILE_FIELDS) { + if (json[field]) lines.push(json[field]); + } + + return lines.join("\n"); + } catch (error) { + return content; + } + }, +}; + +function convertEventToSearchRow(event: NostrEvent) { + const tags = event.tags + .filter((t) => SEARCHABLE_TAGS.includes(t[0])) + .map((t) => t[1]) + .join(" "); + + const content = SEARCHABLE_CONTENT_FORMATTERS[event.kind] + ? SEARCHABLE_CONTENT_FORMATTERS[event.kind](event.content) + : event.content; + + return { id: event.id, content, tags }; +} + +const migrations = new MigrationSet("event-store"); + +// Version 1 +migrations.addScript(1, async (db, log) => { + // Create events table + db.prepare( + ` + CREATE TABLE IF NOT EXISTS events ( + id TEXT(64) PRIMARY KEY, + created_at INTEGER, + pubkey TEXT(64), + sig TEXT(128), + kind INTEGER, + content TEXT, + tags TEXT + ) + `, + ).run(); + + log("Setup events"); + + // Create tags table + db.prepare( + ` + CREATE TABLE IF NOT EXISTS tags ( + i INTEGER PRIMARY KEY AUTOINCREMENT, + e TEXT(64) REFERENCES events(id), + t TEXT(1), + v TEXT + ) + `, + ).run(); + + log("Setup tags table"); + + // Create indices + const indices = [ + db.prepare("CREATE INDEX IF NOT EXISTS events_created_at ON events(created_at)"), + db.prepare("CREATE INDEX IF NOT EXISTS events_pubkey ON events(pubkey)"), + db.prepare("CREATE INDEX IF NOT EXISTS events_kind ON events(kind)"), + db.prepare("CREATE INDEX IF NOT EXISTS tags_e ON tags(e)"), + db.prepare("CREATE INDEX IF NOT EXISTS tags_t ON tags(t)"), + db.prepare("CREATE INDEX IF NOT EXISTS tags_v ON tags(v)"), + ]; + + indices.forEach((statement) => statement.run()); + + log(`Setup ${indices.length} indices`); +}); + +// Version 2, search table +migrations.addScript(2, async (db, log) => { + db.prepare( + `CREATE VIRTUAL TABLE IF NOT EXISTS events_fts USING fts5(id UNINDEXED, content, tags, tokenize='trigram')`, + ).run(); + log("Created event search table"); + + const rows = db + .prepare(`SELECT * FROM events WHERE kind NOT IN ${mapParams(SEARCHABLE_KIND_BLACKLIST)}`) + .all(...SEARCHABLE_KIND_BLACKLIST); + + // insert search content into table + let changes = 0; + for (const row of rows) { + const search = convertEventToSearchRow(parseEventRow(row)); + + const result = db + .prepare<[string, string, string]>(`INSERT OR REPLACE INTO events_fts (id, content, tags) VALUES (?, ?, ?)`) + .run(search.id, search.content, search.tags); + + changes += result.changes; + } + log(`Inserted ${changes} events into search table`); +}); + +// Version 3, indexed d tags +migrations.addScript(3, async (db, log) => { + db.prepare(`ALTER TABLE events ADD COLUMN d TEXT`).run(); + log("Created d column"); + + db.prepare("CREATE INDEX IF NOT EXISTS events_d ON events(d)").run(); + log(`Created d index`); + + log(`Adding d tags to events table`); + let updated = 0; + db.transaction(() => { + const events = db + .prepare<[], { id: string; d: string }>( + ` + SELECT events.id as id, tags.v as d + FROM events + INNER JOIN tags ON tags.e = events.id AND tags.t = 'd' + WHERE events.kind >= 30000 AND events.kind < 40000 + `, + ) + .all(); + const update = db.prepare<[string, string]>("UPDATE events SET d = ? WHERE id = ?"); + + for (const row of events) { + const { changes } = update.run(row.d, row.id); + if (changes > 0) updated++; + } + })(); + + log(`Updated ${updated} events`); +}); + +type EventMap = { + "event:inserted": [NostrEvent]; + "event:removed": [string]; +}; + +export class SQLiteEventStore extends EventEmitter { + db: Database; + log = logger.extend("sqlite-event-store"); + + preserveEphemeral = false; + preserveReplaceable = false; + + constructor(db: Database) { + super(); + this.db = db; + } + + setup() { + return migrations.run(this.db); + } + + addEvent(event: NostrEvent) { + // Don't store ephemeral events in db, + // just return the event directly + if (!this.preserveEphemeral && kinds.isEphemeralKind(event.kind)) return false; + + const inserted = this.db.transaction(() => { + // TODO: Check if event is replaceable and if its newer + // before inserting it into the database + + // get event d value so it can be indexed + const d = kinds.isParameterizedReplaceableKind(event.kind) + ? event.tags.find((t) => t[0] === "d" && t[1])?.[1] + : undefined; + + const insert = this.db + .prepare( + ` + INSERT OR IGNORE INTO events (id, created_at, pubkey, sig, kind, content, tags, d) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) + `, + ) + .run( + event.id, + event.created_at, + event.pubkey, + event.sig, + event.kind, + event.content, + JSON.stringify(event.tags), + d, + ); + + // If event inserted, index tags, insert search + if (insert.changes) { + this.insertEventTags(event); + + // Remove older replaceable events and all their associated tags + if (this.preserveReplaceable === false) { + let older: { id: string; created_at: number }[] = []; + + if (kinds.isReplaceableKind(event.kind)) { + // Normal replaceable event + older = this.db + .prepare<[number, string], { id: string; created_at: number }>( + ` + SELECT id, created_at FROM events WHERE kind = ? AND pubkey = ? + `, + ) + .all(event.kind, event.pubkey); + } else if (kinds.isParameterizedReplaceableKind(event.kind)) { + // Parameterized Replaceable + const d = event.tags.find((t) => t[0] === "d")?.[1]; + + if (d) { + older = this.db + .prepare<[number, string, "d", string], { id: string; created_at: number }>( + ` + SELECT events.id, events.created_at FROM events + INNER JOIN tags ON events.id = tags.e + WHERE kind = ? AND pubkey = ? AND tags.t = ? AND tags.v = ? + `, + ) + .all(event.kind, event.pubkey, "d", d); + } + } + + // If found other events that may need to be replaced, + // sort the events according to timestamp descending, + // falling back to id lexical order ascending as per + // NIP-01. Remove all non-most-recent events and tags. + if (older.length > 1) { + const removeIds = older + .sort((a, b) => { + return a.created_at === b.created_at ? a.id.localeCompare(b.id) : b.created_at - a.created_at; + }) + .slice(1) + .map((item) => item.id); + + if (!removeIds.includes(event.id)) this.log("Removed", removeIds.length, "old replaceable events"); + + this.removeEvents(removeIds); + + // If the event that was just inserted was one of + // the events that was removed, return null so to + // indicate that the event was in effect *not* + // upserted and thus, if using the DB for a nostr + // relay, does not need to be pushed to clients + if (removeIds.indexOf(event.id) !== -1) return false; + } + } + } + + return insert.changes > 0; + })(); + + if (inserted) { + this.insertEventIntoSearch(event); + this.emit("event:inserted", event); + } + + return inserted; + } + + private insertEventTags(event: NostrEvent) { + for (let tag of event.tags) { + if (tag[0].length === 1) { + this.db.prepare(`INSERT INTO tags (e, t, v) VALUES (?, ?, ?)`).run(event.id, tag[0], tag[1]); + } + } + } + + private insertEventIntoSearch(event: NostrEvent) { + const search = convertEventToSearchRow(event); + + return this.db + .prepare<[string, string, string]>(`INSERT OR REPLACE INTO events_fts (id, content, tags) VALUES (?, ?, ?)`) + .run(search.id, search.content, search.tags); + } + + removeEvents(ids: string[]) { + const results = this.db.transaction(() => { + this.db.prepare(`DELETE FROM tags WHERE e IN ${mapParams(ids)}`).run(...ids); + this.db.prepare(`DELETE FROM events_fts WHERE id IN ${mapParams(ids)}`).run(...ids); + + return this.db.prepare(`DELETE FROM events WHERE events.id IN ${mapParams(ids)}`).run(...ids); + })(); + + if (results.changes > 0) { + for (const id of ids) { + this.emit("event:removed", id); + } + } + } + + removeEvent(id: string) { + const results = this.db.transaction(() => { + this.db.prepare(`DELETE FROM tags WHERE e = ?`).run(id); + this.db.prepare(`DELETE FROM events_fts WHERE id = ?`).run(id); + + return this.db.prepare(`DELETE FROM events WHERE events.id = ?`).run(id); + })(); + + if (results.changes > 0) this.emit("event:removed", id); + + return results.changes > 0; + } + + buildConditionsForFilters(filter: Filter) { + const joins: string[] = []; + const conditions: string[] = []; + const parameters: (string | number)[] = []; + const groupBy: string[] = []; + const having: string[] = []; + + // get AND tag filters + const andTagQueries = Object.keys(filter).filter(isFilterKeyIndexableAndTag); + // get OR tag filters and remove any ones that appear in the AND + const orTagQueries = Object.keys(filter) + .filter(isFilterKeyIndexableTag) + .filter((t) => !andTagQueries.includes(t)); + + if (orTagQueries.length > 0) { + joins.push("INNER JOIN tags as or_tags ON events.id = or_tags.e"); + } + if (andTagQueries.length > 0) { + joins.push("INNER JOIN tags as and_tags ON events.id = and_tags.e"); + } + if (filter.search) { + joins.push("INNER JOIN events_fts ON events_fts.id = events.id"); + + conditions.push(`events_fts MATCH ?`); + parameters.push('"' + filter.search.replace(/"/g, '""') + '"'); + } + + if (typeof filter.since === "number") { + conditions.push(`events.created_at >= ?`); + parameters.push(filter.since); + } + + if (typeof filter.until === "number") { + conditions.push(`events.created_at < ?`); + parameters.push(filter.until); + } + + if (filter.ids) { + conditions.push(`events.id IN ${mapParams(filter.ids)}`); + parameters.push(...filter.ids); + } + + if (filter.kinds) { + conditions.push(`events.kind IN ${mapParams(filter.kinds)}`); + parameters.push(...filter.kinds); + } + + if (filter.authors) { + conditions.push(`events.pubkey IN ${mapParams(filter.authors)}`); + parameters.push(...filter.authors); + } + + // add AND tag filters + for (const t of andTagQueries) { + conditions.push(`and_tags.t = ?`); + parameters.push(t.slice(1)); + + // @ts-expect-error + const v = filter[t] as string[]; + conditions.push(`and_tags.v IN ${mapParams(v)}`); + parameters.push(...v); + } + + // add OR tag filters + for (let t of orTagQueries) { + conditions.push(`or_tags.t = ?`); + parameters.push(t.slice(1)); + + // @ts-expect-error + const v = filter[t] as string[]; + conditions.push(`or_tags.v IN ${mapParams(v)}`); + parameters.push(...v); + } + + // if there is an AND tag filter set GROUP BY so that HAVING can be used + if (andTagQueries.length > 0) { + groupBy.push("events.id"); + having.push("COUNT(and_tags.i) = ?"); + + // @ts-expect-error + parameters.push(andTagQueries.reduce((t, k) => t + (filter[k] as string[]).length, 0)); + } + + return { conditions, parameters, joins, groupBy, having }; + } + + protected buildSQLQueryForFilters(filters: Filter[], select = "events.*") { + let sql = `SELECT ${select} FROM events `; + + const orConditions: string[] = []; + const parameters: any[] = []; + const groupBy = new Set(); + const having = new Set(); + + let joins = new Set(); + for (const filter of filters) { + const parts = this.buildConditionsForFilters(filter); + + if (parts.conditions.length > 0) { + orConditions.push(`(${parts.conditions.join(" AND ")})`); + parameters.push(...parts.parameters); + + for (const join of parts.joins) joins.add(join); + for (const group of parts.groupBy) groupBy.add(group); + for (const have of parts.having) having.add(have); + } + } + + sql += Array.from(joins).join(" "); + + if (orConditions.length > 0) { + sql += ` WHERE ${orConditions.join(" OR ")}`; + } + + if (groupBy.size > 0) { + sql += " GROUP BY " + Array.from(groupBy).join(","); + } + if (having.size > 0) { + sql += " HAVING " + Array.from(having).join(" AND "); + } + + // @ts-expect-error + const order = filters.find((f) => f.order)?.order; + if (filters.some((f) => f.search) && (order === "rank" || order === undefined)) { + sql = sql + " ORDER BY rank"; + } else { + sql = sql + " ORDER BY created_at DESC"; + } + + let minLimit = Infinity; + for (const filter of filters) { + if (filter.limit) minLimit = Math.min(minLimit, filter.limit); + } + if (minLimit !== Infinity) { + sql += " LIMIT ?"; + parameters.push(minLimit); + } + + return { sql, parameters }; + } + + getEventsForFilters(filters: Filter[]) { + const { sql, parameters } = this.buildSQLQueryForFilters(filters); + + return this.db.prepare(sql).all(parameters).map(parseEventRow); + } + + *iterateEventsForFilters(filters: Filter[]): IterableIterator { + const { sql, parameters } = this.buildSQLQueryForFilters(filters); + const iterator = this.db.prepare(sql).iterate(parameters); + + while (true) { + const { value: row, done } = iterator.next(); + if (done) break; + + yield parseEventRow(row); + } + } + + countEventsForFilters(filters: Filter[]) { + const { sql, parameters } = this.buildSQLQueryForFilters(filters); + + const results = this.db + .prepare(`SELECT COUNT(*) as count FROM ( ${sql} )`) + .get(parameters) as { count: number } | undefined; + return results?.count ?? 0; + } +} diff --git a/src/sqlite/migrations.ts b/src/sqlite/migrations.ts new file mode 100644 index 0000000..3b2dcd3 --- /dev/null +++ b/src/sqlite/migrations.ts @@ -0,0 +1,94 @@ +import { unixNow } from "applesauce-core/helpers"; +import { Database } from "better-sqlite3"; + +type ScriptFunction = (database: Database, log: (message: string) => void) => Promise; +type MigrationScript = { version: number; migrate: ScriptFunction }; + +export class MigrationSet { + scripts: MigrationScript[] = []; + + name: string; + database?: Database; + setupMigrationTables = true; + + constructor(name: string, database?: Database) { + this.database = database; + this.name = name; + } + + private ensureMigrations(database: Database | undefined = this.database) { + if (!database) throw new Error("database required"); + + database + .prepare( + ` + CREATE TABLE IF NOT EXISTS "migrations" ( + "id" INTEGER NOT NULL, + "name" TEXT NOT NULL, + "version" INTEGER NOT NULL, + "date" INTEGER NOT NULL, + PRIMARY KEY("id" AUTOINCREMENT) + ); + `, + ) + .run(); + database + .prepare( + ` + CREATE TABLE IF NOT EXISTS "migration_logs" ( + "id" INTEGER NOT NULL, + "migration" INTEGER NOT NULL, + "message" TEXT NOT NULL, + FOREIGN KEY("migration") REFERENCES "migrations", + PRIMARY KEY("id" AUTOINCREMENT) + ); + `, + ) + .run(); + } + + addScript(version: number, migrate: ScriptFunction) { + this.scripts.push({ version, migrate }); + } + + async run(database: Database | undefined = this.database) { + if (!database) throw new Error("database required"); + + // ensure migration tables are setup + await this.ensureMigrations(database); + + const prev = database + .prepare<[string], { name: string; version: number }>(`SELECT * FROM migrations WHERE name=?`) + .all(this.name); + const lastVersion = prev.reduce((v, m) => Math.max(m.version, v), 0); + + const sorted = Array.from(this.scripts).sort((a, b) => a.version - b.version); + + let version = lastVersion; + for (const script of sorted) { + if (version < script.version) { + let logs: string[] = []; + await database.transaction(() => { + return script.migrate(database, (message) => logs.push(message)); + })(); + + version = script.version; + + // save the migration + database.transaction(() => { + const result = database + .prepare<[string, number, number]>(`INSERT INTO migrations (name, version, date) VALUES (?1, ?2, ?3)`) + .run(this.name, script.version, unixNow()); + + const insertLog = database.prepare<[number | bigint, string]>( + `INSERT INTO migration_logs (migration, message) VALUES (?, ?)`, + ); + + for (const message of logs) { + insertLog.run(result.lastInsertRowid, message); + } + })(); + } + } + } +}