From ef5262f73cd8114d3c4fbe4c87ea45feda94d645 Mon Sep 17 00:00:00 2001 From: hzrd149 Date: Sat, 5 Apr 2025 15:13:05 +0100 Subject: [PATCH] Remove nginx cache invalidations Remove screenshots Fix race condition bug --- .changeset/cold-clowns-rest.md | 5 + .changeset/proud-tires-repair.md | 5 + .changeset/slow-mugs-melt.md | 5 + .env.example | 9 +- .gitignore | 1 - .vscode/launch.json | 3 +- Dockerfile | 18 +- Dockerfile-screenshots | 75 -- docker-compose.yml | 20 +- docker-entrypoint.sh | 7 - package.json | 17 +- pnpm-lock.yaml | 1192 ++++++++++-------------------- public/favicon.ico | Bin 0 -> 15406 bytes src/blossom.ts | 100 +-- src/cache.ts | 18 +- src/env.ts | 7 - src/events.ts | 13 +- src/index.ts | 107 +-- src/invalidation.ts | 15 +- src/nginx.ts | 37 - src/nostr.ts | 36 +- src/screenshots.ts | 47 -- supervisord.conf | 23 - 23 files changed, 590 insertions(+), 1170 deletions(-) create mode 100644 .changeset/cold-clowns-rest.md create mode 100644 .changeset/proud-tires-repair.md create mode 100644 .changeset/slow-mugs-melt.md delete mode 100644 Dockerfile-screenshots delete mode 100755 docker-entrypoint.sh create mode 100644 public/favicon.ico delete mode 100644 src/nginx.ts delete mode 100644 src/screenshots.ts delete mode 100644 supervisord.conf diff --git a/.changeset/cold-clowns-rest.md b/.changeset/cold-clowns-rest.md new file mode 100644 index 0000000..0d9df9a --- /dev/null +++ b/.changeset/cold-clowns-rest.md @@ -0,0 +1,5 @@ +--- +"nsite-gateway": major +--- + +Remove screenshots feature diff --git a/.changeset/proud-tires-repair.md b/.changeset/proud-tires-repair.md new file mode 100644 index 0000000..f264fb2 --- /dev/null +++ b/.changeset/proud-tires-repair.md @@ -0,0 +1,5 @@ +--- +"nsite-gateway": major +--- + +Remove nginx cache invalidations diff --git a/.changeset/slow-mugs-melt.md b/.changeset/slow-mugs-melt.md new file mode 100644 index 0000000..44888ed --- /dev/null +++ b/.changeset/slow-mugs-melt.md @@ -0,0 +1,5 @@ +--- +"nsite-gateway": patch +--- + +Fix race condition when streaming blob diff --git a/.env.example b/.env.example index a3e2f1b..b63bb27 100644 --- a/.env.example +++ b/.env.example @@ -2,7 +2,7 @@ # can be in-memory, redis:// or sqlite:// CACHE_PATH="in-memory" -# How long to keep a pubkeys relays and blossom servers in cache (in seconds) +# How long to keep cached data (in seconds) CACHE_TIME=3600 # A list of relays to find users relay lists (10002) and blossom servers (10063) @@ -17,9 +17,6 @@ BLOSSOM_SERVERS=https://nostr.download,https://cdn.satellite.earth # The max file size to serve MAX_FILE_SIZE='2 MB' -# The cache folder for nginx (used for cache invalidation) -NGINX_CACHE_DIR='/var/nginx/cache' - # A nprofile pointer for an nsite to use as the default homepage # Setting this will override anything in the ./public folder NSITE_HOMEPAGE="" @@ -27,10 +24,6 @@ NSITE_HOMEPAGE="" # a local directory to download the homepage to NSITE_HOMEPAGE_DIR="public" -# Screenshots require Puppeteer to be setup https://pptr.dev/troubleshooting#setting-up-chrome-linux-sandbox -ENABLE_SCREENSHOTS="false" -SCREENSHOTS_DIR="./screenshots" - # If this is set, nsite will return the 'Onion-Location' header in responses # ONION_HOST=https://.onion diff --git a/.gitignore b/.gitignore index 2b89ae8..58f87af 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,4 @@ build .env data .netrc -screenshots diff --git a/.vscode/launch.json b/.vscode/launch.json index ad2fe8d..4f2970d 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -26,8 +26,7 @@ "internalConsoleOptions": "openOnSessionStart", "outputCapture": "std", "env": { - "DEBUG": "nsite,nsite:*", - "ENABLE_SCREENSHOTS": "true" + "DEBUG": "nsite,nsite:*" } } ] diff --git a/Dockerfile b/Dockerfile index 0f712ae..9e37db9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,9 @@ -# syntax=docker/dockerfile:1 FROM node:22-alpine AS base ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN corepack enable -RUN apk update && apk add --no-cache nginx supervisor -COPY supervisord.conf /etc/supervisord.conf - WORKDIR /app COPY package.json . COPY pnpm-lock.yaml . @@ -27,25 +23,13 @@ FROM base AS main RUN addgroup -S nsite && adduser -S nsite -G nsite RUN chown -R nsite:nsite /app -# Setup nginx -COPY nginx/nginx.conf /etc/nginx/nginx.conf -COPY nginx/http.conf /etc/nginx/conf.d/default.conf - # setup nsite COPY --from=prod-deps /app/node_modules /app/node_modules COPY --from=build ./app/build ./build COPY ./public ./public -VOLUME [ "/var/cache/nginx" ] - EXPOSE 80 3000 ENV NSITE_PORT="3000" -ENV NGINX_CACHE_DIR="/var/cache/nginx" -ENV ENABLE_SCREENSHOTS="false" -COPY docker-entrypoint.sh / -RUN chmod +x /docker-entrypoint.sh -ENTRYPOINT ["/docker-entrypoint.sh"] - -CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"] +CMD ["node", "."] diff --git a/Dockerfile-screenshots b/Dockerfile-screenshots deleted file mode 100644 index 94b30d5..0000000 --- a/Dockerfile-screenshots +++ /dev/null @@ -1,75 +0,0 @@ -# syntax=docker/dockerfile:1 -FROM node:20-slim AS base - -ENV PNPM_HOME="/pnpm" -ENV PATH="$PNPM_HOME:$PATH" -RUN corepack enable - -# Setup nsite user -RUN groupadd -r nsite && useradd -r -g nsite -G audio,video nsite && usermod -d /app nsite - -# Install nginx and supervisor -RUN apt-get update && apt-get install -y nginx supervisor - -# setup supervisor -COPY supervisord.conf /etc/supervisord.conf - -# Setup nginx -COPY nginx/nginx.conf /etc/nginx/nginx.conf -COPY nginx/http.conf /etc/nginx/conf.d/default.conf -RUN chown nsite:nsite -R /etc/nginx - -# install google chrome for screenshots. copied from (https://pptr.dev/troubleshooting#running-puppeteer-in-docker) - -# Install latest chrome dev package and fonts to support major charsets (Chinese, Japanese, Arabic, Hebrew, Thai and a few others) -# Note: this installs the necessary libs to make the bundled version of Chrome for Testing that Puppeteer -# installs, work. -RUN apt-get update \ - && apt-get install -y wget gnupg \ - && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ - && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \ - && apt-get update \ - && apt-get install -y google-chrome-stable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf libxss1 \ - --no-install-recommends \ - && rm -rf /var/lib/apt/lists/* - -WORKDIR /app -COPY package.json . -COPY pnpm-lock.yaml . - -FROM base AS prod-deps -RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile - -FROM base AS build -RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile -COPY tsconfig.json . -COPY src ./src -RUN pnpm build - -FROM base AS main - -# setup nsite -COPY --from=prod-deps /app/node_modules /app/node_modules -COPY --from=build ./app/build ./build - -COPY ./public ./public - -VOLUME [ "/var/cache/nginx" ] -VOLUME [ "/screenshots" ] - -EXPOSE 80 3000 -ENV NSITE_PORT="3000" -ENV NGINX_CACHE_DIR="/var/cache/nginx" -ENV ENABLE_SCREENSHOTS="true" -ENV SCREENSHOTS_DIR="/screenshots" -ENV PUPPETEER_SKIP_DOWNLOAD="true" - -COPY docker-entrypoint.sh / -RUN chmod +x /docker-entrypoint.sh - -# change ownership of app -RUN chown nsite:nsite -R /app - -# Run /docker-entrypoint as root so supervisor can run -ENTRYPOINT ["/docker-entrypoint.sh"] -CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"] diff --git a/docker-compose.yml b/docker-compose.yml index 187822e..8e6273b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,17 +1,21 @@ -version: "3.7" - services: + redis: + image: redis:alpine + command: redis-server --save 60 1 --loglevel warning + volumes: + - redis-data:/data + nsite: build: . image: ghcr.io/hzrd149/nsite-gateway:master environment: LOOKUP_RELAYS: wss://user.kindpag.es,wss://purplepag.es SUBSCRIPTION_RELAYS: wss://nostrue.com/,wss://nos.lol/,wss://relay.damus.io/,wss://purplerelay.com/ - volumes: - - type: tmpfs - target: /var/cache/nginx - tmpfs: - size: 100M + CACHE_PATH: redis://redis:6379 + depends_on: + - redis ports: - - 8080:80 - 3000:3000 + +volumes: + redis-data: diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh deleted file mode 100755 index 51c1863..0000000 --- a/docker-entrypoint.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -echo Changing permission on volumes -chown -R nsite:nsite /var/cache/nginx -chown -R nsite:nsite /screenshots - -exec "$@" diff --git a/package.json b/package.json index 6a01e28..303d560 100644 --- a/package.json +++ b/package.json @@ -31,12 +31,11 @@ "koa-morgan": "^1.0.1", "koa-send": "^5.0.1", "koa-static": "^5.0.0", - "mime": "^4.0.6", - "nostr-tools": "^2.11.0", + "mime": "^4.0.7", + "nostr-tools": "^2.12.0", "nsite-cli": "^0.1.16", "pac-proxy-agent": "^7.2.0", "proxy-agent": "^6.5.0", - "puppeteer": "^23.11.1", "websocket-polyfill": "1.0.0", "ws": "^8.18.1", "xbytes": "^1.9.1" @@ -44,8 +43,8 @@ "devDependencies": { "@changesets/cli": "^2.28.1", "@swc-node/register": "^1.10.10", - "@swc/core": "^1.11.10", - "@types/better-sqlite3": "^7.6.12", + "@swc/core": "^1.11.16", + "@types/better-sqlite3": "^7.6.13", "@types/debug": "^4.1.12", "@types/follow-redirects": "^1.14.4", "@types/koa": "^2.15.0", @@ -54,14 +53,14 @@ "@types/koa-static": "^4.0.4", "@types/koa__cors": "^5.0.0", "@types/koa__router": "^12.0.4", - "@types/node": "^20.17.24", + "@types/node": "^20.17.30", "@types/proxy-from-env": "^1.0.4", - "@types/ws": "^8.18.0", - "esbuild": "^0.25.1", + "@types/ws": "^8.18.1", + "esbuild": "^0.25.2", "nodemon": "^3.1.9", "pkg": "^5.8.1", "prettier": "^3.5.3", - "typescript": "^5.8.2" + "typescript": "^5.8.3" }, "resolutions": { "websocket-polyfill": "1.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e043f2f..ef752d8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,23 +48,20 @@ importers: specifier: ^5.0.0 version: 5.0.0 mime: - specifier: ^4.0.6 - version: 4.0.6 + specifier: ^4.0.7 + version: 4.0.7 nostr-tools: - specifier: ^2.11.0 - version: 2.11.0(typescript@5.8.2) + specifier: ^2.12.0 + version: 2.12.0(typescript@5.8.3) nsite-cli: specifier: ^0.1.16 - version: 0.1.16(@types/node@20.17.24)(typescript@5.8.2) + version: 0.1.16(@types/node@20.17.30)(typescript@5.8.3) pac-proxy-agent: specifier: ^7.2.0 version: 7.2.0 proxy-agent: specifier: ^6.5.0 version: 6.5.0 - puppeteer: - specifier: ^23.11.1 - version: 23.11.1(typescript@5.8.2) websocket-polyfill: specifier: 1.0.0 version: 1.0.0 @@ -80,13 +77,13 @@ importers: version: 2.28.1 '@swc-node/register': specifier: ^1.10.10 - version: 1.10.10(@swc/core@1.11.10)(@swc/types@0.1.19)(typescript@5.8.2) + version: 1.10.10(@swc/core@1.11.16)(@swc/types@0.1.21)(typescript@5.8.3) '@swc/core': - specifier: ^1.11.10 - version: 1.11.10 + specifier: ^1.11.16 + version: 1.11.16 '@types/better-sqlite3': - specifier: ^7.6.12 - version: 7.6.12 + specifier: ^7.6.13 + version: 7.6.13 '@types/debug': specifier: ^4.1.12 version: 4.1.12 @@ -112,17 +109,17 @@ importers: specifier: ^12.0.4 version: 12.0.4 '@types/node': - specifier: ^20.17.24 - version: 20.17.24 + specifier: ^20.17.30 + version: 20.17.30 '@types/proxy-from-env': specifier: ^1.0.4 version: 1.0.4 '@types/ws': - specifier: ^8.18.0 - version: 8.18.0 + specifier: ^8.18.1 + version: 8.18.1 esbuild: - specifier: ^0.25.1 - version: 0.25.1 + specifier: ^0.25.2 + version: 0.25.2 nodemon: specifier: ^3.1.9 version: 3.1.9 @@ -133,15 +130,11 @@ importers: specifier: ^3.5.3 version: 3.5.3 typescript: - specifier: ^5.8.2 - version: 5.8.2 + specifier: ^5.8.3 + version: 5.8.3 packages: - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} - engines: {node: '>=6.9.0'} - '@babel/generator@7.18.2': resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} engines: {node: '>=6.9.0'} @@ -159,16 +152,16 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.26.10': - resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} + '@babel/runtime@7.27.0': + resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} engines: {node: '>=6.9.0'} '@babel/types@7.19.0': resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} engines: {node: '>=6.9.0'} - '@cashu/cashu-ts@2.2.2': - resolution: {integrity: sha512-s4DRaIZOh2MC0qi0G1Te4KfOzzw91EZiIVupssKDmaPSUbT1ggLonj5qyzB4OCpI7uZ4lDpnxh43xkRZyAqotw==} + '@cashu/cashu-ts@2.4.1': + resolution: {integrity: sha512-9lDHP5GtWvC/mIDPRg5KdRQAsqoYYm93efPyfgDtRd9eW1BhWrzLuS0sN1WVkL9noAXCZoWjjpX8TElMXhpFhA==} '@cashu/crypto@0.3.4': resolution: {integrity: sha512-mfv1Pj4iL1PXzUj9NKIJbmncCLMqYfnEDqh/OPxAX0nNBt6BOnVJJLjLWFlQeYxlnEfWABSNkrqPje1t5zcyhA==} @@ -228,161 +221,161 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@emnapi/core@1.3.1': - resolution: {integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==} + '@emnapi/core@1.4.0': + resolution: {integrity: sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg==} - '@emnapi/runtime@1.3.1': - resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@emnapi/runtime@1.4.0': + resolution: {integrity: sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==} '@emnapi/wasi-threads@1.0.1': resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} - '@esbuild/aix-ppc64@0.25.1': - resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} + '@esbuild/aix-ppc64@0.25.2': + resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.1': - resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} + '@esbuild/android-arm64@0.25.2': + resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.1': - resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} + '@esbuild/android-arm@0.25.2': + resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.1': - resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} + '@esbuild/android-x64@0.25.2': + resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.1': - resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} + '@esbuild/darwin-arm64@0.25.2': + resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.1': - resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} + '@esbuild/darwin-x64@0.25.2': + resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.1': - resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} + '@esbuild/freebsd-arm64@0.25.2': + resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.1': - resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} + '@esbuild/freebsd-x64@0.25.2': + resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.1': - resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} + '@esbuild/linux-arm64@0.25.2': + resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.1': - resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} + '@esbuild/linux-arm@0.25.2': + resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.1': - resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} + '@esbuild/linux-ia32@0.25.2': + resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.1': - resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} + '@esbuild/linux-loong64@0.25.2': + resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.1': - resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} + '@esbuild/linux-mips64el@0.25.2': + resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.1': - resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} + '@esbuild/linux-ppc64@0.25.2': + resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.1': - resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} + '@esbuild/linux-riscv64@0.25.2': + resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.1': - resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} + '@esbuild/linux-s390x@0.25.2': + resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.1': - resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} + '@esbuild/linux-x64@0.25.2': + resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.1': - resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} + '@esbuild/netbsd-arm64@0.25.2': + resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.1': - resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} + '@esbuild/netbsd-x64@0.25.2': + resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.1': - resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} + '@esbuild/openbsd-arm64@0.25.2': + resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.1': - resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} + '@esbuild/openbsd-x64@0.25.2': + resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.1': - resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} + '@esbuild/sunos-x64@0.25.2': + resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.1': - resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} + '@esbuild/win32-arm64@0.25.2': + resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.1': - resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} + '@esbuild/win32-ia32@0.25.2': + resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.1': - resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} + '@esbuild/win32-x64@0.25.2': + resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -390,8 +383,8 @@ packages: '@gar/promisify@1.1.3': resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - '@inquirer/checkbox@4.1.4': - resolution: {integrity: sha512-d30576EZdApjAMceijXA5jDzRQHT/MygbC+J8I7EqA6f/FRpYxlRtRJbHF8gHeWYeSdOuTEJqonn7QLB1ELezA==} + '@inquirer/checkbox@4.1.5': + resolution: {integrity: sha512-swPczVU+at65xa5uPfNP9u3qx/alNwiaykiI/ExpsmMSQW55trmZcwhYWzw/7fj+n6Q8z1eENvR7vFfq9oPSAQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -399,8 +392,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@5.1.8': - resolution: {integrity: sha512-dNLWCYZvXDjO3rnQfk2iuJNL4Ivwz/T2+C3+WnNfJKsNGSuOs3wAo2F6e0p946gtSAk31nZMfW+MRmYaplPKsg==} + '@inquirer/confirm@5.1.9': + resolution: {integrity: sha512-NgQCnHqFTjF7Ys2fsqK2WtnA8X1kHyInyG+nMIuHowVTIgIuS10T4AznI/PvbqSpJqjCUqNBlKGh1v3bwLFL4w==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -408,8 +401,8 @@ packages: '@types/node': optional: true - '@inquirer/core@10.1.9': - resolution: {integrity: sha512-sXhVB8n20NYkUBfDYgizGHlpRVaCRjtuzNZA6xpALIUbkgfd2Hjz+DfEN6+h1BRnuxw0/P4jCIMjMsEOAMwAJw==} + '@inquirer/core@10.1.10': + resolution: {integrity: sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -421,8 +414,8 @@ packages: resolution: {integrity: sha512-lR2GaqBkp42Ew9BOAOqf2pSp+ymVES1qN8OC90WWh45yeoYLl0Ty1GyCxmkKqBJtq/+Ea1MF12AdFcZcpRNFsw==} engines: {node: '>=14.18.0'} - '@inquirer/editor@4.2.9': - resolution: {integrity: sha512-8HjOppAxO7O4wV1ETUlJFg6NDjp/W2NP5FB9ZPAcinAlNT4ZIWOLe2pUVwmmPRSV0NMdI5r/+lflN55AwZOKSw==} + '@inquirer/editor@4.2.10': + resolution: {integrity: sha512-5GVWJ+qeI6BzR6TIInLP9SXhWCEcvgFQYmcRG6d6RIlhFjM5TyG18paTGBgRYyEouvCmzeco47x9zX9tQEofkw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -430,8 +423,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@4.0.11': - resolution: {integrity: sha512-OZSUW4hFMW2TYvX/Sv+NnOZgO8CHT2TU1roUCUIF2T+wfw60XFRRp9MRUPCT06cRnKL+aemt2YmTWwt7rOrNEA==} + '@inquirer/expand@4.0.12': + resolution: {integrity: sha512-jV8QoZE1fC0vPe6TnsOfig+qwu7Iza1pkXoUJ3SroRagrt2hxiL+RbM432YAihNR7m7XnU0HWl/WQ35RIGmXHw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -443,8 +436,8 @@ packages: resolution: {integrity: sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==} engines: {node: '>=18'} - '@inquirer/input@4.1.8': - resolution: {integrity: sha512-WXJI16oOZ3/LiENCAxe8joniNp8MQxF6Wi5V+EBbVA0ZIOpFcL4I9e7f7cXse0HJeIPCWO8Lcgnk98juItCi7Q==} + '@inquirer/input@4.1.9': + resolution: {integrity: sha512-mshNG24Ij5KqsQtOZMgj5TwEjIf+F2HOESk6bjMwGWgcH5UBe8UoljwzNFHqdMbGYbgAf6v2wU/X9CAdKJzgOA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -452,8 +445,8 @@ packages: '@types/node': optional: true - '@inquirer/number@3.0.11': - resolution: {integrity: sha512-pQK68CsKOgwvU2eA53AG/4npRTH2pvs/pZ2bFvzpBhrznh8Mcwt19c+nMO7LHRr3Vreu1KPhNBF3vQAKrjIulw==} + '@inquirer/number@3.0.12': + resolution: {integrity: sha512-7HRFHxbPCA4e4jMxTQglHJwP+v/kpFsCf2szzfBHy98Wlc3L08HL76UDiA87TOdX5fwj2HMOLWqRWv9Pnn+Z5Q==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -461,8 +454,8 @@ packages: '@types/node': optional: true - '@inquirer/password@4.0.11': - resolution: {integrity: sha512-dH6zLdv+HEv1nBs96Case6eppkRggMe8LoOTl30+Gq5Wf27AO/vHFgStTVz4aoevLdNXqwE23++IXGw4eiOXTg==} + '@inquirer/password@4.0.12': + resolution: {integrity: sha512-FlOB0zvuELPEbnBYiPaOdJIaDzb2PmJ7ghi/SVwIHDDSQ2K4opGBkF+5kXOg6ucrtSUQdLhVVY5tycH0j0l+0g==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -470,8 +463,8 @@ packages: '@types/node': optional: true - '@inquirer/prompts@7.4.0': - resolution: {integrity: sha512-EZiJidQOT4O5PYtqnu1JbF0clv36oW2CviR66c7ma4LsupmmQlUwmdReGKRp456OWPWMz3PdrPiYg3aCk3op2w==} + '@inquirer/prompts@7.4.1': + resolution: {integrity: sha512-UlmM5FVOZF0gpoe1PT/jN4vk8JmpIWBlMvTL8M+hlvPmzN89K6z03+IFmyeu/oFCenwdwHDr2gky7nIGSEVvlA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -479,8 +472,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@4.0.11': - resolution: {integrity: sha512-uAYtTx0IF/PqUAvsRrF3xvnxJV516wmR6YVONOmCWJbbt87HcDHLfL9wmBQFbNJRv5kCjdYKrZcavDkH3sVJPg==} + '@inquirer/rawlist@4.0.12': + resolution: {integrity: sha512-wNPJZy8Oc7RyGISPxp9/MpTOqX8lr0r+lCCWm7hQra+MDtYRgINv1hxw7R+vKP71Bu/3LszabxOodfV/uTfsaA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -488,8 +481,8 @@ packages: '@types/node': optional: true - '@inquirer/search@3.0.11': - resolution: {integrity: sha512-9CWQT0ikYcg6Ls3TOa7jljsD7PgjcsYEM0bYE+Gkz+uoW9u8eaJCRHJKkucpRE5+xKtaaDbrND+nPDoxzjYyew==} + '@inquirer/search@3.0.12': + resolution: {integrity: sha512-H/kDJA3kNlnNIjB8YsaXoQI0Qccgf0Na14K1h8ExWhNmUg2E941dyFPrZeugihEa9AZNW5NdsD/NcvUME83OPQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -497,8 +490,8 @@ packages: '@types/node': optional: true - '@inquirer/select@4.1.0': - resolution: {integrity: sha512-z0a2fmgTSRN+YBuiK1ROfJ2Nvrpij5lVN3gPDkQGhavdvIVGHGW29LwYZfM/j42Ai2hUghTI/uoBuTbrJk42bA==} + '@inquirer/select@4.1.1': + resolution: {integrity: sha512-IUXzzTKVdiVNMA+2yUvPxWsSgOG4kfX93jOM4Zb5FgujeInotv5SPIJVeXQ+fO4xu7tW8VowFhdG5JRmmCyQ1Q==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -510,8 +503,8 @@ packages: resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} engines: {node: '>=18'} - '@inquirer/type@3.0.5': - resolution: {integrity: sha512-ZJpeIYYueOz/i/ONzrfof8g89kNdO2hjGuvULROo3O8rlB2CRtSseE5KeirnyE4t/thAn/EwvS/vuQeJCn+NZg==} + '@inquirer/type@3.0.6': + resolution: {integrity: sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -558,8 +551,8 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@napi-rs/wasm-runtime@0.2.7': - resolution: {integrity: sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==} + '@napi-rs/wasm-runtime@0.2.8': + resolution: {integrity: sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==} '@noble/ciphers@0.5.3': resolution: {integrity: sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w==} @@ -601,9 +594,11 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nostr-dev-kit/ndk@2.12.2': - resolution: {integrity: sha512-uvautgwbpk3AgddoFpew67/FiaV/zpKwwvSnjCvbE/tAdJBpUUS+VjWR5WfUnJvxTy/ZZpPW+X2TkwVFHhUdvA==} + '@nostr-dev-kit/ndk@2.13.0': + resolution: {integrity: sha512-e3wwHDP4PQW18Ps80WirJRWL4J3MLVCxao6pgmcmwLy7kYzar8ovM7CNr4H0i5ig5I04l081G2/BrzYl9xKlqA==} engines: {node: '>=16'} + peerDependencies: + nostr-tools: ^2.7.1 '@npmcli/fs@1.1.1': resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} @@ -613,66 +608,61 @@ packages: engines: {node: '>=10'} deprecated: This functionality has been moved to @npmcli/fs - '@oxc-resolver/binding-darwin-arm64@5.0.0': - resolution: {integrity: sha512-zwHAf+owoxSWTDD4dFuwW+FkpaDzbaL30H5Ltocb+RmLyg4WKuteusRLKh5Y8b/cyu7UzhxM0haIqQjyqA1iuA==} + '@oxc-resolver/binding-darwin-arm64@5.1.1': + resolution: {integrity: sha512-q+3DkqeB9EZze9t29iW6fQOOitIfA3/P5tnxrRPrx5T/OS8hc5EZtXfx9NZc+BcrD2URrs9KJc6lPV1o7mXQLA==} cpu: [arm64] os: [darwin] - '@oxc-resolver/binding-darwin-x64@5.0.0': - resolution: {integrity: sha512-1lS3aBNVjVQKBvZdHm13+8tSjvu2Tl1Cv4FnUyMYxqx6+rsom2YaOylS5LhDUwfZu0zAgpLMwK6kGpF/UPncNg==} + '@oxc-resolver/binding-darwin-x64@5.1.1': + resolution: {integrity: sha512-njuegc3m/6Fos+HdN0zRTRDa00sAm9zFp6a6Sp5s9LiUATvwu7mIvNW4kZedqlWCjBrLT2PaFb6tawt9XnpM5g==} cpu: [x64] os: [darwin] - '@oxc-resolver/binding-freebsd-x64@5.0.0': - resolution: {integrity: sha512-q9sRd68wC1/AJ0eu6ClhxlklVfe8gH4wrUkSyEbIYTZ8zY5yjsLY3fpqqsaCvWJUx65nW+XtnAxCGCi5AXr1Mw==} + '@oxc-resolver/binding-freebsd-x64@5.1.1': + resolution: {integrity: sha512-aA5WeaBOkLdLKnXWbUMcCG0IBSD6E+VOg35VuQXmyam7W/PsS0e3Ma7mu4tAXhMVPRjwpEuf+32t4dJCRIdZ1A==} cpu: [x64] os: [freebsd] - '@oxc-resolver/binding-linux-arm-gnueabihf@5.0.0': - resolution: {integrity: sha512-catYavWsvqViYnCveQjhrK6yVYDEPFvIOgGLxnz5r2dcgrjpmquzREoyss0L2QG/J5HTTbwqwZ1kk+g56hE/1A==} + '@oxc-resolver/binding-linux-arm-gnueabihf@5.1.1': + resolution: {integrity: sha512-H/TiZV7ADrBl3fDBxfRya4mTtqWI0kXHHN3e7o2FxUURDMcQ3x4jKkNY1mdQa9Dunelq6secB/gK/om6DUJPLw==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm64-gnu@5.0.0': - resolution: {integrity: sha512-l/0pWoQM5kVmJLg4frQ1mKZOXgi0ex/hzvFt8E4WK2ifXr5JgKFUokxsb/oat7f5YzdJJh5r9p+qS/t3dA26Aw==} + '@oxc-resolver/binding-linux-arm64-gnu@5.1.1': + resolution: {integrity: sha512-EBAyNMiclf6kQ3ualnXbnh1VtVu9NBSbwhsYsRsX+1f2yIhLB+9CjDK0r6JQdDzI2anyTElsks5fvMj82INWtQ==} cpu: [arm64] os: [linux] - '@oxc-resolver/binding-linux-arm64-musl@5.0.0': - resolution: {integrity: sha512-bx0oz/oaAW4FGYqpIIxJCnmgb906YfMhTEWCJvYkxjpEI8VKLJEL3PQevYiqDq36SA0yRLJ/sQK2fqry8AFBfA==} + '@oxc-resolver/binding-linux-arm64-musl@5.1.1': + resolution: {integrity: sha512-4hfXER7bn1zHSoM+Ef/DSlqZw8QecRFDqw7Mk3n2FBz2TCrjtaxIDdvhWvENF3M1KdByeuDkWTzbBW2UjCL+JQ==} cpu: [arm64] os: [linux] - '@oxc-resolver/binding-linux-x64-gnu@5.0.0': - resolution: {integrity: sha512-4PH++qbSIhlRsFYdN1P9neDov4OGhTGo5nbQ1D7AL6gWFLo3gdZTc00FM2y8JjeTcPWEXkViZuwpuc0w5i6qHg==} + '@oxc-resolver/binding-linux-x64-gnu@5.1.1': + resolution: {integrity: sha512-4PVnKH7xHnhh2l+sW/Bz37dqyGAehTbfsL2f/Ma+o+gem/wRgTDV1kZYfj6D+L6zTEbnVjAUe7yASepI30zH0g==} cpu: [x64] os: [linux] - '@oxc-resolver/binding-linux-x64-musl@5.0.0': - resolution: {integrity: sha512-mLfQFpX3/5y9oWi0b+9FbWDkL2hM0Y29653beCHiHxAdGyVgb2DsJbK74WkMTwtSz9by8vyBh8jGPZcg1yLZbQ==} + '@oxc-resolver/binding-linux-x64-musl@5.1.1': + resolution: {integrity: sha512-RjveVoOy14v7zhQCHQQH5gYtAlFJ4Edb9j9NdgUzDsFC+IxsfMZA5XcVn/5lSfU0zr5GggHu+kphFRK7ubAPKw==} cpu: [x64] os: [linux] - '@oxc-resolver/binding-wasm32-wasi@5.0.0': - resolution: {integrity: sha512-uEhsAZSo65qsRi6+IfBTEUUFbjg7T2yruJeLYpFfEATpm3ory5Mgo5vx3L0c2/Cz1OUZXBgp3A8x6VMUB2jT2A==} + '@oxc-resolver/binding-wasm32-wasi@5.1.1': + resolution: {integrity: sha512-SAJHuyc8dOb03xLwy/Kisd3K18f0k4kJvDsrDr5XtGPxp2sA6TGK4pz8KQfYh6fZRsmRD6Ht3WJEZCXI/yGBtQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-resolver/binding-win32-arm64-msvc@5.0.0': - resolution: {integrity: sha512-8DbSso9Jp1ns8AYuZFXdRfAcdJrzZwkFm/RjPuvAPTENsm685dosBF8G6gTHQlHvULnk6o3sa9ygZaTGC/UoEw==} + '@oxc-resolver/binding-win32-arm64-msvc@5.1.1': + resolution: {integrity: sha512-8jRQB5p8EH5fPyWuyQQDfM+xF+o1MUEGh/QB+ei6lW0YSowW4AaDNn+mKBFe53oVblm/2weWDJxgkzbOu2M5sA==} cpu: [arm64] os: [win32] - '@oxc-resolver/binding-win32-x64-msvc@5.0.0': - resolution: {integrity: sha512-ylppfPEg63NuRXOPNsXFlgyl37JrtRn0QMO26X3K3Ytp5HtLrMreQMGVtgr30e1l2YmAWqhvmKlCryOqzGPD/g==} + '@oxc-resolver/binding-win32-x64-msvc@5.1.1': + resolution: {integrity: sha512-6mAb2EMZCK1ajgyIUOV5QkGpMte7Cgsjl/xaYzjUGwTzjNAsPUFcCxm6SQJb6EGvsWzgxOyphlWbjvxmhLc3Cg==} cpu: [x64] os: [win32] - '@puppeteer/browsers@2.6.1': - resolution: {integrity: sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==} - engines: {node: '>=18'} - hasBin: true - '@redis/bloom@1.2.0': resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==} peerDependencies: @@ -736,68 +726,68 @@ packages: '@swc-node/sourcemap-support@0.5.1': resolution: {integrity: sha512-JxIvIo/Hrpv0JCHSyRpetAdQ6lB27oFYhv0PKCNf1g2gUXOjpeR1exrXccRxLMuAV5WAmGFBwRnNOJqN38+qtg==} - '@swc/core-darwin-arm64@1.11.10': - resolution: {integrity: sha512-FWwYyhUu+xRXldXHw4CBP6M0rXQs9gnE5/qodsb+cyOJaTHI8kU6FJtwaC0PiOVxjREdg/DoTrXS4sZUiL881A==} + '@swc/core-darwin-arm64@1.11.16': + resolution: {integrity: sha512-l6uWMU+MUdfLHCl3dJgtVEdsUHPskoA4BSu0L1hh9SGBwPZ8xeOz8iLIqZM27lTuXxL4KsYH6GQR/OdQ/vhLtg==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.11.10': - resolution: {integrity: sha512-NKQ62w81TGR5YAidV3KF7CDY0nu62OWmz6Hl/mB/i8Cd9xPc+MnLwdY1cJOU/DsrU4YnRFSaOfBF4Fx4mKLWxA==} + '@swc/core-darwin-x64@1.11.16': + resolution: {integrity: sha512-TH0IW8Ao1WZ4ARFHIh29dAQHYBEl4YnP74n++rjppmlCjY+8v3s5nXMA7IqxO3b5LVHyggWtU4+46DXTyMJM7g==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.11.10': - resolution: {integrity: sha512-1Vu+ZjoR7M8ShIf0Koi+B1OJ6DsU7jd4Py743KCgKlabvLFrv/uahp5fPJ1kyAUTxFE5d37qWqWLl5NkYDmDtQ==} + '@swc/core-linux-arm-gnueabihf@1.11.16': + resolution: {integrity: sha512-2IxD9t09oNZrbv37p4cJ9cTHMUAK6qNiShi9s2FJ9LcqSnZSN4iS4hvaaX6KZuG54d58vWnMU7yycjkdOTQcMg==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.11.10': - resolution: {integrity: sha512-mP26821Auyqa+Dce8gFlH4GxxbJ8xJU8H5/iIU8ObK12ulmK75G2VdILoc3gFDKfx3K7IqQkfokW3PAGI9X2Vg==} + '@swc/core-linux-arm64-gnu@1.11.16': + resolution: {integrity: sha512-AYkN23DOiPh1bf3XBf/xzZQDKSsgZTxlbyTyUIhprLJpAAAT0ZCGAUcS5mHqydk0nWQ13ABUymodvHoroutNzw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.11.10': - resolution: {integrity: sha512-XZ61quwNgTqvbMqpFAa6/ZqoErabocHUHMWQHyShxbqM2nkP1sBe6EgODX6mNSzLn0u+KDVRyQUy9ratt+xbFw==} + '@swc/core-linux-arm64-musl@1.11.16': + resolution: {integrity: sha512-n/nWXDRCIhM51dDGELfBcTMNnCiFatE7LDvsbYxb7DJt1HGjaCNvHHCKURb/apJTh/YNtWfgFap9dbsTgw8yPA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.11.10': - resolution: {integrity: sha512-BwohorC2nkak8YQuS6IH/70XkhBjqmPbL7KT0NKmr4sstRe52I3F5Vbo30xBckpvT8ZRPvjmjK3FvJ2Rf3PRmw==} + '@swc/core-linux-x64-gnu@1.11.16': + resolution: {integrity: sha512-xr182YQrF47n7Awxj+/ruI21bYw+xO/B26KFVnb+i3ezF9NOhqoqTX+33RL1ZLA/uFTq8ksPZO/y+ZVS/odtQA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.11.10': - resolution: {integrity: sha512-bCaEJVB1+5KscAolNfL6qd3I1bVovhNDShutrTlNXNvjqNavWrX8z8ZfSJ3oK6CvrBzFR6fjCSqkoD+ckKBYBA==} + '@swc/core-linux-x64-musl@1.11.16': + resolution: {integrity: sha512-k2JBfiwWfXCIKrBRjFO9/vEdLSYq0QLJ+iNSLdfrejZ/aENNkbEg8O7O2GKUSb30RBacn6k8HMfJrcPLFiEyCQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.11.10': - resolution: {integrity: sha512-Gq4svadhEVP7xClzsV8W2/8R/kfEUbJJKIS2fj8hb9lM6/AVs/PVmDiLGye6cYfVpQzkdDsJLm8r4yhSAIFsFQ==} + '@swc/core-win32-arm64-msvc@1.11.16': + resolution: {integrity: sha512-taOb5U+abyEhQgex+hr6cI48BoqSvSdfmdirWcxprIEUBHCxa1dSriVwnJRAJOFI9T+5BEz88by6rgbB9MjbHA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.11.10': - resolution: {integrity: sha512-RkZYTY0pQiHgcoFJwZoFZiEWw4WB/XVLp+y90l4Ar1nnoQQNmfb4FyvWYZbDQgrMGP0Wj5WhZuMXzW12/qI5Kg==} + '@swc/core-win32-ia32-msvc@1.11.16': + resolution: {integrity: sha512-b7yYggM9LBDiMY+XUt5kYWvs5sn0U3PXSOGvF3CbLufD/N/YQiDcYON2N3lrWHYL8aYnwbuZl45ojmQHSQPcdA==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.11.10': - resolution: {integrity: sha512-clDl+oAl6YLsqZiGb8NzpEXTdIzCTPCJSRFCeHIldjLlsAs+qsqItry2r2xSAKU1pFv4D7j9WgJmVVxOPgs/Jg==} + '@swc/core-win32-x64-msvc@1.11.16': + resolution: {integrity: sha512-/ibq/YDc3B5AROkpOKPGxVkSyCKOg+ml8k11RxrW7FAPy6a9y5y9KPcWIqV74Ahq4RuaMNslTQqHWAGSm0xJsQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.11.10': - resolution: {integrity: sha512-Si27CiYwqJSF3K0HgxugQnjHNfH7YqqD89V+fLpyRHr81uTmCQpF0bnVdRMQ2SGAkCFJACYETRiBSrZOQ660+Q==} + '@swc/core@1.11.16': + resolution: {integrity: sha512-wgjrJqVUss8Lxqilg0vkiE0tkEKU3mZkoybQM1Ehy+PKWwwB6lFAwKi20cAEFlSSWo8jFR8hRo19ZELAoLDowg==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '*' @@ -808,8 +798,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/types@0.1.19': - resolution: {integrity: sha512-WkAZaAfj44kh/UFdAQcrMP1I0nwRqpt27u+08LMBYMqmQfwwMofYoMh/48NGkMMRfC4ynpfwRbJuu8ErfNloeA==} + '@swc/types@0.1.21': + resolution: {integrity: sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==} '@tootallnate/once@1.1.2': resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} @@ -824,8 +814,8 @@ packages: '@types/accepts@1.3.7': resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} - '@types/better-sqlite3@7.6.12': - resolution: {integrity: sha512-fnQmj8lELIj7BSrZQAdBMHEHX8OZLYIHXqAKT1O7tDfLxaINzf00PMjw22r3N/xXh0w/sGHlO6SVaCQ2mj78lg==} + '@types/better-sqlite3@7.6.13': + resolution: {integrity: sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==} '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} @@ -845,8 +835,8 @@ packages: '@types/express-serve-static-core@5.0.6': resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} - '@types/express@5.0.0': - resolution: {integrity: sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==} + '@types/express@5.0.1': + resolution: {integrity: sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ==} '@types/follow-redirects@1.14.4': resolution: {integrity: sha512-GWXfsD0Jc1RWiFmMuMFCpXMzi9L7oPDVwxUnZdg89kDNnqsRfUKXEtUYtA98A6lig1WXH/CYY/fvPW9HuN5fTA==} @@ -896,8 +886,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.17.24': - resolution: {integrity: sha512-d7fGCyB96w9BnWQrOsJtpyiSaBcAYYr75bnK6ZRjDbql2cGLj/3GsL5OYmLPNq76l7Gf2q4Rv9J2o6h5CrD9sA==} + '@types/node@20.17.30': + resolution: {integrity: sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg==} '@types/proxy-from-env@1.0.4': resolution: {integrity: sha512-TPR9/bCZAr3V1eHN4G3LD3OLicdJjqX1QRXWuNcCYgE66f/K8jO2ZRtHxI2D9MbnuUP6+qiKSS8eUHp6TFHGCw==} @@ -917,11 +907,8 @@ packages: '@types/wrap-ansi@3.0.0': resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} - '@types/ws@8.18.0': - resolution: {integrity: sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==} - - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -977,9 +964,6 @@ packages: argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -995,40 +979,12 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - axios@1.8.3: - resolution: {integrity: sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==} - - b4a@1.6.7: - resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + axios@1.8.4: + resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.5.4: - resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} - - bare-fs@4.0.1: - resolution: {integrity: sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==} - engines: {bare: '>=1.7.0'} - - bare-os@3.6.0: - resolution: {integrity: sha512-BUrFS5TqSBdA0LwHop4OjPJwisqxGy6JsWVqV6qaFoe965qqtaKfDzHY5T2YA1gUL0ZeeQeA+4BBc1FJTcHiPw==} - engines: {bare: '>=1.14.0'} - - bare-path@3.0.0: - resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - - bare-stream@2.6.5: - resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} - peerDependencies: - bare-buffer: '*' - bare-events: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - bare-events: - optional: true - base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -1069,9 +1025,6 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -1097,10 +1050,6 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -1119,11 +1068,6 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - chromium-bidi@0.11.0: - resolution: {integrity: sha512-6CJWHkNRoyZyjV9Rwv2lYONZf1Xm0IuDyNq97nwSsxxP3wf5Bwy15K5rOvVKMtJ127jJBmxFUanSAOjgFRxgrA==} - peerDependencies: - devtools-protocol: '*' - ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -1143,10 +1087,6 @@ packages: cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - cluster-key-slot@1.1.2: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} @@ -1198,15 +1138,6 @@ packages: core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1286,9 +1217,6 @@ packages: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} - devtools-protocol@0.0.1367902: - resolution: {integrity: sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1328,9 +1256,6 @@ packages: err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -1347,8 +1272,8 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - esbuild@0.25.1: - resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} + esbuild@0.25.2: + resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} engines: {node: '>=18'} hasBin: true @@ -1396,14 +1321,6 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - - fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -1411,9 +1328,6 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fetch-blob@3.2.0: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} @@ -1512,10 +1426,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - get-uri@6.0.4: resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} engines: {node: '>= 14'} @@ -1625,10 +1535,6 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - import2@1.0.3: resolution: {integrity: sha512-X7KHNp1fovFaiah9Q+njdxXJKIV9/XippWGZwHL9ZdJYnQPBs+4wLd4PuCigbxz2IWNm5YvFycSjRA/1lgmdGw==} @@ -1660,8 +1566,8 @@ packages: resolution: {integrity: sha512-mlzwCTiXDX1Cw4yJL5PCq32k23XYLTK8K6BDFoL1a76iJeFB5ul6IoMU9spgdDagl2SM7P6ZaCNjj8VNXRDPOQ==} engines: {node: '>=16'} - inquirer@12.5.0: - resolution: {integrity: sha512-aiBBq5aKF1k87MTxXDylLfwpRwToShiHrSv4EmB07EYyLgmnjEz5B3rn0aGw1X3JA/64Ngf2T54oGwc+BCsPIQ==} + inquirer@12.5.2: + resolution: {integrity: sha512-qoDk/vdSTIaXNXAoNnlg7ubexpJfUo7t8GT2vylxvE49BrLhToFuPPdMViidG2boHV7+AcP1TCkJs/+PPoF2QQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1677,9 +1583,6 @@ packages: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -1736,17 +1639,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} @@ -1755,9 +1651,6 @@ packages: engines: {node: '>=4'} hasBin: true - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -1796,9 +1689,6 @@ packages: light-bolt11-decoder@3.2.0: resolution: {integrity: sha512-3QEofgiBOP4Ehs9BI+RkZdXZNtSys0nsJ6fyGeSiAGCBsMwHGUDS/JQlY/sTnWs91A2Nh0S9XXfA8Sy9g6QpuQ==} - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -1842,8 +1732,8 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime@4.0.6: - resolution: {integrity: sha512-4rGt7rvQHBbaSOF9POGkk1ocRP16Md1x36Xma8sz8h8/vfCUI2OtEIeCqe4Ofes853x4xDoPiFLIT47J5fI/7A==} + mime@4.0.7: + resolution: {integrity: sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==} engines: {node: '>=16'} hasBin: true @@ -1889,9 +1779,6 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} - mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -1986,8 +1873,8 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - nostr-tools@2.11.0: - resolution: {integrity: sha512-kRtXI9j5f45NvIcdJacQ0UEAfEb7p/jhZqhAGLQWtUd5idZJPYdSyR8hdw+MmpGH4TCMH5plZrXzFltIIZrkEA==} + nostr-tools@2.12.0: + resolution: {integrity: sha512-pUWEb020gTvt1XZvTa8AKNIHWFapjsv2NKyk43Ez2nnvz6WSXsrTFE0XtkNLSRBjPn6EpxumKeNiVzLz74jNSA==} peerDependencies: typescript: '>=5.0.0' peerDependenciesMeta: @@ -2032,8 +1919,8 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - oxc-resolver@5.0.0: - resolution: {integrity: sha512-66fopyAqCN8Mx4tzNiBXWbk8asCSuxUWN62gwTc3yfRs7JfWhX/eVJCf+fUrfbNOdQVOWn+o8pAKllp76ysMXA==} + oxc-resolver@5.1.1: + resolution: {integrity: sha512-qULiQdBx8F/yruWxkvcf6FddWD3hcle3M11r6bX4L6qd6hQ6aBT7AboI21md86spJPHZWdmQT3UV/n9+T+kb8Q==} p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} @@ -2074,14 +1961,6 @@ packages: package-manager-detector@0.2.11: resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -2105,9 +1984,6 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2119,8 +1995,8 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} pkg-fetch@3.4.2: @@ -2188,17 +2064,8 @@ packages: pump@3.0.2: resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} - puppeteer-core@23.11.1: - resolution: {integrity: sha512-3HZ2/7hdDKZvZQ7dhhITOUg4/wOrDRjyK2ZBllRB0ZCOi9u0cwq1ACHDjBB+nX+7+kltHjQvBRdeY7+W0T+7Gg==} - engines: {node: '>=18'} - - puppeteer@23.11.1: - resolution: {integrity: sha512-53uIX3KR5en8l7Vd8n5DUv90Ae9QDQsyIthaUFVzwV6yU750RjqRznEtNMBT20VthqAdemnJN+hxVdmMHKt7Zw==} - engines: {node: '>=18'} - hasBin: true - - quansync@0.2.8: - resolution: {integrity: sha512-4+saucphJMazjt7iOM27mbFCk+D9dd/zmgMDCzRZ8MEoBfYp7lAvoN38et/phRQF6wOPMy/OROBGgoWeSKyluA==} + quansync@0.2.10: + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2232,10 +2099,6 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -2374,9 +2237,6 @@ packages: stream-meter@1.0.4: resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} - streamx@2.22.0: - resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -2414,16 +2274,10 @@ packages: tar-fs@2.1.2: resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} - tar-fs@3.0.8: - resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} - tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} - tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -2432,12 +2286,6 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - text-decoder@1.2.3: - resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} - - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -2485,20 +2333,14 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - typed-query-selector@2.12.0: - resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} - typescript-lru-cache@2.0.0: resolution: {integrity: sha512-Jp57Qyy8wXeMkdNuZiglE6v2Cypg13eDA1chHwDG6kq51X7gk4K7P7HaDdzZKCxkegXkVHNcPD0n5aW6OZH3aA==} - typescript@5.8.2: - resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true - unbzip2-stream@1.4.3: - resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} @@ -2589,21 +2431,10 @@ packages: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - ylru@1.4.0: resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} engines: {node: '>= 4.0.0'} @@ -2612,17 +2443,8 @@ packages: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - snapshots: - '@babel/code-frame@7.26.2': - dependencies: - '@babel/helper-validator-identifier': 7.25.9 - js-tokens: 4.0.0 - picocolors: 1.1.1 - '@babel/generator@7.18.2': dependencies: '@babel/types': 7.19.0 @@ -2637,7 +2459,7 @@ snapshots: dependencies: '@babel/types': 7.19.0 - '@babel/runtime@7.26.10': + '@babel/runtime@7.27.0': dependencies: regenerator-runtime: 0.14.1 @@ -2647,7 +2469,7 @@ snapshots: '@babel/helper-validator-identifier': 7.25.9 to-fast-properties: 2.0.0 - '@cashu/cashu-ts@2.2.2': + '@cashu/cashu-ts@2.4.1': dependencies: '@cashu/crypto': 0.3.4 '@noble/curves': 1.8.1 @@ -2804,13 +2626,13 @@ snapshots: human-id: 4.1.1 prettier: 2.8.8 - '@emnapi/core@1.3.1': + '@emnapi/core@1.4.0': dependencies: '@emnapi/wasi-threads': 1.0.1 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.3.1': + '@emnapi/runtime@1.4.0': dependencies: tslib: 2.8.1 optional: true @@ -2820,105 +2642,105 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.1': + '@esbuild/aix-ppc64@0.25.2': optional: true - '@esbuild/android-arm64@0.25.1': + '@esbuild/android-arm64@0.25.2': optional: true - '@esbuild/android-arm@0.25.1': + '@esbuild/android-arm@0.25.2': optional: true - '@esbuild/android-x64@0.25.1': + '@esbuild/android-x64@0.25.2': optional: true - '@esbuild/darwin-arm64@0.25.1': + '@esbuild/darwin-arm64@0.25.2': optional: true - '@esbuild/darwin-x64@0.25.1': + '@esbuild/darwin-x64@0.25.2': optional: true - '@esbuild/freebsd-arm64@0.25.1': + '@esbuild/freebsd-arm64@0.25.2': optional: true - '@esbuild/freebsd-x64@0.25.1': + '@esbuild/freebsd-x64@0.25.2': optional: true - '@esbuild/linux-arm64@0.25.1': + '@esbuild/linux-arm64@0.25.2': optional: true - '@esbuild/linux-arm@0.25.1': + '@esbuild/linux-arm@0.25.2': optional: true - '@esbuild/linux-ia32@0.25.1': + '@esbuild/linux-ia32@0.25.2': optional: true - '@esbuild/linux-loong64@0.25.1': + '@esbuild/linux-loong64@0.25.2': optional: true - '@esbuild/linux-mips64el@0.25.1': + '@esbuild/linux-mips64el@0.25.2': optional: true - '@esbuild/linux-ppc64@0.25.1': + '@esbuild/linux-ppc64@0.25.2': optional: true - '@esbuild/linux-riscv64@0.25.1': + '@esbuild/linux-riscv64@0.25.2': optional: true - '@esbuild/linux-s390x@0.25.1': + '@esbuild/linux-s390x@0.25.2': optional: true - '@esbuild/linux-x64@0.25.1': + '@esbuild/linux-x64@0.25.2': optional: true - '@esbuild/netbsd-arm64@0.25.1': + '@esbuild/netbsd-arm64@0.25.2': optional: true - '@esbuild/netbsd-x64@0.25.1': + '@esbuild/netbsd-x64@0.25.2': optional: true - '@esbuild/openbsd-arm64@0.25.1': + '@esbuild/openbsd-arm64@0.25.2': optional: true - '@esbuild/openbsd-x64@0.25.1': + '@esbuild/openbsd-x64@0.25.2': optional: true - '@esbuild/sunos-x64@0.25.1': + '@esbuild/sunos-x64@0.25.2': optional: true - '@esbuild/win32-arm64@0.25.1': + '@esbuild/win32-arm64@0.25.2': optional: true - '@esbuild/win32-ia32@0.25.1': + '@esbuild/win32-ia32@0.25.2': optional: true - '@esbuild/win32-x64@0.25.1': + '@esbuild/win32-x64@0.25.2': optional: true '@gar/promisify@1.1.3': optional: true - '@inquirer/checkbox@4.1.4(@types/node@20.17.24)': + '@inquirer/checkbox@4.1.5(@types/node@20.17.30)': dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.24) + '@inquirer/core': 10.1.10(@types/node@20.17.30) '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.5(@types/node@20.17.24) + '@inquirer/type': 3.0.6(@types/node@20.17.30) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 - '@inquirer/confirm@5.1.8(@types/node@20.17.24)': + '@inquirer/confirm@5.1.9(@types/node@20.17.30)': dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.24) - '@inquirer/type': 3.0.5(@types/node@20.17.24) + '@inquirer/core': 10.1.10(@types/node@20.17.30) + '@inquirer/type': 3.0.6(@types/node@20.17.30) optionalDependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 - '@inquirer/core@10.1.9(@types/node@20.17.24)': + '@inquirer/core@10.1.10(@types/node@20.17.30)': dependencies: '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.5(@types/node@20.17.24) + '@inquirer/type': 3.0.6(@types/node@20.17.30) ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -2926,13 +2748,13 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 '@inquirer/core@3.1.2': dependencies: '@inquirer/type': 1.5.5 '@types/mute-stream': 0.0.1 - '@types/node': 20.17.24 + '@types/node': 20.17.30 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -2944,95 +2766,95 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - '@inquirer/editor@4.2.9(@types/node@20.17.24)': + '@inquirer/editor@4.2.10(@types/node@20.17.30)': dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.24) - '@inquirer/type': 3.0.5(@types/node@20.17.24) + '@inquirer/core': 10.1.10(@types/node@20.17.30) + '@inquirer/type': 3.0.6(@types/node@20.17.30) external-editor: 3.1.0 optionalDependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 - '@inquirer/expand@4.0.11(@types/node@20.17.24)': + '@inquirer/expand@4.0.12(@types/node@20.17.30)': dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.24) - '@inquirer/type': 3.0.5(@types/node@20.17.24) + '@inquirer/core': 10.1.10(@types/node@20.17.30) + '@inquirer/type': 3.0.6(@types/node@20.17.30) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 '@inquirer/figures@1.0.11': {} - '@inquirer/input@4.1.8(@types/node@20.17.24)': + '@inquirer/input@4.1.9(@types/node@20.17.30)': dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.24) - '@inquirer/type': 3.0.5(@types/node@20.17.24) + '@inquirer/core': 10.1.10(@types/node@20.17.30) + '@inquirer/type': 3.0.6(@types/node@20.17.30) optionalDependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 - '@inquirer/number@3.0.11(@types/node@20.17.24)': + '@inquirer/number@3.0.12(@types/node@20.17.30)': dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.24) - '@inquirer/type': 3.0.5(@types/node@20.17.24) + '@inquirer/core': 10.1.10(@types/node@20.17.30) + '@inquirer/type': 3.0.6(@types/node@20.17.30) optionalDependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 - '@inquirer/password@4.0.11(@types/node@20.17.24)': + '@inquirer/password@4.0.12(@types/node@20.17.30)': dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.24) - '@inquirer/type': 3.0.5(@types/node@20.17.24) + '@inquirer/core': 10.1.10(@types/node@20.17.30) + '@inquirer/type': 3.0.6(@types/node@20.17.30) ansi-escapes: 4.3.2 optionalDependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 - '@inquirer/prompts@7.4.0(@types/node@20.17.24)': + '@inquirer/prompts@7.4.1(@types/node@20.17.30)': dependencies: - '@inquirer/checkbox': 4.1.4(@types/node@20.17.24) - '@inquirer/confirm': 5.1.8(@types/node@20.17.24) - '@inquirer/editor': 4.2.9(@types/node@20.17.24) - '@inquirer/expand': 4.0.11(@types/node@20.17.24) - '@inquirer/input': 4.1.8(@types/node@20.17.24) - '@inquirer/number': 3.0.11(@types/node@20.17.24) - '@inquirer/password': 4.0.11(@types/node@20.17.24) - '@inquirer/rawlist': 4.0.11(@types/node@20.17.24) - '@inquirer/search': 3.0.11(@types/node@20.17.24) - '@inquirer/select': 4.1.0(@types/node@20.17.24) + '@inquirer/checkbox': 4.1.5(@types/node@20.17.30) + '@inquirer/confirm': 5.1.9(@types/node@20.17.30) + '@inquirer/editor': 4.2.10(@types/node@20.17.30) + '@inquirer/expand': 4.0.12(@types/node@20.17.30) + '@inquirer/input': 4.1.9(@types/node@20.17.30) + '@inquirer/number': 3.0.12(@types/node@20.17.30) + '@inquirer/password': 4.0.12(@types/node@20.17.30) + '@inquirer/rawlist': 4.0.12(@types/node@20.17.30) + '@inquirer/search': 3.0.12(@types/node@20.17.30) + '@inquirer/select': 4.1.1(@types/node@20.17.30) optionalDependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 - '@inquirer/rawlist@4.0.11(@types/node@20.17.24)': + '@inquirer/rawlist@4.0.12(@types/node@20.17.30)': dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.24) - '@inquirer/type': 3.0.5(@types/node@20.17.24) + '@inquirer/core': 10.1.10(@types/node@20.17.30) + '@inquirer/type': 3.0.6(@types/node@20.17.30) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 - '@inquirer/search@3.0.11(@types/node@20.17.24)': + '@inquirer/search@3.0.12(@types/node@20.17.30)': dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.24) + '@inquirer/core': 10.1.10(@types/node@20.17.30) '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.5(@types/node@20.17.24) + '@inquirer/type': 3.0.6(@types/node@20.17.30) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 - '@inquirer/select@4.1.0(@types/node@20.17.24)': + '@inquirer/select@4.1.1(@types/node@20.17.30)': dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.24) + '@inquirer/core': 10.1.10(@types/node@20.17.30) '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.5(@types/node@20.17.24) + '@inquirer/type': 3.0.6(@types/node@20.17.30) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 '@inquirer/type@1.5.5': dependencies: mute-stream: 1.0.0 - '@inquirer/type@3.0.5(@types/node@20.17.24)': + '@inquirer/type@3.0.6(@types/node@20.17.30)': optionalDependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 '@jridgewell/gen-mapping@0.3.8': dependencies: @@ -3074,24 +2896,24 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.26.10 + '@babel/runtime': 7.27.0 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.26.10 + '@babel/runtime': 7.27.0 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 globby: 11.1.0 read-yaml-file: 1.1.0 - '@napi-rs/wasm-runtime@0.2.7': + '@napi-rs/wasm-runtime@0.2.8': dependencies: - '@emnapi/core': 1.3.1 - '@emnapi/runtime': 1.3.1 + '@emnapi/core': 1.4.0 + '@emnapi/runtime': 1.4.0 '@tybys/wasm-util': 0.9.0 optional: true @@ -3129,7 +2951,7 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@nostr-dev-kit/ndk@2.12.2(typescript@5.8.2)': + '@nostr-dev-kit/ndk@2.13.0(nostr-tools@2.12.0(typescript@5.8.3))': dependencies: '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 @@ -3137,7 +2959,7 @@ snapshots: '@scure/base': 1.2.4 debug: 4.4.0(supports-color@5.5.0) light-bolt11-decoder: 3.2.0 - nostr-tools: 2.11.0(typescript@5.8.2) + nostr-tools: 2.12.0(typescript@5.8.3) tseep: 1.3.1 typescript-lru-cache: 2.0.0 utf8-buffer: 1.0.0 @@ -3145,7 +2967,6 @@ snapshots: transitivePeerDependencies: - bufferutil - supports-color - - typescript - utf-8-validate '@npmcli/fs@1.1.1': @@ -3160,55 +2981,41 @@ snapshots: rimraf: 3.0.2 optional: true - '@oxc-resolver/binding-darwin-arm64@5.0.0': + '@oxc-resolver/binding-darwin-arm64@5.1.1': optional: true - '@oxc-resolver/binding-darwin-x64@5.0.0': + '@oxc-resolver/binding-darwin-x64@5.1.1': optional: true - '@oxc-resolver/binding-freebsd-x64@5.0.0': + '@oxc-resolver/binding-freebsd-x64@5.1.1': optional: true - '@oxc-resolver/binding-linux-arm-gnueabihf@5.0.0': + '@oxc-resolver/binding-linux-arm-gnueabihf@5.1.1': optional: true - '@oxc-resolver/binding-linux-arm64-gnu@5.0.0': + '@oxc-resolver/binding-linux-arm64-gnu@5.1.1': optional: true - '@oxc-resolver/binding-linux-arm64-musl@5.0.0': + '@oxc-resolver/binding-linux-arm64-musl@5.1.1': optional: true - '@oxc-resolver/binding-linux-x64-gnu@5.0.0': + '@oxc-resolver/binding-linux-x64-gnu@5.1.1': optional: true - '@oxc-resolver/binding-linux-x64-musl@5.0.0': + '@oxc-resolver/binding-linux-x64-musl@5.1.1': optional: true - '@oxc-resolver/binding-wasm32-wasi@5.0.0': + '@oxc-resolver/binding-wasm32-wasi@5.1.1': dependencies: - '@napi-rs/wasm-runtime': 0.2.7 + '@napi-rs/wasm-runtime': 0.2.8 optional: true - '@oxc-resolver/binding-win32-arm64-msvc@5.0.0': + '@oxc-resolver/binding-win32-arm64-msvc@5.1.1': optional: true - '@oxc-resolver/binding-win32-x64-msvc@5.0.0': + '@oxc-resolver/binding-win32-x64-msvc@5.1.1': optional: true - '@puppeteer/browsers@2.6.1': - dependencies: - debug: 4.4.0(supports-color@5.5.0) - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.5.0 - semver: 7.7.1 - tar-fs: 3.0.8 - unbzip2-stream: 1.4.3 - yargs: 17.7.2 - transitivePeerDependencies: - - bare-buffer - - supports-color - '@redis/bloom@1.2.0(@redis/client@1.6.0)': dependencies: '@redis/client': 1.6.0 @@ -3261,22 +3068,22 @@ snapshots: '@noble/hashes': 1.7.1 '@scure/base': 1.2.4 - '@swc-node/core@1.13.3(@swc/core@1.11.10)(@swc/types@0.1.19)': + '@swc-node/core@1.13.3(@swc/core@1.11.16)(@swc/types@0.1.21)': dependencies: - '@swc/core': 1.11.10 - '@swc/types': 0.1.19 + '@swc/core': 1.11.16 + '@swc/types': 0.1.21 - '@swc-node/register@1.10.10(@swc/core@1.11.10)(@swc/types@0.1.19)(typescript@5.8.2)': + '@swc-node/register@1.10.10(@swc/core@1.11.16)(@swc/types@0.1.21)(typescript@5.8.3)': dependencies: - '@swc-node/core': 1.13.3(@swc/core@1.11.10)(@swc/types@0.1.19) + '@swc-node/core': 1.13.3(@swc/core@1.11.16)(@swc/types@0.1.21) '@swc-node/sourcemap-support': 0.5.1 - '@swc/core': 1.11.10 + '@swc/core': 1.11.16 colorette: 2.0.20 debug: 4.4.0(supports-color@5.5.0) - oxc-resolver: 5.0.0 - pirates: 4.0.6 + oxc-resolver: 5.1.1 + pirates: 4.0.7 tslib: 2.8.1 - typescript: 5.8.2 + typescript: 5.8.3 transitivePeerDependencies: - '@swc/types' - supports-color @@ -3286,55 +3093,55 @@ snapshots: source-map-support: 0.5.21 tslib: 2.8.1 - '@swc/core-darwin-arm64@1.11.10': + '@swc/core-darwin-arm64@1.11.16': optional: true - '@swc/core-darwin-x64@1.11.10': + '@swc/core-darwin-x64@1.11.16': optional: true - '@swc/core-linux-arm-gnueabihf@1.11.10': + '@swc/core-linux-arm-gnueabihf@1.11.16': optional: true - '@swc/core-linux-arm64-gnu@1.11.10': + '@swc/core-linux-arm64-gnu@1.11.16': optional: true - '@swc/core-linux-arm64-musl@1.11.10': + '@swc/core-linux-arm64-musl@1.11.16': optional: true - '@swc/core-linux-x64-gnu@1.11.10': + '@swc/core-linux-x64-gnu@1.11.16': optional: true - '@swc/core-linux-x64-musl@1.11.10': + '@swc/core-linux-x64-musl@1.11.16': optional: true - '@swc/core-win32-arm64-msvc@1.11.10': + '@swc/core-win32-arm64-msvc@1.11.16': optional: true - '@swc/core-win32-ia32-msvc@1.11.10': + '@swc/core-win32-ia32-msvc@1.11.16': optional: true - '@swc/core-win32-x64-msvc@1.11.10': + '@swc/core-win32-x64-msvc@1.11.16': optional: true - '@swc/core@1.11.10': + '@swc/core@1.11.16': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.19 + '@swc/types': 0.1.21 optionalDependencies: - '@swc/core-darwin-arm64': 1.11.10 - '@swc/core-darwin-x64': 1.11.10 - '@swc/core-linux-arm-gnueabihf': 1.11.10 - '@swc/core-linux-arm64-gnu': 1.11.10 - '@swc/core-linux-arm64-musl': 1.11.10 - '@swc/core-linux-x64-gnu': 1.11.10 - '@swc/core-linux-x64-musl': 1.11.10 - '@swc/core-win32-arm64-msvc': 1.11.10 - '@swc/core-win32-ia32-msvc': 1.11.10 - '@swc/core-win32-x64-msvc': 1.11.10 + '@swc/core-darwin-arm64': 1.11.16 + '@swc/core-darwin-x64': 1.11.16 + '@swc/core-linux-arm-gnueabihf': 1.11.16 + '@swc/core-linux-arm64-gnu': 1.11.16 + '@swc/core-linux-arm64-musl': 1.11.16 + '@swc/core-linux-x64-gnu': 1.11.16 + '@swc/core-linux-x64-musl': 1.11.16 + '@swc/core-win32-arm64-msvc': 1.11.16 + '@swc/core-win32-ia32-msvc': 1.11.16 + '@swc/core-win32-x64-msvc': 1.11.16 '@swc/counter@0.1.3': {} - '@swc/types@0.1.19': + '@swc/types@0.1.21': dependencies: '@swc/counter': 0.1.3 @@ -3350,29 +3157,29 @@ snapshots: '@types/accepts@1.3.7': dependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 - '@types/better-sqlite3@7.6.12': + '@types/better-sqlite3@7.6.13': dependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.17.24 + '@types/node': 20.17.30 '@types/connect@3.4.38': dependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 '@types/content-disposition@0.5.8': {} '@types/cookies@0.9.0': dependencies: '@types/connect': 3.4.38 - '@types/express': 5.0.0 + '@types/express': 5.0.1 '@types/keygrip': 1.0.6 - '@types/node': 20.17.24 + '@types/node': 20.17.30 '@types/debug@4.1.12': dependencies: @@ -3380,21 +3187,20 @@ snapshots: '@types/express-serve-static-core@5.0.6': dependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 '@types/qs': 6.9.18 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 - '@types/express@5.0.0': + '@types/express@5.0.1': dependencies: '@types/body-parser': 1.19.5 '@types/express-serve-static-core': 5.0.6 - '@types/qs': 6.9.18 '@types/serve-static': 1.15.7 '@types/follow-redirects@1.14.4': dependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 '@types/http-assert@1.5.6': {} @@ -3429,7 +3235,7 @@ snapshots: '@types/http-errors': 2.0.4 '@types/keygrip': 1.0.6 '@types/koa-compose': 3.2.8 - '@types/node': 20.17.24 + '@types/node': 20.17.30 '@types/koa__cors@5.0.0': dependencies: @@ -3443,23 +3249,23 @@ snapshots: '@types/morgan@1.9.9': dependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 '@types/ms@2.1.0': {} '@types/mute-stream@0.0.1': dependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 '@types/node@12.20.55': {} - '@types/node@20.17.24': + '@types/node@20.17.30': dependencies: undici-types: 6.19.8 '@types/proxy-from-env@1.0.4': dependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 '@types/qs@6.9.18': {} @@ -3468,24 +3274,19 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.17.24 + '@types/node': 20.17.30 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 20.17.24 + '@types/node': 20.17.30 '@types/send': 0.17.4 '@types/wrap-ansi@3.0.0': {} - '@types/ws@8.18.0': + '@types/ws@8.18.1': dependencies: - '@types/node': 20.17.24 - - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 20.17.24 - optional: true + '@types/node': 20.17.30 abbrev@1.1.1: optional: true @@ -3544,8 +3345,6 @@ snapshots: dependencies: sprintf-js: 1.0.3 - argparse@2.0.1: {} - array-union@2.1.0: {} ast-types@0.13.4: @@ -3556,7 +3355,7 @@ snapshots: at-least-node@1.0.0: {} - axios@1.8.3(debug@4.4.0): + axios@1.8.4(debug@4.4.0): dependencies: follow-redirects: 1.15.9(debug@4.4.0) form-data: 4.0.2 @@ -3564,37 +3363,8 @@ snapshots: transitivePeerDependencies: - debug - b4a@1.6.7: {} - balanced-match@1.0.2: {} - bare-events@2.5.4: - optional: true - - bare-fs@4.0.1: - dependencies: - bare-events: 2.5.4 - bare-path: 3.0.0 - bare-stream: 2.6.5(bare-events@2.5.4) - transitivePeerDependencies: - - bare-buffer - optional: true - - bare-os@3.6.0: - optional: true - - bare-path@3.0.0: - dependencies: - bare-os: 3.6.0 - optional: true - - bare-stream@2.6.5(bare-events@2.5.4): - dependencies: - streamx: 2.22.0 - optionalDependencies: - bare-events: 2.5.4 - optional: true - base64-js@1.5.1: {} basic-auth@2.0.1: @@ -3621,12 +3391,12 @@ snapshots: blossom-client-sdk@2.1.1: dependencies: - '@cashu/cashu-ts': 2.2.2 + '@cashu/cashu-ts': 2.4.1 '@noble/hashes': 1.7.1 blossom-client-sdk@3.0.1: dependencies: - '@cashu/cashu-ts': 2.2.2 + '@cashu/cashu-ts': 2.4.1 '@noble/hashes': 1.7.1 brace-expansion@1.1.11: @@ -3638,8 +3408,6 @@ snapshots: dependencies: fill-range: 7.1.1 - buffer-crc32@0.2.13: {} - buffer-from@1.1.2: {} buffer@5.7.1: @@ -3691,8 +3459,6 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 - callsites@3.1.0: {} - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -3716,12 +3482,6 @@ snapshots: chownr@2.0.0: {} - chromium-bidi@0.11.0(devtools-protocol@0.0.1367902): - dependencies: - devtools-protocol: 0.0.1367902 - mitt: 3.0.1 - zod: 3.23.8 - ci-info@3.9.0: {} clean-stack@2.2.0: @@ -3737,12 +3497,6 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - cluster-key-slot@1.1.2: {} co@4.6.0: {} @@ -3782,15 +3536,6 @@ snapshots: core-util-is@1.0.3: {} - cosmiconfig@9.0.0(typescript@5.8.2): - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - parse-json: 5.2.0 - optionalDependencies: - typescript: 5.8.2 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -3843,8 +3588,6 @@ snapshots: detect-libc@2.0.3: {} - devtools-protocol@0.0.1367902: {} - dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -3877,15 +3620,12 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - env-paths@2.2.1: {} + env-paths@2.2.1: + optional: true err-code@2.0.3: optional: true - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -3901,33 +3641,33 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - esbuild@0.25.1: + esbuild@0.25.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.1 - '@esbuild/android-arm': 0.25.1 - '@esbuild/android-arm64': 0.25.1 - '@esbuild/android-x64': 0.25.1 - '@esbuild/darwin-arm64': 0.25.1 - '@esbuild/darwin-x64': 0.25.1 - '@esbuild/freebsd-arm64': 0.25.1 - '@esbuild/freebsd-x64': 0.25.1 - '@esbuild/linux-arm': 0.25.1 - '@esbuild/linux-arm64': 0.25.1 - '@esbuild/linux-ia32': 0.25.1 - '@esbuild/linux-loong64': 0.25.1 - '@esbuild/linux-mips64el': 0.25.1 - '@esbuild/linux-ppc64': 0.25.1 - '@esbuild/linux-riscv64': 0.25.1 - '@esbuild/linux-s390x': 0.25.1 - '@esbuild/linux-x64': 0.25.1 - '@esbuild/netbsd-arm64': 0.25.1 - '@esbuild/netbsd-x64': 0.25.1 - '@esbuild/openbsd-arm64': 0.25.1 - '@esbuild/openbsd-x64': 0.25.1 - '@esbuild/sunos-x64': 0.25.1 - '@esbuild/win32-arm64': 0.25.1 - '@esbuild/win32-ia32': 0.25.1 - '@esbuild/win32-x64': 0.25.1 + '@esbuild/aix-ppc64': 0.25.2 + '@esbuild/android-arm': 0.25.2 + '@esbuild/android-arm64': 0.25.2 + '@esbuild/android-x64': 0.25.2 + '@esbuild/darwin-arm64': 0.25.2 + '@esbuild/darwin-x64': 0.25.2 + '@esbuild/freebsd-arm64': 0.25.2 + '@esbuild/freebsd-x64': 0.25.2 + '@esbuild/linux-arm': 0.25.2 + '@esbuild/linux-arm64': 0.25.2 + '@esbuild/linux-ia32': 0.25.2 + '@esbuild/linux-loong64': 0.25.2 + '@esbuild/linux-mips64el': 0.25.2 + '@esbuild/linux-ppc64': 0.25.2 + '@esbuild/linux-riscv64': 0.25.2 + '@esbuild/linux-s390x': 0.25.2 + '@esbuild/linux-x64': 0.25.2 + '@esbuild/netbsd-arm64': 0.25.2 + '@esbuild/netbsd-x64': 0.25.2 + '@esbuild/openbsd-arm64': 0.25.2 + '@esbuild/openbsd-x64': 0.25.2 + '@esbuild/sunos-x64': 0.25.2 + '@esbuild/win32-arm64': 0.25.2 + '@esbuild/win32-ia32': 0.25.2 + '@esbuild/win32-x64': 0.25.2 escalade@3.2.0: {} @@ -3961,18 +3701,6 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - extract-zip@2.0.1: - dependencies: - debug: 4.4.0(supports-color@5.5.0) - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - - fast-fifo@1.3.2: {} - fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3985,10 +3713,6 @@ snapshots: dependencies: reusify: 1.1.0 - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 @@ -4103,10 +3827,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stream@5.2.0: - dependencies: - pump: 3.0.2 - get-uri@6.0.4: dependencies: basic-ftp: 5.0.5 @@ -4238,11 +3958,6 @@ snapshots: ignore@5.3.2: {} - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - import2@1.0.3: {} imurmurhash@0.1.4: @@ -4273,17 +3988,17 @@ snapshots: figures: 5.0.0 picocolors: 1.1.1 - inquirer@12.5.0(@types/node@20.17.24): + inquirer@12.5.2(@types/node@20.17.30): dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.24) - '@inquirer/prompts': 7.4.0(@types/node@20.17.24) - '@inquirer/type': 3.0.5(@types/node@20.17.24) + '@inquirer/core': 10.1.10(@types/node@20.17.30) + '@inquirer/prompts': 7.4.1(@types/node@20.17.30) + '@inquirer/type': 3.0.6(@types/node@20.17.30) ansi-escapes: 4.3.2 mute-stream: 2.0.0 run-async: 3.0.0 rxjs: 7.8.2 optionalDependencies: - '@types/node': 20.17.24 + '@types/node': 20.17.30 into-stream@6.0.0: dependencies: @@ -4295,8 +4010,6 @@ snapshots: jsbn: 1.1.0 sprintf-js: 1.1.3 - is-arrayish@0.2.1: {} - is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -4348,23 +4061,15 @@ snapshots: isexe@2.0.0: {} - js-tokens@4.0.0: {} - js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - jsbn@1.1.0: {} jsesc@2.5.2: {} - json-parse-even-better-errors@2.3.1: {} - jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 @@ -4443,8 +4148,6 @@ snapshots: dependencies: '@scure/base': 1.1.1 - lines-and-columns@1.2.4: {} - locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -4498,7 +4201,7 @@ snapshots: dependencies: mime-db: 1.52.0 - mime@4.0.6: {} + mime@4.0.7: {} mimic-response@3.1.0: {} @@ -4548,8 +4251,6 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 - mitt@3.0.1: {} - mkdirp-classic@0.5.3: {} mkdirp@1.0.4: {} @@ -4647,7 +4348,7 @@ snapshots: normalize-path@3.0.0: {} - nostr-tools@2.11.0(typescript@5.8.2): + nostr-tools@2.12.0(typescript@5.8.3): dependencies: '@noble/ciphers': 0.5.3 '@noble/curves': 1.2.0 @@ -4657,7 +4358,7 @@ snapshots: '@scure/bip39': 1.2.1 optionalDependencies: nostr-wasm: 0.1.0 - typescript: 5.8.2 + typescript: 5.8.3 nostr-wasm@0.1.0: optional: true @@ -4670,20 +4371,20 @@ snapshots: set-blocking: 2.0.0 optional: true - nsite-cli@0.1.16(@types/node@20.17.24)(typescript@5.8.2): + nsite-cli@0.1.16(@types/node@20.17.30)(typescript@5.8.3): dependencies: '@noble/hashes': 1.7.1 - '@nostr-dev-kit/ndk': 2.12.2(typescript@5.8.2) - axios: 1.8.3(debug@4.4.0) + '@nostr-dev-kit/ndk': 2.13.0(nostr-tools@2.12.0(typescript@5.8.3)) + axios: 1.8.4(debug@4.4.0) blossom-client-sdk: 2.1.1 commander: 13.1.0 debug: 4.4.0(supports-color@5.5.0) dotenv: 16.4.7 - inquirer: 12.5.0(@types/node@20.17.24) + inquirer: 12.5.2(@types/node@20.17.30) inquirer-autocomplete-standalone: 0.8.1 mime-types: 2.1.35 node-fetch: 3.3.2 - nostr-tools: 2.11.0(typescript@5.8.2) + nostr-tools: 2.12.0(typescript@5.8.3) proxy-agent: 6.5.0 websocket-polyfill: 1.0.0 ws: 8.18.1 @@ -4714,19 +4415,19 @@ snapshots: outdent@0.5.0: {} - oxc-resolver@5.0.0: + oxc-resolver@5.1.1: optionalDependencies: - '@oxc-resolver/binding-darwin-arm64': 5.0.0 - '@oxc-resolver/binding-darwin-x64': 5.0.0 - '@oxc-resolver/binding-freebsd-x64': 5.0.0 - '@oxc-resolver/binding-linux-arm-gnueabihf': 5.0.0 - '@oxc-resolver/binding-linux-arm64-gnu': 5.0.0 - '@oxc-resolver/binding-linux-arm64-musl': 5.0.0 - '@oxc-resolver/binding-linux-x64-gnu': 5.0.0 - '@oxc-resolver/binding-linux-x64-musl': 5.0.0 - '@oxc-resolver/binding-wasm32-wasi': 5.0.0 - '@oxc-resolver/binding-win32-arm64-msvc': 5.0.0 - '@oxc-resolver/binding-win32-x64-msvc': 5.0.0 + '@oxc-resolver/binding-darwin-arm64': 5.1.1 + '@oxc-resolver/binding-darwin-x64': 5.1.1 + '@oxc-resolver/binding-freebsd-x64': 5.1.1 + '@oxc-resolver/binding-linux-arm-gnueabihf': 5.1.1 + '@oxc-resolver/binding-linux-arm64-gnu': 5.1.1 + '@oxc-resolver/binding-linux-arm64-musl': 5.1.1 + '@oxc-resolver/binding-linux-x64-gnu': 5.1.1 + '@oxc-resolver/binding-linux-x64-musl': 5.1.1 + '@oxc-resolver/binding-wasm32-wasi': 5.1.1 + '@oxc-resolver/binding-win32-arm64-msvc': 5.1.1 + '@oxc-resolver/binding-win32-x64-msvc': 5.1.1 p-filter@2.1.0: dependencies: @@ -4771,18 +4472,7 @@ snapshots: package-manager-detector@0.2.11: dependencies: - quansync: 0.2.8 - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.26.2 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 + quansync: 0.2.10 parseurl@1.3.3: {} @@ -4796,15 +4486,13 @@ snapshots: path-type@4.0.0: {} - pend@1.2.0: {} - picocolors@1.1.1: {} picomatch@2.3.1: {} pify@4.0.1: {} - pirates@4.0.6: {} + pirates@4.0.7: {} pkg-fetch@3.4.2(encoding@0.1.13): dependencies: @@ -4909,36 +4597,7 @@ snapshots: end-of-stream: 1.4.4 once: 1.4.0 - puppeteer-core@23.11.1: - dependencies: - '@puppeteer/browsers': 2.6.1 - chromium-bidi: 0.11.0(devtools-protocol@0.0.1367902) - debug: 4.4.0(supports-color@5.5.0) - devtools-protocol: 0.0.1367902 - typed-query-selector: 2.12.0 - ws: 8.18.1 - transitivePeerDependencies: - - bare-buffer - - bufferutil - - supports-color - - utf-8-validate - - puppeteer@23.11.1(typescript@5.8.2): - dependencies: - '@puppeteer/browsers': 2.6.1 - chromium-bidi: 0.11.0(devtools-protocol@0.0.1367902) - cosmiconfig: 9.0.0(typescript@5.8.2) - devtools-protocol: 0.0.1367902 - puppeteer-core: 23.11.1 - typed-query-selector: 2.12.0 - transitivePeerDependencies: - - bare-buffer - - bufferutil - - supports-color - - typescript - - utf-8-validate - - quansync@0.2.8: {} + quansync@0.2.10: {} queue-microtask@1.2.3: {} @@ -4989,8 +4648,6 @@ snapshots: require-directory@2.1.1: {} - resolve-from@4.0.0: {} - resolve-from@5.0.0: {} resolve-path@1.4.0: @@ -5133,13 +4790,6 @@ snapshots: dependencies: readable-stream: 2.3.8 - streamx@2.22.0: - dependencies: - fast-fifo: 1.3.2 - text-decoder: 1.2.3 - optionalDependencies: - bare-events: 2.5.4 - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -5179,16 +4829,6 @@ snapshots: pump: 3.0.2 tar-stream: 2.2.0 - tar-fs@3.0.8: - dependencies: - pump: 3.0.2 - tar-stream: 3.1.7 - optionalDependencies: - bare-fs: 4.0.1 - bare-path: 3.0.0 - transitivePeerDependencies: - - bare-buffer - tar-stream@2.2.0: dependencies: bl: 4.1.0 @@ -5197,12 +4837,6 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - tar-stream@3.1.7: - dependencies: - b4a: 1.6.7 - fast-fifo: 1.3.2 - streamx: 2.22.0 - tar@6.2.1: dependencies: chownr: 2.0.0 @@ -5214,12 +4848,6 @@ snapshots: term-size@2.2.1: {} - text-decoder@1.2.3: - dependencies: - b4a: 1.6.7 - - through@2.3.8: {} - tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -5255,16 +4883,9 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typed-query-selector@2.12.0: {} - typescript-lru-cache@2.0.0: {} - typescript@5.8.2: {} - - unbzip2-stream@1.4.3: - dependencies: - buffer: 5.7.1 - through: 2.3.8 + typescript@5.8.3: {} undefsafe@2.0.5: {} @@ -5341,8 +4962,6 @@ snapshots: yargs-parser@20.2.9: {} - yargs-parser@21.1.1: {} - yargs@16.2.0: dependencies: cliui: 7.0.4 @@ -5353,23 +4972,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 20.2.9 - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - ylru@1.4.0: {} yoctocolors-cjs@2.1.2: {} - - zod@3.23.8: {} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ce391bcaa9a673b13aa4c373c4a884d8d4f6bdf7 GIT binary patch literal 15406 zcmeHOd2m(L8Gl$i`d3G%)0zHNnW?f^ThUru717pdYk`io7CNo8b!vfVA+!vFh(*Xk z2$8+UBtXc*zK0N&7n}mctgw2G6tYjlAUw^-ocP{t6ckf%0mx$AxnJ?$ObHC;H zoqO(Czc?Iy9N%y}^pFF2Uq{IO4#%?&hof)bj^6_wb~qAIH)xRac|V6E`#TQD0PsKr z5*_u(x;=@=bD+_n@iz1i)IVbd1og>xkdS*#PM*bP9S|78`izfO%97V3W!WF1q@}4v z>DfFfQPr`YwDkA0q^|rH?L4Vxpr4r@h0KWp6}T%7cHjoqXJ|naVc*YzU1HSUzn^k|BS7Po6~maGZ+{;zzQz ze|+r$L!O29wl--+d$u$-$=3Ii#g}|Z!Br(+TUIUeo_|lS9WRuf5o=WYM?XD5>ML&X zxvhOIPn-J|q{;O!E=ky9W0emJUz*Cccb9j0fAa@VmM!lkO6II}k~Vp{#QfynhW{tl zeXg*X-ybT5;P;&k6B1;>;3@LyZ)V8p?Z+f>WVA#Kct_ce{q=M?xiMSWCNE@+{=@f( z-`y?7xXfS<5O??`m_N0QXkN7 zK?$G(=$Zwf3jxw8$nFI#2EF93_uzdPlnGlM10{ZRHBlGRO6Yme8xB0b545|h_Pod^ z`>;QPKq>!a-et*{zCtqobC-6NX3iAw|WANCJg*@v<|cvh;FTlqih2me%ahUQ_uZCYxe_K$SdKId5X#6Ic%uC0FS z_YWUCZGXjE3*61i(Utpp%zkFndJp?ok6!FC`}yfdJnXkNx5&KbCi%n=jP|d-UhZL^ z6_*d6lh{{3lJNc^9XPNiGs@0&b64%pe_^t*RLuk4t) zTGBsAk>pWxmH%98Gj-Pf*~~ALy!p@RjH5=s;~JSMapY{H&O8p(6j!L{owa}I?);(j z@J~%~rRw_;=y!RW539XM}wgKmH zo$UPQn2cw(^AGnM+h?qjGdqvVjWgGzwzOL6Zq`Wor5o6j9F?^ppIF*vdsJR2)8>iO za{h7J_c{NX->E<4+>||rZ5CkP+x+Ww{lWP!d&w^OmPPP9@AJR zJPUaJ+1}ocv93vtd2PVu?yswPNwPF-ssumR-@Bm4wc*?p1@hCWD-|+c*WVfj__+TV z4!L;Heo#Ir(EUdqWZ3x@fre<^y?Jj7+)FLMa}pfUI^F{Ho|B*vdQ)!;bfE<>);|b( zlw&@KXILXae-09jfSzHX7eIYM-|PZZ7g6ZCAH;Lq9L!rKpej%;s2d}*p{RO*~Q{K6j}An+~FAtmViQ&ChZ(St&b{eXEt!t(4V$BW$=3ilfk197M1 zJTLJ#5AQct?L{;W_^=7(`+WHTo~OavaUtgvEc!~Oicl2tnKMH*6!V|el{@^b!EYa*P`LWf(X@B77 z0sCNI_`x$8ybWd$zVL_l3z3?VO0$SjK9!aeto~C2rN8urAK2dob$s|v6u$8DzPt%% zZdU1R=80h8XP+3_9r$_weFx_SR_RL4`FkFJ(w}0ipsTvlv)3hZpy%12-I!ypcN>4Y zt^K#*F3&FUEHmcE|LW8`=qdb1QhA(Wop=VyI{+n=^`lCpfA4I3`;UC`IM z@*3PTR4J;%_uWugtL_}GpC}aGg~mM75kJ-4_-A8HUAVu%z!!`HW3T7~*U#OJpM9aq z=I*q!zOb+Hdnf*buIuNZ&tGvvXR5n3JFM(0hZ8@OxM5+k^6v`~yHaHIHO4#gyT5^N z`@-H+lD{=qPHoAN?4_Bq;KeEG`#6%i*Q`3|_}7n*H|zH(=cnho+*ijB50iTIbtc9b zrv7cdL_akF@qQgKp!&Pj`I%kE%{qgQf6x3hvwn~A&agGcI73VyKRZ#%&KD~_#wu!@ zcDdW0BIx)JCG7IRY_4FxQ0)us?9W{1aZk?stT~7awZqMN#*y;ez?6cHpK(+i6YUb? zVA-#?eV8g)b2iFN?$N+slzm3|;|+h>RftjMy*J|=7>muZhtyPeTg4Ao zTrO4P3*&OVwL71!9;P8#v#+6T0$zx(%L;0^fv#8;d8`<(Ly=V12)On#l8K#ph5SIqKu z{YPVB3`Htp$d>#rQmo=cG@rM8E@DY?lChR@#_^l&JIh7z;oH9U@8I<~KP@p9z z<5==~gqnxBS7fXS|7U^w8h1Xc-_cKn%G!5gaYkC8zH_`7o~=Gr;f4=>03#n>md4P&}Y z<_ulBfM@JbKF_Z7y8-V5pxq$rLlHdiH>o%b{2v6@I<;jrD&Cg=r{E2*o9-6y#%pZ; z=Fl+^^p)RV0DBs61ayBvA0fm0qyCWJ0W$g$>Ut{i-6w;->u;M|@j;&VcW;6|gBuq? zyu+&iRiln`VwVZJcqdp6;@urTrp=&NK>^=;S^2;^=;Hn9_dzd$cz?<}&tTo3z5!jl eKYbqfA3+|p`%^oAdh2^zptl8jTj2k_1^x$=leYx` literal 0 HcmV?d00001 diff --git a/src/blossom.ts b/src/blossom.ts index 63bd19d..cb26c3f 100644 --- a/src/blossom.ts +++ b/src/blossom.ts @@ -1,53 +1,67 @@ import { IncomingMessage } from "node:http"; -import { BLOSSOM_SERVERS, MAX_FILE_SIZE } from "./env.js"; +import { MAX_FILE_SIZE } from "./env.js"; import { makeRequestWithAbort } from "./helpers/http.js"; +import { blobURLs } from "./cache.js"; +import logger from "./logger.js"; -/** - * Downloads a file from multiple servers - * @todo download the file to /tmp and verify it - */ -export function downloadBlob(sha256: string, servers = BLOSSOM_SERVERS): Promise { - return new Promise((resolve, reject) => { - const controllers = new Map(); +const log = logger.extend("blossom"); - // make all requests in parallel - servers.forEach(async (server) => { +/** Checks all servers for a blob and returns the URLs */ +export async function findBlobURLs(sha256: string, servers: string[]): Promise { + const cache = await blobURLs.get(sha256); + if (cache) return cache; + + const urls = await Promise.all( + servers.map(async (server) => { const url = new URL(sha256, server); - const controller = new AbortController(); - let res: IncomingMessage | undefined = undefined; - controllers.set(server, controller); - try { - const response = await makeRequestWithAbort(url, controller); - res = response; + const check = await fetch(url, { method: "HEAD" }).catch(() => null); + if (check?.status === 200) return url.toString(); + else return null; + }), + ); - if (!response.statusCode) throw new Error("Missing headers or status code"); + const filtered = urls.filter((url) => url !== null); - const size = response.headers["content-length"]; - if (size && parseInt(size) > MAX_FILE_SIZE) throw new Error("File too large"); - - if (response.statusCode >= 200 && response.statusCode < 300) { - // cancel the other requests - for (const [other, abort] of controllers) { - if (other !== server) abort.abort(); - } - - controllers.delete(server); - return resolve(response); - } - } catch (error) { - controllers.delete(server); - if (res) res.resume(); - } - - // reject if last - if (controllers.size === 0) reject(new Error("Failed to find blob on servers")); - }); - - // reject if all servers don't respond in 30s - setTimeout(() => { - reject(new Error("Timeout")); - }, 30_000); - }); + log(`Found ${filtered.length}/${servers.length} URLs for ${sha256}`); + await blobURLs.set(sha256, filtered); + return filtered; +} + +/** Downloads a file from multiple servers */ +export async function streamBlob(sha256: string, servers: string[]): Promise { + if (servers.length === 0) return undefined; + + // First find all available URLs + const urls = await findBlobURLs(sha256, servers); + if (urls.length === 0) return undefined; + + // Try each URL sequentially with timeout + for (const urlString of urls) { + const controller = new AbortController(); + let res: IncomingMessage | undefined = undefined; + + try { + // Set up timeout to abort after 10s + const timeout = setTimeout(() => { + controller.abort(); + }, 10_000); + + const url = new URL(urlString); + const response = await makeRequestWithAbort(url, controller); + res = response; + clearTimeout(timeout); + + if (!response.statusCode) throw new Error("Missing headers or status code"); + + const size = response.headers["content-length"]; + if (size && parseInt(size) > MAX_FILE_SIZE) throw new Error("File too large"); + + if (response.statusCode >= 200 && response.statusCode < 300) return response; + } catch (error) { + if (res) res.resume(); + continue; // Try next URL if this one fails + } + } } diff --git a/src/cache.ts b/src/cache.ts index d229e81..c4d2596 100644 --- a/src/cache.ts +++ b/src/cache.ts @@ -1,13 +1,18 @@ import Keyv from "keyv"; import { CACHE_PATH, CACHE_TIME } from "./env.js"; +import logger from "./logger.js"; + +const log = logger.extend("cache"); async function createStore() { if (!CACHE_PATH || CACHE_PATH === "in-memory") return undefined; else if (CACHE_PATH.startsWith("redis://")) { const { default: KeyvRedis } = await import("@keyv/redis"); + log(`Using redis cache at ${CACHE_PATH}`); return new KeyvRedis(CACHE_PATH); } else if (CACHE_PATH.startsWith("sqlite://")) { const { default: KeyvSqlite } = await import("@keyv/sqlite"); + log(`Using sqlite cache at ${CACHE_PATH}`); return new KeyvSqlite(CACHE_PATH); } } @@ -15,7 +20,7 @@ async function createStore() { const store = await createStore(); store?.on("error", (err) => { - console.log("Connection Error", err); + log("Connection Error", err); process.exit(1); }); @@ -42,9 +47,16 @@ export const userRelays = new Keyv({ ttl: CACHE_TIME * 1000, }); -/** A cache that maps a pubkey + path to blossom servers that had the blob ( pubkey/path -> servers ) */ -export const pathServers = new Keyv({ +/** A cache that maps a pubkey + path to sha256 hash of the blob ( pubkey/path -> sha256 ) */ +export const pathBlobs = new Keyv({ ...opts, namespace: "paths", ttl: CACHE_TIME * 1000, }); + +/** A cache that maps a sha256 hash to a set of URLs that had the blob ( sha256 -> URLs ) */ +export const blobURLs = new Keyv({ + ...opts, + namespace: "blobs", + ttl: CACHE_TIME * 1000, +}); diff --git a/src/env.ts b/src/env.ts index be211f6..841f560 100644 --- a/src/env.ts +++ b/src/env.ts @@ -16,7 +16,6 @@ const BLOSSOM_SERVERS = process.env.BLOSSOM_SERVERS?.split(",").map((u) => u.tri const MAX_FILE_SIZE = process.env.MAX_FILE_SIZE ? xbytes.parseSize(process.env.MAX_FILE_SIZE) : Infinity; -const NGINX_CACHE_DIR = process.env.NGINX_CACHE_DIR; const CACHE_PATH = process.env.CACHE_PATH; const CACHE_TIME = process.env.CACHE_TIME ? parseInt(process.env.CACHE_TIME) : 60 * 60; @@ -28,9 +27,6 @@ const NSITE_HOST = process.env.NSITE_HOST || "0.0.0.0"; const NSITE_PORT = process.env.NSITE_PORT ? parseInt(process.env.NSITE_PORT) : 3000; const HOST = `${NSITE_HOST}:${NSITE_PORT}`; -const ENABLE_SCREENSHOTS = process.env.ENABLE_SCREENSHOTS === "true"; -const SCREENSHOTS_DIR = process.env.SCREENSHOTS_DIR || "./screenshots"; - const ONION_HOST = process.env.ONION_HOST; export { @@ -40,7 +36,6 @@ export { LOOKUP_RELAYS, BLOSSOM_SERVERS, MAX_FILE_SIZE, - NGINX_CACHE_DIR, CACHE_PATH, PAC_PROXY, TOR_PROXY, @@ -48,8 +43,6 @@ export { NSITE_HOST, NSITE_PORT, HOST, - ENABLE_SCREENSHOTS, - SCREENSHOTS_DIR, ONION_HOST, CACHE_TIME, }; diff --git a/src/events.ts b/src/events.ts index fc1ac90..8ee0fe2 100644 --- a/src/events.ts +++ b/src/events.ts @@ -2,6 +2,7 @@ import { extname, join } from "path"; import { NSITE_KIND } from "./const.js"; import { requestEvents } from "./nostr.js"; +/** Returns all the `d` tags that should be searched for a given path */ export function getSearchPaths(path: string) { const paths = [path]; @@ -24,13 +25,21 @@ export function parseNsiteEvent(event: { pubkey: string; tags: string[][]; creat }; } -export async function getNsiteBlobs(pubkey: string, path: string, relays: string[]) { +/** Returns the first blob found for a given path */ +export async function getNsiteBlob( + pubkey: string, + path: string, + relays: string[], +): Promise<{ sha256: string; path: string; created_at: number } | undefined> { // NOTE: hack, remove "/" paths since it breaks some relays const paths = getSearchPaths(path).filter((p) => p !== "/"); const events = await requestEvents(relays, { kinds: [NSITE_KIND], "#d": paths, authors: [pubkey] }); - return Array.from(events) + // Sort the found blobs by the order of the paths array + const blobs = Array.from(events) .map(parseNsiteEvent) .filter((e) => !!e) .sort((a, b) => paths.indexOf(a.path) - paths.indexOf(b.path)); + + return blobs[0]; } diff --git a/src/index.ts b/src/index.ts index ccc6fe6..2360f3e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,23 +2,21 @@ import "./polyfill.js"; import Koa from "koa"; import serve from "koa-static"; -import path, { basename } from "node:path"; +import path from "node:path"; import cors from "@koa/cors"; import fs from "node:fs"; import { fileURLToPath } from "node:url"; import mime from "mime"; import morgan from "koa-morgan"; -import send from "koa-send"; import { npubEncode } from "nostr-tools/nip19"; import { spawn } from "node:child_process"; import { nip19 } from "nostr-tools"; import { resolveNpubFromHostname } from "./helpers/dns.js"; -import { getNsiteBlobs } from "./events.js"; -import { downloadBlob } from "./blossom.js"; +import { getNsiteBlob } from "./events.js"; +import { streamBlob } from "./blossom.js"; import { BLOSSOM_SERVERS, - ENABLE_SCREENSHOTS, HOST, NSITE_HOMEPAGE, NSITE_HOMEPAGE_DIR, @@ -31,6 +29,7 @@ import { userDomains, userRelays, userServers } from "./cache.js"; import pool, { getUserBlossomServers, getUserOutboxes } from "./nostr.js"; import logger from "./logger.js"; import { watchInvalidation } from "./invalidation.js"; +import { NSITE_KIND } from "./const.js"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); @@ -84,69 +83,51 @@ app.use(async (ctx, next) => { const log = logger.extend(npub); ctx.state.pubkey = pubkey; - let relays = await userRelays.get(pubkey); - // fetch relays if not in cache - if (!relays) { - log(`Fetching relays`); - - relays = await getUserOutboxes(pubkey); - if (relays) { - await userRelays.set(pubkey, relays); - log(`Found ${relays.length} relays`); - } else { - relays = []; - await userServers.set(pubkey, [], 30_000); - log(`Failed to find relays`); - } - } + const relays = (await getUserOutboxes(pubkey)) || []; // always check subscription relays relays.push(...SUBSCRIPTION_RELAYS); - if (relays.length === 0) throw new Error("No nostr relays"); + if (relays.length === 0) throw new Error("No relays found"); - log(`Searching for ${ctx.path}`); - let blobs = await getNsiteBlobs(pubkey, ctx.path, relays); + // fetch servers and events in parallel + let [servers, event] = await Promise.all([ + getUserBlossomServers(pubkey, relays).then((s) => s || []), + (async () => { + let e = await getNsiteBlob(pubkey, ctx.path, relays); - if (blobs.length === 0) { - // fallback to custom 404 page - log(`Looking for custom 404 page`); - blobs = await getNsiteBlobs(pubkey, "/404.html", relays); - } + // fallback to custom 404 page + if (!e) { + log(`Looking for custom 404 page`); + e = await getNsiteBlob(pubkey, "/404.html", relays); + } - if (blobs.length === 0) { - log(`Found 0 events`); + return e; + })(), + ]); + + if (!event) { + log(`Found 0 events for ${ctx.path}`); ctx.status = 404; - ctx.body = "Not Found"; + ctx.body = `Not Found: no events found\npath: ${ctx.path}\nkind: ${NSITE_KIND}\npubkey: ${pubkey}\nrelays: ${relays.join(", ")}`; return; } - let servers = await userServers.get(pubkey); - - // fetch blossom servers if not in cache - if (!servers) { - log(`Fetching blossom servers`); - servers = await getUserBlossomServers(pubkey, relays); - - if (servers) { - await userServers.set(pubkey, servers); - log(`Found ${servers.length} servers`); - } else { - servers = []; - await userServers.set(pubkey, [], 30_000); - log(`Failed to find servers`); - } - } - // always fetch from additional servers servers.push(...BLOSSOM_SERVERS); - for (const blob of blobs) { - const res = await downloadBlob(blob.sha256, servers); - if (!res) continue; + if (servers.length === 0) throw new Error("Failed to find blossom servers"); - const type = mime.getType(blob.path); + try { + const res = await streamBlob(event.sha256, servers); + if (!res) { + ctx.status = 502; + ctx.body = `Failed to find blob\npath: ${event.path}\nsha256: ${event.sha256}\nservers: ${servers.join(", ")}`; + return; + } + + const type = mime.getType(event.path); if (type) ctx.set("content-type", type); else if (res.headers["content-type"]) ctx.set("content-type", res.headers["content-type"]); @@ -161,13 +142,15 @@ app.use(async (ctx, next) => { } // add cache headers - ctx.set("ETag", res.headers["etag"] || `"${blob.sha256}"`); + ctx.set("ETag", res.headers["etag"] || `"${event.sha256}"`); ctx.set("Cache-Control", "public, max-age=3600"); - ctx.set("Last-Modified", res.headers["last-modified"] || new Date(blob.created_at * 1000).toUTCString()); + ctx.set("Last-Modified", res.headers["last-modified"] || new Date(event.created_at * 1000).toUTCString()); ctx.status = 200; ctx.body = res; return; + } catch (error) { + log(`Failed to stream ${event.sha256}\n${error}`); } ctx.status = 500; @@ -185,22 +168,6 @@ if (ONION_HOST) { }); } -// get screenshots for websites -if (ENABLE_SCREENSHOTS) { - app.use(async (ctx, next) => { - if (ctx.method === "GET" && ctx.path.startsWith("/screenshot")) { - const [pubkey, etx] = basename(ctx.path).split("."); - - if (pubkey) { - const { hasScreenshot, takeScreenshot, getScreenshotPath } = await import("./screenshots.js"); - if (!(await hasScreenshot(pubkey))) await takeScreenshot(pubkey); - - await send(ctx, getScreenshotPath(pubkey)); - } else throw Error("Missing pubkey"); - } else return next(); - }); -} - // download homepage if (NSITE_HOMEPAGE) { try { diff --git a/src/invalidation.ts b/src/invalidation.ts index b4f2a05..21a4801 100644 --- a/src/invalidation.ts +++ b/src/invalidation.ts @@ -1,14 +1,13 @@ import { nip19 } from "nostr-tools"; -import { ENABLE_SCREENSHOTS, NGINX_CACHE_DIR, SUBSCRIPTION_RELAYS } from "./env.js"; +import { SUBSCRIPTION_RELAYS } from "./env.js"; import { parseNsiteEvent } from "./events.js"; import pool from "./nostr.js"; -import { invalidatePubkeyPath } from "./nginx.js"; import { NSITE_KIND } from "./const.js"; import logger from "./logger.js"; export function watchInvalidation() { - // invalidate nginx cache and screenshots on new events + // invalidate nginx cache on new events if (SUBSCRIPTION_RELAYS.length > 0) { logger(`Listening for new nsite events on: ${SUBSCRIPTION_RELAYS.join(", ")}`); @@ -18,16 +17,6 @@ export function watchInvalidation() { const nsite = parseNsiteEvent(event); if (nsite) { const log = logger.extend(nip19.npubEncode(nsite.pubkey)); - if (NGINX_CACHE_DIR) { - log(`Invalidating ${nsite.path}`); - await invalidatePubkeyPath(nsite.pubkey, nsite.path); - } - - // invalidate screenshot for nsite - if (ENABLE_SCREENSHOTS && (nsite.path === "/" || nsite.path === "/index.html")) { - const { removeScreenshot } = await import("./screenshots.js"); - await removeScreenshot(nsite.pubkey); - } } } catch (error) { console.log(`Failed to invalidate ${event.id}`); diff --git a/src/nginx.ts b/src/nginx.ts deleted file mode 100644 index 7184fc7..0000000 --- a/src/nginx.ts +++ /dev/null @@ -1,37 +0,0 @@ -import pfs from "node:fs/promises"; -import crypto from "node:crypto"; -import { join } from "node:path"; - -import { NGINX_CACHE_DIR } from "./env.js"; -import { userDomains } from "./cache.js"; - -export async function invalidatePubkeyPath(pubkey: string, path: string) { - const iterator = userDomains.iterator?.(undefined); - if (!iterator) return; - - const promises: Promise[] = []; - for await (const [domain, key] of iterator) { - if (key === pubkey) { - promises.push(invalidateNginxCache(domain, path)); - } - } - - await Promise.allSettled(promises); -} - -export async function invalidateNginxCache(host: string, path: string) { - if (!NGINX_CACHE_DIR) return Promise.resolve(false); - - try { - const key = `${host}${path}`; - const md5 = crypto.createHash("md5").update(key).digest("hex"); - - // NOTE: hard coded to cache levels 1:2 - const cachePath = join(NGINX_CACHE_DIR, md5.slice(-1), md5.slice(-3, -1), md5); - await pfs.rm(cachePath); - - console.log(`Invalidated ${key} (${md5})`); - } catch (error) { - // ignore errors - } -} diff --git a/src/nostr.ts b/src/nostr.ts index 664e105..cb268e1 100644 --- a/src/nostr.ts +++ b/src/nostr.ts @@ -2,20 +2,50 @@ import { Filter, NostrEvent, SimplePool } from "nostr-tools"; import { getServersFromServerListEvent, USER_BLOSSOM_SERVER_LIST_KIND } from "blossom-client-sdk"; import { LOOKUP_RELAYS } from "./env.js"; +import { userRelays, userServers } from "./cache.js"; +import logger from "./logger.js"; +import { npubEncode } from "nostr-tools/nip19"; const pool = new SimplePool(); +const log = logger.extend("nostr"); + +/** Fetches a pubkeys mailboxes from the cache or relays */ export async function getUserOutboxes(pubkey: string) { + const cached = await userRelays.get(pubkey); + if (cached) return cached; const mailboxes = await pool.get(LOOKUP_RELAYS, { kinds: [10002], authors: [pubkey] }); + if (!mailboxes) return; - return mailboxes.tags.filter((t) => t[0] === "r" && (t[2] === undefined || t[2] === "write")).map((t) => t[1]); + const relays = mailboxes.tags + .filter((t) => t[0] === "r" && (t[2] === undefined || t[2] === "write")) + .map((t) => t[1]); + + log(`Found ${relays.length} relays for ${npubEncode(pubkey)}`); + await userRelays.set(pubkey, relays); + + await userRelays.set(pubkey, relays); + return relays; } +/** Fetches a pubkeys blossom servers from the cache or relays */ export async function getUserBlossomServers(pubkey: string, relays: string[]) { - const blossomServersEvent = await pool.get(relays, { kinds: [USER_BLOSSOM_SERVER_LIST_KIND], authors: [pubkey] }); + const cached = await userServers.get(pubkey); + if (cached) return cached; - return blossomServersEvent ? getServersFromServerListEvent(blossomServersEvent).map((u) => u.toString()) : undefined; + const blossomServersEvent = await pool.get(relays, { kinds: [USER_BLOSSOM_SERVER_LIST_KIND], authors: [pubkey] }); + const servers = blossomServersEvent + ? getServersFromServerListEvent(blossomServersEvent).map((u) => u.toString()) + : undefined; + + // Save servers if found + if (servers) { + log(`Found ${servers.length} blossom servers for ${npubEncode(pubkey)}`); + await userServers.set(pubkey, servers); + } + + return servers; } export function requestEvents(relays: string[], filter: Filter) { diff --git a/src/screenshots.ts b/src/screenshots.ts deleted file mode 100644 index 3d73e31..0000000 --- a/src/screenshots.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { nip19 } from "nostr-tools"; -import puppeteer, { PuppeteerLaunchOptions } from "puppeteer"; -import { join } from "path"; -import pfs from "fs/promises"; -import { npubEncode } from "nostr-tools/nip19"; - -import { NSITE_PORT, SCREENSHOTS_DIR } from "./env.js"; - -try { - await pfs.mkdir(SCREENSHOTS_DIR, { recursive: true }); -} catch (error) {} - -export function getScreenshotPath(pubkey: string) { - return join(SCREENSHOTS_DIR, pubkey + ".png"); -} - -export async function hasScreenshot(pubkey: string) { - try { - await pfs.stat(getScreenshotPath(pubkey)); - return true; - } catch (error) { - return false; - } -} - -export async function takeScreenshot(pubkey: string) { - console.log(`${npubEncode(pubkey)}: Generating screenshot`); - - const opts: PuppeteerLaunchOptions = { - args: ["--no-sandbox"], - }; - if (process.env.PUPPETEER_SKIP_DOWNLOAD) opts.executablePath = "google-chrome-stable"; - - const browser = await puppeteer.launch(opts); - const page = await browser.newPage(); - const url = new URL(`http://${nip19.npubEncode(pubkey)}.localhost:${NSITE_PORT}`); - await page.goto(url.toString()); - await page.screenshot({ path: getScreenshotPath(pubkey) }); - await browser.close(); -} - -export async function removeScreenshot(pubkey: string) { - try { - await pfs.rm(getScreenshotPath(pubkey)); - console.log(`${npubEncode(pubkey)}: Removed screenshot`); - } catch (error) {} -} diff --git a/supervisord.conf b/supervisord.conf deleted file mode 100644 index 7487f9f..0000000 --- a/supervisord.conf +++ /dev/null @@ -1,23 +0,0 @@ -[supervisord] -nodaemon=true -user=root - -[program:nginx] -command=nginx -g "daemon off;" -autostart=true -autorestart=true -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 - -[program:nsite] -user=nsite -group=nsite -command=node /app -autostart=true -autorestart=true -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0