From 58f5a0955d59ef1d15ccb681a49e5f2c1251b1bc Mon Sep 17 00:00:00 2001 From: Ty J Everett Date: Fri, 31 Jul 2026 17:16:54 -0700 Subject: [PATCH] chore: adopt hardened TS Stack releases --- .github/workflows/ci.yml | 2 +- package-lock.json | 1342 +++++------------ package.json | 10 +- .../@bsv+auth-express-middleware+2.0.6.patch | 94 -- patches/@bsv+sdk+2.1.4.patch | 609 -------- 5 files changed, 348 insertions(+), 1709 deletions(-) delete mode 100644 patches/@bsv+auth-express-middleware+2.0.6.patch delete mode 100644 patches/@bsv+sdk+2.1.4.patch diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a248692..71b437c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: - run: npm ci env: CWI_NPM_TOKEN: ${{ secrets.CWI_NPM_TOKEN }} - - run: npm audit --omit=dev + - run: npm audit --omit=dev --audit-level=high - run: npm run lint - run: npm run typecheck - run: npm test diff --git a/package-lock.json b/package-lock.json index cef190b..558f4a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,14 +7,13 @@ "": { "name": "papertrade", "version": "0.1.0", - "hasInstallScript": true, "license": "Open BSV License", "dependencies": { - "@bsv/auth-express-middleware": "^2.0.6", + "@bsv/auth-express-middleware": "^2.1.7", "@bsv/identity-react": "^1.1.14", - "@bsv/payment-express-middleware": "^2.0.3", - "@bsv/sdk": "^2.1.4", - "@bsv/wallet-toolbox": "^2.1.28", + "@bsv/payment-express-middleware": "^2.1.5", + "@bsv/sdk": "^2.2.17", + "@bsv/wallet-toolbox": "^2.4.20", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", "@mui/icons-material": "^5.18.0", @@ -26,7 +25,6 @@ "lucide-react": "^0.468.0", "multer": "^2.1.1", "mysql2": "^3.11.5", - "patch-package": "^8.0.1", "react": "^18.3.1", "react-dom": "^18.3.1", "react-router-dom": "^6.28.0", @@ -356,215 +354,31 @@ } }, "node_modules/@bsv/auth-express-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@bsv/auth-express-middleware/-/auth-express-middleware-2.0.6.tgz", - "integrity": "sha512-PXtb3hxcyyFG3N44Ab/Ey3yNBlMksLBbfrzLFn7vebwZPC+RhisQi/zL5/33PmUh0EsRkl4cxNAexzACE6DMIQ==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@bsv/auth-express-middleware/-/auth-express-middleware-2.1.7.tgz", + "integrity": "sha512-hO5ZS+tOqacYUBMJlW6l3v37y4u+UF0wf2PJQ9niQT3UzLtuIqlMloDIncNJPyk2pHDyJ19xraFU/1Ed49U0OA==", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { - "@bsv/sdk": "2.1.3", - "express": "^5.1.0" - } - }, - "node_modules/@bsv/auth-express-middleware/node_modules/@bsv/sdk": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@bsv/sdk/-/sdk-2.1.3.tgz", - "integrity": "sha512-nmni2Q762/TeWz6MfbHdWRSTwzPV8o5t34789/u8MA+kPNnoZfs/BQOw4c5FtlXYcu3Soxbhup3+02zdrP+drg==", - "license": "SEE LICENSE IN LICENSE.txt" - }, - "node_modules/@bsv/auth-express-middleware/node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@bsv/auth-express-middleware/node_modules/body-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", - "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^2.0.0", - "debug": "^4.4.3", - "http-errors": "^2.0.1", - "iconv-lite": "^0.7.2", - "on-finished": "^2.4.1", - "qs": "^6.15.2", - "raw-body": "^3.0.2", - "type-is": "^2.1.0" + "mime-types": "^3.0.2" }, "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@bsv/auth-express-middleware/node_modules/body-parser/node_modules/content-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@bsv/auth-express-middleware/node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" + "node": ">=22" }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@bsv/auth-express-middleware/node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/@bsv/auth-express-middleware/node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@bsv/auth-express-middleware/node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@bsv/auth-express-middleware/node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@bsv/auth-express-middleware/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@bsv/auth-express-middleware/node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@bsv/auth-express-middleware/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@bsv/auth-express-middleware/node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" + "peerDependencies": { + "@bsv/sdk": "^2.1.6", + "@types/express": ">=4.17.0 <6", + "express": ">=4.18.0 <6" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "@bsv/sdk": { + "optional": false + }, + "@types/express": { + "optional": false + }, + "express": { + "optional": false + } } }, "node_modules/@bsv/auth-express-middleware/node_modules/mime-db": { @@ -577,164 +391,153 @@ } }, "node_modules/@bsv/auth-express-middleware/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@bsv/auth-express-middleware/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@bsv/auth-express-middleware/node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" + "node": ">=18" }, - "engines": { - "node": ">= 0.10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@bsv/auth-express-middleware/node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "license": "MIT", + "node_modules/@bsv/identity-react": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@bsv/identity-react/-/identity-react-1.1.14.tgz", + "integrity": "sha512-Wt6Z2OHe8ijklcNphz6SXxLOQZ1YiynP3YQLLsPsljnkVBIEtd1ArBQlGhEFgAM0wQ3WehtBVVcXPy15dzrypA==", + "license": "Open BSV License", "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" + "@bsv/sdk": "^2.0.4", + "@bsv/uhrp-react": "^1.0.6", + "@types/jest": "^29.5.11", + "@types/node": "^20.11.0", + "metanet-react-prompt": "^1.0.6", + "react-icons": "^5.1.0", + "use-async-effect": "^2.2.7" }, - "engines": { - "node": ">= 18" + "peerDependencies": { + "@mui/icons-material": ">=5.0.0", + "@mui/material": ">=5.0.0", + "react": ">=18.0.0" } }, - "node_modules/@bsv/auth-express-middleware/node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "node_modules/@bsv/identity-react/node_modules/@types/node": { + "version": "20.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", + "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", "license": "MIT", "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" + "undici-types": "~6.21.0" } }, - "node_modules/@bsv/auth-express-middleware/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", + "node_modules/@bsv/payment-express-middleware": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@bsv/payment-express-middleware/-/payment-express-middleware-2.1.5.tgz", + "integrity": "sha512-z5OVl5Km8HZYkuYvjwOCwj5HAcHeU9qTqB67GAFCJ5QHzDPPQ1oyrm6eMlHRUSZxOZQ7cmy8TxLp8N81UXOZ5Q==", + "license": "SEE LICENSE IN LICENSE.txt", "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@bsv/auth-express-middleware/node_modules/type-is": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", - "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", - "license": "MIT", - "dependencies": { - "content-type": "^2.0.0", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" + "node": ">=22" }, - "engines": { - "node": ">= 18" + "peerDependencies": { + "@bsv/sdk": "^2.1.6", + "@types/express": ">=4.17.0 <6", + "express": ">=4.18.0 <6" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "peerDependenciesMeta": { + "@bsv/sdk": { + "optional": false + }, + "@types/express": { + "optional": false + }, + "express": { + "optional": false + } } }, - "node_modules/@bsv/auth-express-middleware/node_modules/type-is/node_modules/content-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", - "license": "MIT", + "node_modules/@bsv/sdk": { + "version": "2.2.17", + "resolved": "https://registry.npmjs.org/@bsv/sdk/-/sdk-2.2.17.tgz", + "integrity": "sha512-tJa25PyVpBGZ6sUu+y+lYY1aWGbPiudFDi8hIemLeYg1RlheCwjjUufTRGr8GAoD5bLMcCwhgJX0fiAJ1a1OHQ==", + "license": "SEE LICENSE IN LICENSE.txt", "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">=22" } }, - "node_modules/@bsv/identity-react": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@bsv/identity-react/-/identity-react-1.1.14.tgz", - "integrity": "sha512-Wt6Z2OHe8ijklcNphz6SXxLOQZ1YiynP3YQLLsPsljnkVBIEtd1ArBQlGhEFgAM0wQ3WehtBVVcXPy15dzrypA==", + "node_modules/@bsv/uhrp-react": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@bsv/uhrp-react/-/uhrp-react-1.0.6.tgz", + "integrity": "sha512-T8rZAE2pRUTlxqGIS6a1uzl6UB5kLQIJd11/bqJFhVKEbMNZR4NiKFpc9YH2bgbif3ZvIb4/rYoYdi2u2MeXVA==", "license": "Open BSV License", "dependencies": { "@bsv/sdk": "^2.0.4", - "@bsv/uhrp-react": "^1.0.6", - "@types/jest": "^29.5.11", - "@types/node": "^20.11.0", - "metanet-react-prompt": "^1.0.6", - "react-icons": "^5.1.0", - "use-async-effect": "^2.2.7" + "zustand": "^4.5.6" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@bsv/wallet-toolbox": { + "version": "2.4.20", + "resolved": "https://registry.npmjs.org/@bsv/wallet-toolbox/-/wallet-toolbox-2.4.20.tgz", + "integrity": "sha512-MdQFdx69Zs0B9WL7DdgK7rd+hSn9GCDNu6Qf5kGm6rYeddd1J6RnyGgcAL+NRS30I0KjoNIcNbNf6AaP83Sumg==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@bsv/auth-express-middleware": "^2.1.5", + "@bsv/payment-express-middleware": "^2.1.4", + "@types/express": "^5.0.6", + "better-sqlite3": "^13.0.2", + "body-parser": "^2.3.0", + "dotenv": "^17.4.2", + "express": "^5.2.1", + "express-rate-limit": "^8.6.1", + "hash-wasm": "^4.12.0", + "idb": "^8.0.3", + "knex": "^3.3.0", + "mysql2": "^3.23.2", + "ws": "^8.21.1" + }, + "engines": { + "node": ">=22" }, "peerDependencies": { - "@mui/icons-material": ">=5.0.0", - "@mui/material": ">=5.0.0", - "react": ">=18.0.0" + "@bsv/sdk": "^2.1.8" + }, + "peerDependenciesMeta": { + "@bsv/sdk": { + "optional": false + } } }, - "node_modules/@bsv/identity-react/node_modules/@types/node": { - "version": "20.19.43", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", - "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", + "node_modules/@bsv/wallet-toolbox/node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" } }, - "node_modules/@bsv/payment-express-middleware": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@bsv/payment-express-middleware/-/payment-express-middleware-2.0.3.tgz", - "integrity": "sha512-ezhdp9veMg6GSBWMLRonDBTDp2iyguPO9d29LDEqYuPkZznNeTqHvBbTyYmuVwSWkrGNZ9t/tqeiAFb5xXKm4A==", - "license": "SEE LICENSE IN LICENSE.txt", + "node_modules/@bsv/wallet-toolbox/node_modules/@types/express-serve-static-core": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.3.tgz", + "integrity": "sha512-dPfW8NFiOF4wOHc7+N/QSxlY9cfSsenewGbAz8C8U/MULPd/YZ27LvJUIlzaXie7e6Ove9YunJGgC9tbHD2cKw==", + "license": "MIT", "dependencies": { - "@bsv/sdk": "2.1.3", - "express": "^5.1.0" + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/@bsv/sdk": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@bsv/sdk/-/sdk-2.1.3.tgz", - "integrity": "sha512-nmni2Q762/TeWz6MfbHdWRSTwzPV8o5t34789/u8MA+kPNnoZfs/BQOw4c5FtlXYcu3Soxbhup3+02zdrP+drg==", - "license": "SEE LICENSE IN LICENSE.txt" - }, - "node_modules/@bsv/payment-express-middleware/node_modules/accepts": { + "node_modules/@bsv/wallet-toolbox/node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", @@ -747,7 +550,7 @@ "node": ">= 0.6" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/body-parser": { + "node_modules/@bsv/wallet-toolbox/node_modules/body-parser": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", @@ -771,7 +574,7 @@ "url": "https://opencollective.com/express" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/body-parser/node_modules/content-type": { + "node_modules/@bsv/wallet-toolbox/node_modules/body-parser/node_modules/content-type": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", @@ -784,19 +587,20 @@ "url": "https://opencollective.com/express" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "node_modules/@bsv/wallet-toolbox/node_modules/content-disposition": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/cookie-signature": { + "node_modules/@bsv/wallet-toolbox/node_modules/cookie-signature": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", @@ -805,19 +609,32 @@ "node": ">=6.6.0" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "node_modules/@bsv/wallet-toolbox/node_modules/dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@bsv/wallet-toolbox/node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", "dependencies": { "accepts": "^2.0.0", - "body-parser": "^2.2.0", + "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", + "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", @@ -847,10 +664,10 @@ "url": "https://opencollective.com/express" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "node_modules/@bsv/wallet-toolbox/node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -861,10 +678,14 @@ "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/fresh": { + "node_modules/@bsv/wallet-toolbox/node_modules/fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", @@ -873,7 +694,7 @@ "node": ">= 0.8" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/http-errors": { + "node_modules/@bsv/wallet-toolbox/node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", @@ -893,10 +714,10 @@ "url": "https://opencollective.com/express" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "node_modules/@bsv/wallet-toolbox/node_modules/iconv-lite": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -909,16 +730,20 @@ "url": "https://opencollective.com/express" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "node_modules/@bsv/wallet-toolbox/node_modules/media-typer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz", + "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", "license": "MIT", "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/merge-descriptors": { + "node_modules/@bsv/wallet-toolbox/node_modules/merge-descriptors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", @@ -930,7 +755,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/mime-db": { + "node_modules/@bsv/wallet-toolbox/node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", @@ -939,19 +764,23 @@ "node": ">= 0.6" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "node_modules/@bsv/wallet-toolbox/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/negotiator": { + "node_modules/@bsv/wallet-toolbox/node_modules/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", @@ -960,7 +789,7 @@ "node": ">= 0.6" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/raw-body": { + "node_modules/@bsv/wallet-toolbox/node_modules/raw-body": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", @@ -975,32 +804,36 @@ "node": ">= 0.10" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "node_modules/@bsv/wallet-toolbox/node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "license": "MIT", "dependencies": { - "debug": "^4.3.5", + "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", - "statuses": "^2.0.1" + "statuses": "^2.0.2" }, "engines": { "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "node_modules/@bsv/wallet-toolbox/node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", @@ -1010,9 +843,13 @@ }, "engines": { "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/statuses": { + "node_modules/@bsv/wallet-toolbox/node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", @@ -1021,7 +858,7 @@ "node": ">= 0.8" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/type-is": { + "node_modules/@bsv/wallet-toolbox/node_modules/type-is": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", @@ -1039,7 +876,7 @@ "url": "https://opencollective.com/express" } }, - "node_modules/@bsv/payment-express-middleware/node_modules/type-is/node_modules/content-type": { + "node_modules/@bsv/wallet-toolbox/node_modules/type-is/node_modules/content-type": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", @@ -1052,49 +889,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/@bsv/sdk": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@bsv/sdk/-/sdk-2.1.4.tgz", - "integrity": "sha512-FrX5knwUZXPJHVaE9usoevwWqLItiWCFIr2jD20W3Ke6I+IHbDyivMF8MKtrWSeOxeanFx9v8YLeN6/qzAtlzQ==", - "license": "SEE LICENSE IN LICENSE.txt" - }, - "node_modules/@bsv/uhrp-react": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@bsv/uhrp-react/-/uhrp-react-1.0.6.tgz", - "integrity": "sha512-T8rZAE2pRUTlxqGIS6a1uzl6UB5kLQIJd11/bqJFhVKEbMNZR4NiKFpc9YH2bgbif3ZvIb4/rYoYdi2u2MeXVA==", - "license": "Open BSV License", - "dependencies": { - "@bsv/sdk": "^2.0.4", - "zustand": "^4.5.6" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@bsv/wallet-toolbox": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/@bsv/wallet-toolbox/-/wallet-toolbox-2.1.28.tgz", - "integrity": "sha512-9pkuOVJUQYEUTfn916hYFRedMRXYzlkLDiMmovC+FmezrFzWkITnxsTadhrbI3wCbOhd0aOfqxngqdbJ14GbKw==", - "license": "SEE LICENSE IN license.md", - "dependencies": { - "@bsv/auth-express-middleware": "2.0.6", - "@bsv/payment-express-middleware": "2.0.3", - "@bsv/sdk": "2.1.3", - "better-sqlite3": "^12.6.2", - "express": "^4.21.2", - "hash-wasm": "^4.12.0", - "idb": "^8.0.2", - "knex": "^3.1.0", - "mysql2": "^3.12.0", - "ws": "^8.18.3" - } - }, - "node_modules/@bsv/wallet-toolbox/node_modules/@bsv/sdk": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@bsv/sdk/-/sdk-2.1.3.tgz", - "integrity": "sha512-nmni2Q762/TeWz6MfbHdWRSTwzPV8o5t34789/u8MA+kPNnoZfs/BQOw4c5FtlXYcu3Soxbhup3+02zdrP+drg==", - "license": "SEE LICENSE IN LICENSE.txt" - }, "node_modules/@csstools/color-helpers": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", @@ -2812,7 +2606,6 @@ "version": "1.19.6", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "dev": true, "license": "MIT", "dependencies": { "@types/connect": "*", @@ -2834,7 +2627,6 @@ "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -2884,7 +2676,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "dev": true, "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { @@ -2939,7 +2730,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, "license": "MIT" }, "node_modules/@types/multer": { @@ -2977,14 +2767,12 @@ "version": "6.14.0", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "dev": true, "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, "license": "MIT" }, "node_modules/@types/react": { @@ -3028,7 +2816,6 @@ "version": "0.17.5", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", - "dev": true, "license": "MIT", "dependencies": { "@types/mime": "^1", @@ -3036,15 +2823,13 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", - "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", - "dev": true, + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", "license": "MIT", "dependencies": { "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" + "@types/node": "*" } }, "node_modules/@types/stack-utils": { @@ -3465,12 +3250,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "license": "BSD-2-Clause" - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -3859,6 +3638,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, "funding": [ { "type": "github", @@ -3889,37 +3669,15 @@ } }, "node_modules/better-sqlite3": { - "version": "12.10.0", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.10.0.tgz", - "integrity": "sha512-CyzaZRQKyHkB2ZInfTTl2nvT33EbDpjkLEbE8/Zck3Ll6O0qqvuGdrJ45HgtH+HykRg88ITY3AdreBGN70aBSQ==", - "hasInstallScript": true, + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-13.0.2.tgz", + "integrity": "sha512-jW6oufeDhXZaiX9Lw5A+oerVClx4iFrI6uDj1zu7SqUAjak9vbJvA0NEcKLNxHiQHb6kYCoFzzXYV0YOauhV3g==", "license": "MIT", "dependencies": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.1" + "node-addon-api": "^8.0.0" }, "engines": { - "node": "20.x || 22.x || 23.x || 24.x || 25.x || 26.x" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "license": "MIT", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "node": ">=22" } }, "node_modules/bn.js": { @@ -4208,6 +3966,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "funding": [ { "type": "github", @@ -4295,6 +4054,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", @@ -4406,12 +4166,6 @@ "node": ">=8" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -4687,6 +4441,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -4873,30 +4628,6 @@ "dev": true, "license": "MIT" }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -4908,6 +4639,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -4988,15 +4720,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -5152,15 +4875,6 @@ "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -6017,15 +5731,6 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" - } - }, "node_modules/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", @@ -6098,6 +5803,25 @@ "url": "https://opencollective.com/express" } }, + "node_modules/express-rate-limit": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.1.tgz", + "integrity": "sha512-0D493aP61w0TJ2A0wy27riRsO7FMQ7FK+KUHOKCSfPvYo0R55aiC6emCVgFUeShH0fq0ICPVzNcgoS+BsbXQCA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "ip-address": "^10.2.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -6205,12 +5929,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "license": "MIT" - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -6279,15 +5997,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", - "license": "Apache-2.0", - "dependencies": { - "micromatch": "^4.0.2" - } - }, "node_modules/flat-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", @@ -6361,26 +6070,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT" - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -6568,12 +6257,6 @@ "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==", "license": "MIT" }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT" - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -6706,6 +6389,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -6900,6 +6584,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, "funding": [ { "type": "github", @@ -6970,12 +6655,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -7000,6 +6679,15 @@ "node": ">= 0.10" } }, + "node_modules/ip-address": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.4.0.tgz", + "integrity": "sha512-oSK96Grm3aP6OrS263xVxbNDGVL7rzBtYdpGqlDG8iQdoenDoTs/nkki+DflYbAEE8Xl6o5YxhxlrKvI3nqKXQ==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -7153,32 +6841,17 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, "license": "MIT", - "bin": { - "is-docker": "cli.js" + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-extglob": { @@ -7492,28 +7165,18 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, "license": "ISC" }, "node_modules/isomorphic-timers-promises": { @@ -7787,25 +7450,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-stable-stringify": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", - "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "isarray": "^2.0.5", - "jsonify": "^0.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -7826,27 +7470,6 @@ "node": ">=6" } }, - "node_modules/jsonfile": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", - "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", - "license": "Public Domain", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -7873,19 +7496,10 @@ "json-buffer": "3.0.1" } }, - "node_modules/klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.11" - } - }, "node_modules/knex": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/knex/-/knex-3.1.0.tgz", - "integrity": "sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/knex/-/knex-3.3.0.tgz", + "integrity": "sha512-LgWl031hNuLv9Lhxdd9093zULa2aNcoP04Bk29e5NidgRcEr/T0rAr2WYi4BhjTiCDoQiRU56meUE5rppLKZzQ==", "license": "MIT", "dependencies": { "colorette": "2.0.19", @@ -7896,11 +7510,11 @@ "get-package-type": "^0.1.0", "getopts": "2.3.0", "interpret": "^2.2.0", - "lodash": "^4.17.21", + "lodash": "^4.18.1", "pg-connection-string": "2.6.2", "rechoir": "^0.8.0", "resolve-from": "^5.0.0", - "tarn": "^3.0.2", + "tarn": "^3.1.0", "tildify": "2.0.0" }, "bin": { @@ -7909,10 +7523,16 @@ "engines": { "node": ">=16" }, + "peerDependencies": { + "pg-query-stream": "^4.14.0" + }, "peerDependenciesMeta": { "better-sqlite3": { "optional": true }, + "mariadb": { + "optional": true + }, "mysql": { "optional": true }, @@ -7925,6 +7545,9 @@ "pg-native": { "optional": true }, + "pg-query-stream": { + "optional": true + }, "sqlite3": { "optional": true }, @@ -8065,9 +7688,9 @@ } }, "node_modules/lru.min": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz", - "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.4.tgz", + "integrity": "sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==", "license": "MIT", "engines": { "bun": ">=1.0.0", @@ -8240,18 +7863,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -8283,17 +7894,12 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT" - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -8320,56 +7926,53 @@ } }, "node_modules/mysql2": { - "version": "3.14.3", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.3.tgz", - "integrity": "sha512-fD6MLV8XJ1KiNFIF0bS7Msl8eZyhlTDCDl75ajU5SJtpdx9ZPEACulJcqJWr1Y8OYyxsFc4j3+nflpmhxCU5aQ==", + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.23.2.tgz", + "integrity": "sha512-fxh3HpQ8vJtu/Mmnd4Xsur19jGjHGzRLMxptiDtOkbX7EVBgnafGSGDx1WGGVmJLClVh2LeeBMMo24IFv8wCyQ==", "license": "MIT", "dependencies": { - "aws-ssl-profiles": "^1.1.1", + "aws-ssl-profiles": "^1.1.2", "denque": "^2.1.0", "generate-function": "^2.3.1", - "iconv-lite": "^0.6.3", - "long": "^5.2.1", - "lru.min": "^1.0.0", - "named-placeholders": "^1.1.3", - "seq-queue": "^0.0.5", - "sqlstring": "^2.3.2" + "iconv-lite": "^0.7.2", + "long": "^5.3.2", + "lru.min": "^1.1.4", + "named-placeholders": "^1.1.6", + "sql-escaper": "^1.5.1" }, "engines": { "node": ">= 8.0" + }, + "peerDependencies": { + "@types/node": ">= 8" } }, "node_modules/mysql2/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/named-placeholders": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", - "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz", + "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==", "license": "MIT", "dependencies": { - "lru-cache": "^7.14.1" + "lru.min": "^1.1.0" }, "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/named-placeholders/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" + "node": ">=8.0.0" } }, "node_modules/nanoid": { @@ -8391,12 +7994,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "license": "MIT" - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -8420,28 +8017,13 @@ "node": ">= 0.6" } }, - "node_modules/node-abi": { - "version": "3.92.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz", - "integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==", + "node_modules/node-addon-api": { + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.1.tgz", + "integrity": "sha512-4eUQWVPCUUUiBjLnHS3cXWeC6ryoPUc0U3rP7IuzapoGbzMqd/r6KKO0clr0b+snQhsrueFEhCZDdK+LK7hxKg==", "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", - "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "node": "^18 || ^20 || >= 21" } }, "node_modules/node-releases": { @@ -8549,6 +8131,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8679,22 +8262,6 @@ "wrappy": "1" } }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -8869,71 +8436,6 @@ "node": ">= 0.8" } }, - "node_modules/patch-package": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.1.tgz", - "integrity": "sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw==", - "license": "MIT", - "dependencies": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^4.1.2", - "ci-info": "^3.7.0", - "cross-spawn": "^7.0.3", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^10.0.0", - "json-stable-stringify": "^1.0.2", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.6", - "open": "^7.4.2", - "semver": "^7.5.3", - "slash": "^2.0.0", - "tmp": "^0.2.4", - "yaml": "^2.2.2" - }, - "bin": { - "patch-package": "index.js" - }, - "engines": { - "node": ">=14", - "npm": ">5" - } - }, - "node_modules/patch-package/node_modules/semver": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", - "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/patch-package/node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/patch-package/node_modules/yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -8965,6 +8467,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -9207,33 +8710,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", - "license": "MIT", - "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" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -9345,16 +8821,6 @@ "dev": true, "license": "MIT" }, - "node_modules/pump": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -9484,30 +8950,6 @@ "node": ">= 0.8" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -10138,11 +9580,6 @@ "node": ">= 0.8" } }, - "node_modules/seq-queue": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" - }, "node_modules/serve-static": { "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", @@ -10162,6 +9599,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -10244,6 +9682,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -10256,6 +9695,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -10353,51 +9793,6 @@ "dev": true, "license": "ISC" }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -10426,13 +9821,19 @@ "node": ">=0.10.0" } }, - "node_modules/sqlstring": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", - "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "node_modules/sql-escaper": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sql-escaper/-/sql-escaper-1.5.1.tgz", + "integrity": "sha512-4toX5E1fQbBrpfXidaHnF0669nkAdETeIPTs2SUjxxD7RRIs9ICG4gtpmfc68JCEKehsdwLFqBu9VlQqZ1P1gg==", "license": "MIT", "engines": { - "node": ">= 0.6" + "bun": ">=1.0.0", + "deno": ">=2.0.0", + "node": ">=12.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/mysqljs/sql-escaper?sponsor=1" } }, "node_modules/stack-utils": { @@ -10875,38 +10276,10 @@ "dev": true, "license": "MIT" }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/tarn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", - "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.1.2.tgz", + "integrity": "sha512-3RTvqKZcK/17jnJ8rMKFXbyNogywTs1z0gVPPwFsJGX46rkmUHOdIaSQ/aVO1rS7nH+soiXiWk7rvUXxndm8Dg==", "license": "MIT", "engines": { "node": ">=8.0.0" @@ -11018,15 +10391,6 @@ "dev": true, "license": "MIT" }, - "node_modules/tmp": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", - "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, "node_modules/to-buffer": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", @@ -11209,18 +10573,6 @@ "dev": true, "license": "MIT" }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -11370,15 +10722,6 @@ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -12271,6 +11614,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -12423,9 +11767,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", + "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", "license": "MIT", "engines": { "node": ">=10.0.0" diff --git a/package.json b/package.json index 389ea8a..48bf977 100644 --- a/package.json +++ b/package.json @@ -31,17 +31,16 @@ "build": "npm run build:client && npm run build:server", "start": "node dist/server/server.js", "migrate": "knex migrate:latest --knexfile knexfile.cjs", - "postinstall": "patch-package", "test": "vitest run", "typecheck": "tsc --noEmit && tsc -p tsconfig.server.json --noEmit", "lint": "ts-standard --project tsconfig.json \"src/client/**/*.tsx\" && ts-standard --project tsconfig.server.json \"src/server/**/*.ts\"" }, "dependencies": { - "@bsv/auth-express-middleware": "^2.0.6", + "@bsv/auth-express-middleware": "^2.1.7", "@bsv/identity-react": "^1.1.14", - "@bsv/payment-express-middleware": "^2.0.3", - "@bsv/sdk": "^2.1.4", - "@bsv/wallet-toolbox": "^2.1.28", + "@bsv/payment-express-middleware": "^2.1.5", + "@bsv/sdk": "^2.2.17", + "@bsv/wallet-toolbox": "^2.4.20", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", "@mui/icons-material": "^5.18.0", @@ -53,7 +52,6 @@ "lucide-react": "^0.468.0", "multer": "^2.1.1", "mysql2": "^3.11.5", - "patch-package": "^8.0.1", "react": "^18.3.1", "react-dom": "^18.3.1", "react-router-dom": "^6.28.0", diff --git a/patches/@bsv+auth-express-middleware+2.0.6.patch b/patches/@bsv+auth-express-middleware+2.0.6.patch deleted file mode 100644 index 50c6798..0000000 --- a/patches/@bsv+auth-express-middleware+2.0.6.patch +++ /dev/null @@ -1,94 +0,0 @@ -diff --git a/node_modules/@bsv/auth-express-middleware/dist/cjs/src/index.js b/node_modules/@bsv/auth-express-middleware/dist/cjs/src/index.js -index 0a3dd3b..a41608d 100644 ---- a/node_modules/@bsv/auth-express-middleware/dist/cjs/src/index.js -+++ b/node_modules/@bsv/auth-express-middleware/dist/cjs/src/index.js -@@ -424,7 +424,7 @@ class ExpressTransport { - const requestId = sdk_1.Utils.toBase64(new sdk_1.Utils.Reader(payload).read(32)); - if (requestId === req.headers['x-bsv-auth-request-id']) { - (_a = this.peer) === null || _a === void 0 ? void 0 : _a.stopListeningForGeneralMessages(listenerId); -- this.setupAuthenticatedResponse(req, res, next, senderPublicKey, requestId); -+ this.setupAuthenticatedResponse(req, res, next, senderPublicKey, requestId, message.yourNonce); - } - } - catch (error) { -@@ -451,7 +451,7 @@ class ExpressTransport { - /** - * Sets up the intercepted response for an authenticated general message. - */ -- setupAuthenticatedResponse(req, res, next, senderPublicKey, requestId) { -+ setupAuthenticatedResponse(req, res, next, senderPublicKey, requestId, requestSessionNonce) { - this.log('debug', 'General message from the correct identity key', { requestId, senderPublicKey }); - req.auth = { identityKey: senderPublicKey }; - const wrapper = new ResponseWriterWrapper(res); -@@ -470,7 +470,7 @@ class ExpressTransport { - responseHeaders: wrapper.getHeaders(), - responseBodyLength: wrapper.getBody().length - }); -- await ((_a = this.peer) === null || _a === void 0 ? void 0 : _a.toPeer(responsePayload, req.headers['x-bsv-auth-identity-key'])); -+ await ((_a = this.peer) === null || _a === void 0 ? void 0 : _a.toPeer(responsePayload, requestSessionNonce ?? req.headers['x-bsv-auth-identity-key'])); - } - catch (err) { - delete this.openGeneralHandles[requestId]; -diff --git a/node_modules/@bsv/auth-express-middleware/dist/esm/src/index.js b/node_modules/@bsv/auth-express-middleware/dist/esm/src/index.js -index 9d9afcd..3f8af7a 100644 ---- a/node_modules/@bsv/auth-express-middleware/dist/esm/src/index.js -+++ b/node_modules/@bsv/auth-express-middleware/dist/esm/src/index.js -@@ -417,7 +417,7 @@ export class ExpressTransport { - const requestId = Utils.toBase64(new Utils.Reader(payload).read(32)); - if (requestId === req.headers['x-bsv-auth-request-id']) { - this.peer?.stopListeningForGeneralMessages(listenerId); -- this.setupAuthenticatedResponse(req, res, next, senderPublicKey, requestId); -+ this.setupAuthenticatedResponse(req, res, next, senderPublicKey, requestId, message.yourNonce); - } - } - catch (error) { -@@ -444,7 +444,7 @@ export class ExpressTransport { - /** - * Sets up the intercepted response for an authenticated general message. - */ -- setupAuthenticatedResponse(req, res, next, senderPublicKey, requestId) { -+ setupAuthenticatedResponse(req, res, next, senderPublicKey, requestId, requestSessionNonce) { - this.log('debug', 'General message from the correct identity key', { requestId, senderPublicKey }); - req.auth = { identityKey: senderPublicKey }; - const wrapper = new ResponseWriterWrapper(res); -@@ -462,7 +462,7 @@ export class ExpressTransport { - responseHeaders: wrapper.getHeaders(), - responseBodyLength: wrapper.getBody().length - }); -- await this.peer?.toPeer(responsePayload, req.headers['x-bsv-auth-identity-key']); -+ await this.peer?.toPeer(responsePayload, requestSessionNonce ?? req.headers['x-bsv-auth-identity-key']); - } - catch (err) { - delete this.openGeneralHandles[requestId]; -diff --git a/node_modules/@bsv/auth-express-middleware/src/index.ts b/node_modules/@bsv/auth-express-middleware/src/index.ts -index 9246179..c4e46d6 100644 ---- a/node_modules/@bsv/auth-express-middleware/src/index.ts -+++ b/node_modules/@bsv/auth-express-middleware/src/index.ts -@@ -574,7 +574,7 @@ export class ExpressTransport implements Transport { - const requestId = Utils.toBase64(new Utils.Reader(payload).read(32)) - if (requestId === req.headers['x-bsv-auth-request-id']) { - this.peer?.stopListeningForGeneralMessages(listenerId) -- this.setupAuthenticatedResponse(req, res, next, senderPublicKey, requestId) -+ this.setupAuthenticatedResponse(req, res, next, senderPublicKey, requestId, message.yourNonce) - } - } catch (error) { - this.log('error', 'Error in listenForGeneralMessages callback', { error }) -@@ -608,7 +608,8 @@ export class ExpressTransport implements Transport { - res: Response, - next: NextFunction, - senderPublicKey: string, -- requestId: string -+ requestId: string, -+ requestSessionNonce?: string - ): void { - this.log('debug', 'General message from the correct identity key', { requestId, senderPublicKey }) - req.auth = { identityKey: senderPublicKey } -@@ -636,7 +637,7 @@ export class ExpressTransport implements Transport { - responseHeaders: wrapper.getHeaders(), - responseBodyLength: wrapper.getBody().length - }) -- await this.peer?.toPeer(responsePayload, req.headers['x-bsv-auth-identity-key'] as string) -+ await this.peer?.toPeer(responsePayload, requestSessionNonce ?? req.headers['x-bsv-auth-identity-key'] as string) - } catch (err) { - delete this.openGeneralHandles[requestId] - this.log('error', 'Failed to build and send authenticated response', { error: err }) diff --git a/patches/@bsv+sdk+2.1.4.patch b/patches/@bsv+sdk+2.1.4.patch deleted file mode 100644 index e239fee..0000000 --- a/patches/@bsv+sdk+2.1.4.patch +++ /dev/null @@ -1,609 +0,0 @@ -diff --git a/node_modules/@bsv/sdk/dist/cjs/src/auth/Peer.js b/node_modules/@bsv/sdk/dist/cjs/src/auth/Peer.js -index 9a0265b..2a4f93f 100644 ---- a/node_modules/@bsv/sdk/dist/cjs/src/auth/Peer.js -+++ b/node_modules/@bsv/sdk/dist/cjs/src/auth/Peer.js -@@ -298,8 +298,9 @@ class Peer { - initialNonce: sessionNonce, - requestedCertificates: this.certificatesToRequest - }; -+ const initialResponse = this.waitForInitialResponse(sessionNonce); - await this.transport.send(initialRequest); -- return await this.waitForInitialResponse(sessionNonce); -+ return await initialResponse; - } - /** - * Waits for the initial response from the peer after sending an initial handshake request message. -@@ -663,15 +664,16 @@ class Peer { - throw new Error(`Unable to verify nonce for general message from: ${message.identityKey}`); - } - const peerSession = await this.sessionManager.getSession(message.yourNonce); -- if (peerSession == null) { -+ const recoveredStatelessSession = peerSession == null; -+ if (peerSession == null && typeof message.identityKey !== 'string') { - throw new Error(`Session not found for nonce: ${message.yourNonce}`); - } -- const certificatesRequired = peerSession.certificatesRequired === true; -- const certificatesValidated = peerSession.certificatesValidated === true; -+ const certificatesRequired = peerSession?.certificatesRequired === true; -+ const certificatesValidated = peerSession?.certificatesValidated === true; - // If certificates are required but not yet validated, wait for them with a timeout - if (certificatesRequired && !certificatesValidated) { - const CERTIFICATE_WAIT_TIMEOUT_MS = 30000; -- const sessionNonce = peerSession.sessionNonce; -+ const sessionNonce = peerSession?.sessionNonce; - if (sessionNonce == null) { - throw new Error('Session nonce is required for certificate validation'); - } -@@ -681,7 +683,7 @@ class Peer { - const promise = this.certificateValidationPromises.get(sessionNonce); - if (promise != null) { - this.certificateValidationPromises.delete(sessionNonce); -- reject(new Error(`Timeout waiting for certificate validation from peer ${peerSession.peerIdentityKey ?? 'unknown'}`)); -+ reject(new Error(`Timeout waiting for certificate validation from peer ${peerSession?.peerIdentityKey ?? 'unknown'}`)); - } - }, CERTIFICATE_WAIT_TIMEOUT_MS); - // Ensure the timer doesn't prevent process exit during tests -@@ -701,19 +703,23 @@ class Peer { - }); - }); - } -+ const sessionNonceForSignature = peerSession?.sessionNonce ?? message.yourNonce; -+ const counterpartyForSignature = peerSession?.peerIdentityKey ?? message.identityKey; - const { valid } = await this.wallet.verifySignature({ - data: message.payload, - signature: message.signature, - protocolID: [2, 'auth message signature'], -- keyID: `${message.nonce ?? ''} ${peerSession.sessionNonce ?? ''}`, -- counterparty: peerSession.peerIdentityKey -+ keyID: `${message.nonce ?? ''} ${sessionNonceForSignature}`, -+ counterparty: counterpartyForSignature - }, this.originator); - if (!valid) { -- throw new Error(`Invalid signature in generalMessage from ${peerSession.peerIdentityKey}`); -+ throw new Error(`Invalid signature in generalMessage from ${counterpartyForSignature}`); -+ } -+ if (!recoveredStatelessSession && peerSession != null) { -+ // Mark last usage -+ peerSession.lastUpdate = Date.now(); -+ await this.sessionManager.updateSession(peerSession); - } -- // Mark last usage -- peerSession.lastUpdate = Date.now(); -- await this.sessionManager.updateSession(peerSession); - // Update lastInteractedWithPeer - this.lastInteractedWithPeer = message.identityKey; - // Dispatch callbacks -diff --git a/node_modules/@bsv/sdk/dist/cjs/src/auth/clients/AuthFetch.js b/node_modules/@bsv/sdk/dist/cjs/src/auth/clients/AuthFetch.js -index 105941f..4793778 100644 ---- a/node_modules/@bsv/sdk/dist/cjs/src/auth/clients/AuthFetch.js -+++ b/node_modules/@bsv/sdk/dist/cjs/src/auth/clients/AuthFetch.js -@@ -157,10 +157,21 @@ class AuthFetch { - const responseReader = new Utils.Reader(payload); - // Deserialize first 32 bytes of payload - const responseNonceAsBase64 = Utils.toBase64(responseReader.read(32)); -- if (responseNonceAsBase64 !== requestNonceAsBase64) { -+ let callbackNonceAsBase64 = responseNonceAsBase64; -+ let callback = this.callbacks[callbackNonceAsBase64]; -+ if (callback == null) { -+ const pendingCallbackNonces = Object.keys(this.callbacks); -+ if (pendingCallbackNonces.length === 1) { -+ callbackNonceAsBase64 = pendingCallbackNonces[0]; -+ callback = this.callbacks[callbackNonceAsBase64]; -+ } -+ } -+ if (callback == null) { - return; - } -- peerToUse.peer.stopListeningForGeneralMessages(listenerId); -+ if (callbackNonceAsBase64 === requestNonceAsBase64 || this.callbacks[requestNonceAsBase64] == null) { -+ peerToUse.peer.stopListeningForGeneralMessages(listenerId); -+ } - // Save the identity key for the peer for future requests, since we have it here. - this.peers[baseURL].identityKey = senderPublicKey; - this.peers[baseURL].supportsMutualAuth = true; -@@ -195,9 +206,9 @@ class AuthFetch { - headers: new Headers(responseHeaders) - }); - // Resolve or reject the correct request with the response data -- this.callbacks[requestNonceAsBase64].resolve(responseValue); -+ callback.resolve(responseValue); - // Clean up -- delete this.callbacks[requestNonceAsBase64]; -+ delete this.callbacks[callbackNonceAsBase64]; - }); - // Before sending general messages to the peer, ensure that no certificate requests are pending. - // This way, the user would need to choose to either allow or reject the certificate request first. -@@ -223,6 +234,7 @@ class AuthFetch { - }); - } - // Send the request, now that all listeners are set up -+ let handledRetry = false; - await peerToUse.peer.toPeer(writer.toArray(), peerToUse.identityKey).catch(async (error) => { - const isStaleSession = error.message.includes('Session not found for nonce') || - (error.message.includes('without valid BSV authentication') && -@@ -235,23 +247,38 @@ class AuthFetch { - delete this.peers[baseURL]; - config.retryCounter ?? (config.retryCounter = 3); - const response = await this.fetch(url, config); -+ handledRetry = true; - resolve(response); - return; - } - if (error.message.includes('HTTP server failed to authenticate')) { - try { - const response = await this.handleFetchAndValidate(url, config, peerToUse); -+ handledRetry = true; - resolve(response); - return; - } - catch (fetchError) { -+ handledRetry = true; - reject(fetchError); - } - } - else { -+ handledRetry = true; - reject(error); - } - }); -+ if (!handledRetry && this.callbacks[requestNonceAsBase64] == null) { -+ peerToUse.peer.stopListeningForGeneralMessages(listenerId); -+ } -+ if (!handledRetry && this.callbacks[requestNonceAsBase64] != null) { -+ peerToUse.peer.stopListeningForGeneralMessages(listenerId); -+ delete this.callbacks[requestNonceAsBase64]; -+ delete this.peers[baseURL]; -+ config.retryCounter ?? (config.retryCounter = 3); -+ const response = await this.fetch(url, config); -+ resolve(response); -+ } - } - catch (e) { - reject(e); -diff --git a/node_modules/@bsv/sdk/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js b/node_modules/@bsv/sdk/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js -index 4d5f3e2..01920dc 100644 ---- a/node_modules/@bsv/sdk/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js -+++ b/node_modules/@bsv/sdk/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js -@@ -101,7 +101,7 @@ class SimplifiedFetchTransport { - } - if (this.onDataCallback != null) { - const responseMessage = await response.json(); -- this.onDataCallback(responseMessage); -+ await this.onDataCallback(responseMessage); - } - if (message.messageType === 'initialRequest') { - resolve(); -@@ -239,7 +239,7 @@ class SimplifiedFetchTransport { - throw this.createUnauthenticatedResponseError(url, response, responseBodyArray); - } - // Handle the response if data is received and callback is set -- this.onDataCallback(responseMessage); -+ await this.onDataCallback(responseMessage); - } - } - /** -@@ -250,11 +250,8 @@ class SimplifiedFetchTransport { - * @returns A promise that resolves once the callback is set. - */ - async onData(callback) { -- this.onDataCallback = (m) => { -- void callback(m).catch(() => { -- // Errors from handleIncomingMessage on the client side are not -- // actionable here — prevent unhandled promise rejections. -- }); -+ this.onDataCallback = async (m) => { -+ await callback(m); - }; - } - createNetworkError(url, originalError) { -diff --git a/node_modules/@bsv/sdk/dist/esm/src/auth/Peer.js b/node_modules/@bsv/sdk/dist/esm/src/auth/Peer.js -index ed1545f..ef56746 100644 ---- a/node_modules/@bsv/sdk/dist/esm/src/auth/Peer.js -+++ b/node_modules/@bsv/sdk/dist/esm/src/auth/Peer.js -@@ -291,8 +291,9 @@ export class Peer { - initialNonce: sessionNonce, - requestedCertificates: this.certificatesToRequest - }; -+ const initialResponse = this.waitForInitialResponse(sessionNonce); - await this.transport.send(initialRequest); -- return await this.waitForInitialResponse(sessionNonce); -+ return await initialResponse; - } - /** - * Waits for the initial response from the peer after sending an initial handshake request message. -@@ -656,15 +657,16 @@ export class Peer { - throw new Error(`Unable to verify nonce for general message from: ${message.identityKey}`); - } - const peerSession = await this.sessionManager.getSession(message.yourNonce); -- if (peerSession == null) { -+ const recoveredStatelessSession = peerSession == null; -+ if (peerSession == null && typeof message.identityKey !== 'string') { - throw new Error(`Session not found for nonce: ${message.yourNonce}`); - } -- const certificatesRequired = peerSession.certificatesRequired === true; -- const certificatesValidated = peerSession.certificatesValidated === true; -+ const certificatesRequired = peerSession?.certificatesRequired === true; -+ const certificatesValidated = peerSession?.certificatesValidated === true; - // If certificates are required but not yet validated, wait for them with a timeout - if (certificatesRequired && !certificatesValidated) { - const CERTIFICATE_WAIT_TIMEOUT_MS = 30000; -- const sessionNonce = peerSession.sessionNonce; -+ const sessionNonce = peerSession?.sessionNonce; - if (sessionNonce == null) { - throw new Error('Session nonce is required for certificate validation'); - } -@@ -674,7 +676,7 @@ export class Peer { - const promise = this.certificateValidationPromises.get(sessionNonce); - if (promise != null) { - this.certificateValidationPromises.delete(sessionNonce); -- reject(new Error(`Timeout waiting for certificate validation from peer ${peerSession.peerIdentityKey ?? 'unknown'}`)); -+ reject(new Error(`Timeout waiting for certificate validation from peer ${peerSession?.peerIdentityKey ?? 'unknown'}`)); - } - }, CERTIFICATE_WAIT_TIMEOUT_MS); - // Ensure the timer doesn't prevent process exit during tests -@@ -694,19 +696,23 @@ export class Peer { - }); - }); - } -+ const sessionNonceForSignature = peerSession?.sessionNonce ?? message.yourNonce; -+ const counterpartyForSignature = peerSession?.peerIdentityKey ?? message.identityKey; - const { valid } = await this.wallet.verifySignature({ - data: message.payload, - signature: message.signature, - protocolID: [2, 'auth message signature'], -- keyID: `${message.nonce ?? ''} ${peerSession.sessionNonce ?? ''}`, -- counterparty: peerSession.peerIdentityKey -+ keyID: `${message.nonce ?? ''} ${sessionNonceForSignature}`, -+ counterparty: counterpartyForSignature - }, this.originator); - if (!valid) { -- throw new Error(`Invalid signature in generalMessage from ${peerSession.peerIdentityKey}`); -+ throw new Error(`Invalid signature in generalMessage from ${counterpartyForSignature}`); -+ } -+ if (!recoveredStatelessSession && peerSession != null) { -+ // Mark last usage -+ peerSession.lastUpdate = Date.now(); -+ await this.sessionManager.updateSession(peerSession); - } -- // Mark last usage -- peerSession.lastUpdate = Date.now(); -- await this.sessionManager.updateSession(peerSession); - // Update lastInteractedWithPeer - this.lastInteractedWithPeer = message.identityKey; - // Dispatch callbacks -diff --git a/node_modules/@bsv/sdk/dist/esm/src/auth/clients/AuthFetch.js b/node_modules/@bsv/sdk/dist/esm/src/auth/clients/AuthFetch.js -index 7838555..4c67b60 100644 ---- a/node_modules/@bsv/sdk/dist/esm/src/auth/clients/AuthFetch.js -+++ b/node_modules/@bsv/sdk/dist/esm/src/auth/clients/AuthFetch.js -@@ -122,10 +122,21 @@ export class AuthFetch { - const responseReader = new Utils.Reader(payload); - // Deserialize first 32 bytes of payload - const responseNonceAsBase64 = Utils.toBase64(responseReader.read(32)); -- if (responseNonceAsBase64 !== requestNonceAsBase64) { -+ let callbackNonceAsBase64 = responseNonceAsBase64; -+ let callback = this.callbacks[callbackNonceAsBase64]; -+ if (callback == null) { -+ const pendingCallbackNonces = Object.keys(this.callbacks); -+ if (pendingCallbackNonces.length === 1) { -+ callbackNonceAsBase64 = pendingCallbackNonces[0]; -+ callback = this.callbacks[callbackNonceAsBase64]; -+ } -+ } -+ if (callback == null) { - return; - } -- peerToUse.peer.stopListeningForGeneralMessages(listenerId); -+ if (callbackNonceAsBase64 === requestNonceAsBase64 || this.callbacks[requestNonceAsBase64] == null) { -+ peerToUse.peer.stopListeningForGeneralMessages(listenerId); -+ } - // Save the identity key for the peer for future requests, since we have it here. - this.peers[baseURL].identityKey = senderPublicKey; - this.peers[baseURL].supportsMutualAuth = true; -@@ -160,9 +171,9 @@ export class AuthFetch { - headers: new Headers(responseHeaders) - }); - // Resolve or reject the correct request with the response data -- this.callbacks[requestNonceAsBase64].resolve(responseValue); -+ callback.resolve(responseValue); - // Clean up -- delete this.callbacks[requestNonceAsBase64]; -+ delete this.callbacks[callbackNonceAsBase64]; - }); - // Before sending general messages to the peer, ensure that no certificate requests are pending. - // This way, the user would need to choose to either allow or reject the certificate request first. -@@ -188,6 +199,7 @@ export class AuthFetch { - }); - } - // Send the request, now that all listeners are set up -+ let handledRetry = false; - await peerToUse.peer.toPeer(writer.toArray(), peerToUse.identityKey).catch(async (error) => { - const isStaleSession = error.message.includes('Session not found for nonce') || - (error.message.includes('without valid BSV authentication') && -@@ -200,23 +212,38 @@ export class AuthFetch { - delete this.peers[baseURL]; - config.retryCounter ??= 3; - const response = await this.fetch(url, config); -+ handledRetry = true; - resolve(response); - return; - } - if (error.message.includes('HTTP server failed to authenticate')) { - try { - const response = await this.handleFetchAndValidate(url, config, peerToUse); -+ handledRetry = true; - resolve(response); - return; - } - catch (fetchError) { -+ handledRetry = true; - reject(fetchError); - } - } - else { -+ handledRetry = true; - reject(error); - } - }); -+ if (!handledRetry && this.callbacks[requestNonceAsBase64] == null) { -+ peerToUse.peer.stopListeningForGeneralMessages(listenerId); -+ } -+ if (!handledRetry && this.callbacks[requestNonceAsBase64] != null) { -+ peerToUse.peer.stopListeningForGeneralMessages(listenerId); -+ delete this.callbacks[requestNonceAsBase64]; -+ delete this.peers[baseURL]; -+ config.retryCounter ??= 3; -+ const response = await this.fetch(url, config); -+ resolve(response); -+ } - } - catch (e) { - reject(e); -diff --git a/node_modules/@bsv/sdk/dist/esm/src/auth/transports/SimplifiedFetchTransport.js b/node_modules/@bsv/sdk/dist/esm/src/auth/transports/SimplifiedFetchTransport.js -index 314b7d0..d0603ef 100644 ---- a/node_modules/@bsv/sdk/dist/esm/src/auth/transports/SimplifiedFetchTransport.js -+++ b/node_modules/@bsv/sdk/dist/esm/src/auth/transports/SimplifiedFetchTransport.js -@@ -68,7 +68,7 @@ export class SimplifiedFetchTransport { - } - if (this.onDataCallback != null) { - const responseMessage = await response.json(); -- this.onDataCallback(responseMessage); -+ await this.onDataCallback(responseMessage); - } - if (message.messageType === 'initialRequest') { - resolve(); -@@ -206,7 +206,7 @@ export class SimplifiedFetchTransport { - throw this.createUnauthenticatedResponseError(url, response, responseBodyArray); - } - // Handle the response if data is received and callback is set -- this.onDataCallback(responseMessage); -+ await this.onDataCallback(responseMessage); - } - } - /** -@@ -217,11 +217,8 @@ export class SimplifiedFetchTransport { - * @returns A promise that resolves once the callback is set. - */ - async onData(callback) { -- this.onDataCallback = (m) => { -- void callback(m).catch(() => { -- // Errors from handleIncomingMessage on the client side are not -- // actionable here — prevent unhandled promise rejections. -- }); -+ this.onDataCallback = async (m) => { -+ await callback(m); - }; - } - createNetworkError(url, originalError) { -diff --git a/node_modules/@bsv/sdk/src/auth/Peer.ts b/node_modules/@bsv/sdk/src/auth/Peer.ts -index c2499ab..9be1b3b 100644 ---- a/node_modules/@bsv/sdk/src/auth/Peer.ts -+++ b/node_modules/@bsv/sdk/src/auth/Peer.ts -@@ -394,8 +394,9 @@ export class Peer { - requestedCertificates: this.certificatesToRequest - } - -+ const initialResponse = this.waitForInitialResponse(sessionNonce) - await this.transport.send(initialRequest) -- return await this.waitForInitialResponse(sessionNonce) -+ return await initialResponse - } - - /** -@@ -889,17 +890,18 @@ export class Peer { - } - - const peerSession = await this.sessionManager.getSession(message.yourNonce as string) -- if (peerSession == null) { -+ const recoveredStatelessSession = peerSession == null -+ if (peerSession == null && typeof message.identityKey !== 'string') { - throw new Error(`Session not found for nonce: ${message.yourNonce as string}`) - } - -- const certificatesRequired = peerSession.certificatesRequired === true -- const certificatesValidated = peerSession.certificatesValidated === true -+ const certificatesRequired = peerSession?.certificatesRequired === true -+ const certificatesValidated = peerSession?.certificatesValidated === true - - // If certificates are required but not yet validated, wait for them with a timeout - if (certificatesRequired && !certificatesValidated) { - const CERTIFICATE_WAIT_TIMEOUT_MS = 30000 -- const sessionNonce = peerSession.sessionNonce -+ const sessionNonce = peerSession?.sessionNonce - - if (sessionNonce == null) { - throw new Error('Session nonce is required for certificate validation') -@@ -912,7 +914,7 @@ export class Peer { - if (promise != null) { - this.certificateValidationPromises.delete(sessionNonce) - reject(new Error( -- `Timeout waiting for certificate validation from peer ${peerSession.peerIdentityKey ?? 'unknown' -+ `Timeout waiting for certificate validation from peer ${peerSession?.peerIdentityKey ?? 'unknown' - }` - )) - } -@@ -936,23 +938,28 @@ export class Peer { - }) - } - -+ const sessionNonceForSignature = peerSession?.sessionNonce ?? message.yourNonce as string -+ const counterpartyForSignature = peerSession?.peerIdentityKey ?? message.identityKey -+ - const { valid } = await this.wallet.verifySignature({ - data: message.payload, - signature: message.signature as number[], - protocolID: [2, 'auth message signature'], -- keyID: `${message.nonce ?? ''} ${peerSession.sessionNonce ?? ''}`, -- counterparty: peerSession.peerIdentityKey -+ keyID: `${message.nonce ?? ''} ${sessionNonceForSignature}`, -+ counterparty: counterpartyForSignature - }, this.originator) - - if (!valid) { - throw new Error( -- `Invalid signature in generalMessage from ${peerSession.peerIdentityKey as string}` -+ `Invalid signature in generalMessage from ${counterpartyForSignature as string}` - ) - } - -- // Mark last usage -- peerSession.lastUpdate = Date.now() -- await this.sessionManager.updateSession(peerSession) -+ if (!recoveredStatelessSession && peerSession != null) { -+ // Mark last usage -+ peerSession.lastUpdate = Date.now() -+ await this.sessionManager.updateSession(peerSession) -+ } - - // Update lastInteractedWithPeer - this.lastInteractedWithPeer = message.identityKey -diff --git a/node_modules/@bsv/sdk/src/auth/clients/AuthFetch.ts b/node_modules/@bsv/sdk/src/auth/clients/AuthFetch.ts -index 93612fc..5b7db49 100644 ---- a/node_modules/@bsv/sdk/src/auth/clients/AuthFetch.ts -+++ b/node_modules/@bsv/sdk/src/auth/clients/AuthFetch.ts -@@ -185,10 +185,21 @@ export class AuthFetch { - const responseReader = new Utils.Reader(payload) - // Deserialize first 32 bytes of payload - const responseNonceAsBase64 = Utils.toBase64(responseReader.read(32)) -- if (responseNonceAsBase64 !== requestNonceAsBase64) { -+ let callbackNonceAsBase64 = responseNonceAsBase64 -+ let callback = this.callbacks[callbackNonceAsBase64] -+ if (callback == null) { -+ const pendingCallbackNonces = Object.keys(this.callbacks) -+ if (pendingCallbackNonces.length === 1) { -+ callbackNonceAsBase64 = pendingCallbackNonces[0] -+ callback = this.callbacks[callbackNonceAsBase64] -+ } -+ } -+ if (callback == null) { - return - } -- peerToUse.peer.stopListeningForGeneralMessages(listenerId) -+ if (callbackNonceAsBase64 === requestNonceAsBase64 || this.callbacks[requestNonceAsBase64] == null) { -+ peerToUse.peer.stopListeningForGeneralMessages(listenerId) -+ } - - // Save the identity key for the peer for future requests, since we have it here. - this.peers[baseURL].identityKey = senderPublicKey -@@ -233,10 +244,10 @@ export class AuthFetch { - ) - - // Resolve or reject the correct request with the response data -- this.callbacks[requestNonceAsBase64].resolve(responseValue) -+ callback.resolve(responseValue) - - // Clean up -- delete this.callbacks[requestNonceAsBase64] -+ delete this.callbacks[callbackNonceAsBase64] - }) - - // Before sending general messages to the peer, ensure that no certificate requests are pending. -@@ -269,6 +280,7 @@ export class AuthFetch { - } - - // Send the request, now that all listeners are set up -+ let handledRetry = false - await peerToUse.peer.toPeer(writer.toArray(), peerToUse.identityKey).catch(async error => { - const isStaleSession = - error.message.includes('Session not found for nonce') || -@@ -282,21 +294,36 @@ export class AuthFetch { - delete this.peers[baseURL] - config.retryCounter ??= 3 - const response = await this.fetch(url, config) -+ handledRetry = true - resolve(response) - return - } - if (error.message.includes('HTTP server failed to authenticate')) { - try { - const response = await this.handleFetchAndValidate(url, config, peerToUse) -+ handledRetry = true - resolve(response) - return - } catch (fetchError) { -+ handledRetry = true - reject(fetchError) - } - } else { -+ handledRetry = true - reject(error) - } - }) -+ if (!handledRetry && this.callbacks[requestNonceAsBase64] == null) { -+ peerToUse.peer.stopListeningForGeneralMessages(listenerId) -+ } -+ if (!handledRetry && this.callbacks[requestNonceAsBase64] != null) { -+ peerToUse.peer.stopListeningForGeneralMessages(listenerId) -+ delete this.callbacks[requestNonceAsBase64] -+ delete this.peers[baseURL] -+ config.retryCounter ??= 3 -+ const response = await this.fetch(url, config) -+ resolve(response) -+ } - } catch (e) { - reject(e) - } -diff --git a/node_modules/@bsv/sdk/src/auth/transports/SimplifiedFetchTransport.ts b/node_modules/@bsv/sdk/src/auth/transports/SimplifiedFetchTransport.ts -index 40b2f42..3648f18 100644 ---- a/node_modules/@bsv/sdk/src/auth/transports/SimplifiedFetchTransport.ts -+++ b/node_modules/@bsv/sdk/src/auth/transports/SimplifiedFetchTransport.ts -@@ -13,7 +13,7 @@ const defaultFetch: typeof fetch = - * This class integrates with fetch to send and receive authenticated messages between peers. - */ - export class SimplifiedFetchTransport implements Transport { -- private onDataCallback?: (message: AuthMessage) => void -+ private onDataCallback?: (message: AuthMessage) => Promise - fetchClient: typeof fetch - baseUrl: string - -@@ -80,7 +80,7 @@ export class SimplifiedFetchTransport implements Transport { - - if (this.onDataCallback != null) { - const responseMessage = await response.json() -- this.onDataCallback(responseMessage as AuthMessage) -+ await this.onDataCallback(responseMessage as AuthMessage) - } - - if (message.messageType === 'initialRequest') { -@@ -229,7 +229,7 @@ export class SimplifiedFetchTransport implements Transport { - } - - // Handle the response if data is received and callback is set -- this.onDataCallback(responseMessage) -+ await this.onDataCallback(responseMessage) - } - } - -@@ -241,11 +241,8 @@ export class SimplifiedFetchTransport implements Transport { - * @returns A promise that resolves once the callback is set. - */ - async onData(callback: (message: AuthMessage) => Promise): Promise { -- this.onDataCallback = (m) => { -- void callback(m).catch(() => { -- // Errors from handleIncomingMessage on the client side are not -- // actionable here — prevent unhandled promise rejections. -- }) -+ this.onDataCallback = async (m) => { -+ await callback(m) - } - } -